import%20marimo%0A%0A__generated_with%20%3D%20%220.9.27%22%0Aapp%20%3D%20marimo.App(width%3D%22medium%22)%0A%0A%0A%40app.cell%0Adef%20__(__file__)%3A%0A%20%20%20%20from%20pathlib%20import%20Path%0A%0A%20%20%20%20import%20cvxpy%20as%20cp%0A%20%20%20%20import%20numpy%20as%20np%0A%20%20%20%20import%20pandas%20as%20pd%0A%0A%20%20%20%20from%20cvx.portfolio.min_risk%20import%20minrisk_problem%0A%20%20%20%20from%20cvx.risk.sample%20import%20SampleCovariance%0A%20%20%20%20from%20cvx.simulator%20import%20Builder%0A%0A%20%20%20%20pd.options.plotting.backend%20%3D%20%22plotly%22%0A%0A%20%20%20%20path%20%3D%20Path(__file__).parent%0A%20%20%20%20return%20(%0A%20%20%20%20%20%20%20%20Builder%2C%0A%20%20%20%20%20%20%20%20Path%2C%0A%20%20%20%20%20%20%20%20SampleCovariance%2C%0A%20%20%20%20%20%20%20%20cp%2C%0A%20%20%20%20%20%20%20%20minrisk_problem%2C%0A%20%20%20%20%20%20%20%20np%2C%0A%20%20%20%20%20%20%20%20path%2C%0A%20%20%20%20%20%20%20%20pd%2C%0A%20%20%20%20)%0A%0A%0A%40app.cell%0Adef%20__(path%2C%20pd)%3A%0A%20%20%20%20%23%20Load%20some%20historic%20stock%20prices%0A%20%20%20%20prices%20%3D%20pd.read_csv(%0A%20%20%20%20%20%20%20%20path%20%2F%20%22data%22%20%2F%20%22stock_prices.csv%22%2C%20index_col%3D0%2C%20parse_dates%3DTrue%2C%20header%3D0%0A%20%20%20%20)%0A%0A%20%20%20%20%23%20Estimate%20a%20series%20of%20historic%20covariance%20matrices%0A%20%20%20%20returns%20%3D%20prices.pct_change().dropna(axis%3D0%2C%20how%3D%22all%22)%0A%20%20%20%20return%20prices%2C%20returns%0A%0A%0A%40app.cell%0Adef%20__(%0A%20%20%20%20Builder%2C%0A%20%20%20%20SampleCovariance%2C%0A%20%20%20%20cp%2C%0A%20%20%20%20minrisk_problem%2C%0A%20%20%20%20np%2C%0A%20%20%20%20prices%2C%0A%20%20%20%20returns%2C%0A)%3A%0A%20%20%20%20cov%20%3D%20returns.ewm(com%3D60%2C%20min_periods%3D100).cov().dropna(axis%3D0%2C%20how%3D%22all%22)%0A%20%20%20%20start%20%3D%20cov.index%5B0%5D%5B0%5D%0A%0A%20%20%20%20%23%20Establish%20a%20risk%20model%0A%20%20%20%20_risk_model%20%3D%20SampleCovariance(num%3D20)%0A%0A%20%20%20%20%23%20Perform%20the%20backtest%0A%20%20%20%20_builder%20%3D%20Builder(prices%3Dprices.truncate(before%3Dstart)%2C%20initial_aum%3D1e6)%0A%0A%20%20%20%20_w%20%3D%20cp.Variable(len(_builder.prices.columns))%0A%20%20%20%20_problem%20%3D%20minrisk_problem(_risk_model%2C%20_w)%0A%0A%20%20%20%20for%20_t%2C%20_state%20in%20_builder%3A%0A%20%20%20%20%20%20%20%20_risk_model.update(%0A%20%20%20%20%20%20%20%20%20%20%20%20cov%3Dcov.loc%5B_t%5B-1%5D%5D.values%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20lower_assets%3Dnp.zeros(20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20upper_assets%3Dnp.ones(20)%2C%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20%23%20don't%20reconstruct%20the%20problem%20in%20every%20iteration!%0A%20%20%20%20%20%20%20%20_problem.solve()%0A%0A%20%20%20%20%20%20%20%20_builder.weights%20%3D%20_w.value%0A%20%20%20%20%20%20%20%20_builder.aum%20%3D%20_state.aum%0A%0A%20%20%20%20_portfolio%20%3D%20_builder.build()%0A%0A%20%20%20%20_portfolio.nav.plot()%0A%20%20%20%20return%20cov%2C%20start%0A%0A%0A%40app.cell%0Adef%20__(Builder%2C%20cp%2C%20minrisk_problem%2C%20np%2C%20prices%2C%20returns%2C%20start)%3A%0A%20%20%20%20from%20cvx.risk.cvar%20import%20CVar%0A%0A%20%20%20%20_risk_model%20%3D%20CVar(alpha%3D0.80%2C%20n%3D40%2C%20m%3D20)%0A%0A%20%20%20%20%23%20Perform%20the%20backtest%0A%20%20%20%20_builder%20%3D%20Builder(prices%3Dprices.truncate(before%3Dstart)%2C%20initial_aum%3D1e6)%0A%0A%20%20%20%20_w%20%3D%20cp.Variable(len(_builder.prices.columns))%0A%20%20%20%20_problem%20%3D%20minrisk_problem(_risk_model%2C%20_w)%0A%0A%20%20%20%20for%20_t%2C%20_state%20in%20_builder%3A%0A%20%20%20%20%20%20%20%20_risk_model.update(%0A%20%20%20%20%20%20%20%20%20%20%20%20returns%3Dreturns.truncate(after%3D_t%5B-1%5D).tail(40).values%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20lower_assets%3Dnp.zeros(20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20upper_assets%3Dnp.ones(20)%2C%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20%23%20don't%20reconstruct%20the%20problem%20in%20every%20iteration!%0A%20%20%20%20%20%20%20%20_problem.solve()%0A%0A%20%20%20%20%20%20%20%20_builder.weights%20%3D%20_w.value%0A%20%20%20%20%20%20%20%20_builder.aum%20%3D%20_state.aum%0A%0A%20%20%20%20_portfolio%20%3D%20_builder.build()%0A%20%20%20%20_portfolio.nav.plot()%0A%20%20%20%20return%20(CVar%2C)%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20app.run()%0A
84927908f6da5097f36d2f6011f339dc19b306b11e114736e8ff408256288236