get_monte_carlo

EfficientFrontier.get_monte_carlo(n=100)

Generate random rebalanced portfolios with Monte Carlo simulation.

Risk (annualized standard deviation) and return (CAGR) are calculated for random weights within bounds.

Parameters:
nint, default 100

Number of random portfolios to generate with Monte Carlo simulation.

Returns:
DataFrame

Table with Return (CAGR) and Risk values for random portfolios (portfolios with random asset weights).

Examples

>>> ls_m = ["SPY.US", "GLD.US", "PGJ.US", "RGBITR.INDX", "MCFTR.INDX"]
>>> curr_rub = "RUB"
>>> x = ok.EfficientFrontier(
...     assets=ls_m,
...     first_date="2005-01",
...     last_date="2020-11",
...     ccy=curr_rub,
...     rebalancing_strategy=ok.Rebalance(period="year"),  # set rebalancing period to one year
...     n_points=20,
...     verbose=False,
... )
>>> monte_carlo = x.get_monte_carlo(n=1000)  # it can take some time ...
>>> monte_carlo.head(5)
       CAGR      Risk
0  0.182937  0.178518
1  0.184915  0.172965
2  0.154892  0.141681
3  0.185500  0.168739
4  0.176748  0.192657

Monte Carlo simulation results can be plotted together with the optimized portfolios on the Efficient Frontier.

>>> import matplotlib.pyplot as plt
>>> df_reb_year = x.ef_points  # optimize portfolios for EF. Calculations will take some time ...
>>> fig = plt.figure()
>>> # Plot the assets points (optional).
>>> x.plot_assets(kind="cagr")
>>> ax = plt.gca()
>>> # Plot random portfolios (Monte Carlo simulation)
>>> ax.scatter(monte_carlo.Risk, monte_carlo.CAGR)
>>> # Plot the Efficient Frontier
>>> ax.plot(df_reb_year.Risk, df_reb_year.CAGR, label="Annually rebalanced")
>>> # Set the axis labels and Title
>>> ax.set_title("Multi-period Efficient Frontier & Monte Carlo simulation")
>>> ax.set_xlabel("Risk (Standard Deviation)")
>>> ax.set_ylabel("CAGR")
>>> ax.legend()
>>> plt.show()
../_images/okama-EfficientFrontier-get_monte_carlo-1.png