def get_monte_carlo(self, n: int = 100) -> pd.DataFrame: """ Generate N random risk / cagr point for rebalanced portfolios. Risk and cagr are calculated for a set of random weights. """ weights_df = Float.get_random_weights(n, self.ror.shape[1]) # Portfolio risk and cagr for each set of weights portfolios_ror = weights_df.aggregate(Rebalance.rebalanced_portfolio_return_ts, ror=self.ror, period=self.reb_period) random_portfolios = pd.DataFrame() for _, data in portfolios_ror.iterrows(): risk_monthly = data.std() mean_return = data.mean() risk = Float.annualize_risk(risk_monthly, mean_return) cagr = Frame.get_cagr(data) row = { 'Risk': risk, 'CAGR': cagr } random_portfolios = random_portfolios.append(row, ignore_index=True) return random_portfolios
def get_monte_carlo(self, n: int = 100, kind: str = "mean") -> pd.DataFrame: """ Generate N random risk / cagr point for portfolios. Risk and cagr are calculated for a set of random weights. """ weights_series = Float.get_random_weights(n, self.ror.shape[1]) # Portfolio risk and return for each set of weights random_portfolios = pd.DataFrame(dtype=float) for weights in weights_series: risk_monthly = Frame.get_portfolio_risk(weights, self.ror) mean_return_monthly = Frame.get_portfolio_mean_return(weights, self.ror) risk = Float.annualize_risk(risk_monthly, mean_return_monthly) mean_return = Float.annualize_return(mean_return_monthly) if kind.lower() == "cagr": cagr = Float.approx_return_risk_adjusted(mean_return, risk) row = dict(Risk=risk, CAGR=cagr) elif kind.lower() == "mean": row = dict(Risk=risk, Return=mean_return) else: raise ValueError('kind should be "mean" or "cagr"') random_portfolios = random_portfolios.append(row, ignore_index=True) return random_portfolios