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%20cvx%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.factor%20import%20FactorModel%0A%20%20%20%20from%20cvx.risk.linalg%20import%20pca%0A%0A%20%20%20%20path%20%3D%20Path(__file__).parent%0A%20%20%20%20return%20FactorModel%2C%20Path%2C%20cvx%2C%20minrisk_problem%2C%20np%2C%20path%2C%20pca%2C%20pd%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__(pca%2C%20returns)%3A%0A%20%20%20%20factors%20%3D%20pca(returns%3Dreturns%2C%20n_components%3D10)%0A%20%20%20%20return%20(factors%2C)%0A%0A%0A%40app.cell%0Adef%20__(FactorModel%2C%20factors%2C%20np%2C%20returns)%3A%0A%20%20%20%20model%20%3D%20FactorModel(assets%3Dlen(returns.columns)%2C%20k%3D10)%0A%0A%20%20%20%20%23%20update%20the%20model%20parameters%0A%20%20%20%20model.update(%0A%20%20%20%20%20%20%20%20cov%3Dfactors.cov%2C%0A%20%20%20%20%20%20%20%20exposure%3Dfactors.exposure.values%2C%0A%20%20%20%20%20%20%20%20idiosyncratic_risk%3Dfactors.idiosyncratic.std().values%2C%0A%20%20%20%20%20%20%20%20lower_assets%3Dnp.zeros(20)%2C%0A%20%20%20%20%20%20%20%20upper_assets%3Dnp.ones(20)%2C%0A%20%20%20%20%20%20%20%20lower_factors%3D-0.1%20*%20np.ones(10)%2C%0A%20%20%20%20%20%20%20%20upper_factors%3D0.1%20*%20np.ones(10)%2C%0A%20%20%20%20)%0A%0A%20%20%20%20%23%20test%20the%20risk%20model%20with%20uniform%20weights%0A%20%20%20%20weights%20%3D%200.05%20*%20np.ones(20)%0A%20%20%20%20model.estimate(weights).value%0A%20%20%20%20return%20model%2C%20weights%0A%0A%0A%40app.cell%0Adef%20__(cvx%2C%20minrisk_problem%2C%20model%2C%20np%2C%20pd%2C%20prices)%3A%0A%20%20%20%20w%20%3D%20cvx.Variable(20)%0A%20%20%20%20y%20%3D%20cvx.Variable(10)%0A%0A%20%20%20%20problem%20%3D%20minrisk_problem(model%2C%20w%2C%20y%3Dy)%0A%20%20%20%20problem.solve()%0A%0A%20%20%20%20print(pd.Series(data%3Dw.value%2C%20index%3Dprices.columns))%0A%20%20%20%20print(model.estimate(w%2C%20y%3Dy).value)%0A%0A%20%20%20%20%23%20check%20the%20solution%0A%20%20%20%20assert%20np.isclose(w.value.sum()%2C%201.0)%0A%20%20%20%20assert%20np.all(w.value%20%3E%20-0.01)%0A%20%20%20%20print(y.value)%0A%20%20%20%20return%20problem%2C%20w%2C%20y%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20app.run()%0A
21e7c94e14d1dae5f159c1012e4a7f0231d7b6ff21b5308261575300c512d66b