import%20marimo%0A%0A__generated_with%20%3D%20%220.14.17%22%0Aapp%20%3D%20marimo.App(width%3D%22medium%22)%0A%0Awith%20app.setup%3A%0A%20%20%20%20import%20cvxpy%20as%20cp%0A%20%20%20%20import%20marimo%20as%20mo%0A%20%20%20%20import%20numpy%20as%20np%0A%20%20%20%20import%20pandas%20as%20pd%0A%20%20%20%20import%20polars%20as%20pl%0A%0A%20%20%20%20from%20cvxrisk.factor%20import%20FactorModel%0A%20%20%20%20from%20cvxrisk.linalg%20import%20pca%0A%20%20%20%20from%20cvxrisk.portfolio%20import%20minrisk_problem%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20%23%20Load%20some%20historic%20stock%20prices%0A%20%20%20%20prices%20%3D%20pl.read_csv(str(mo.notebook_location()%20%2F%20%22public%22%20%2F%20%22stock_prices.csv%22)%2C%20try_parse_dates%3DTrue)%0A%0A%20%20%20%20prices%20%3D%20prices.to_pandas().set_index(%22date%22)%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_(returns)%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_(factors%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%20risk%20%3D%20model.estimate(weights).value%0A%20%20%20%20print(risk)%0A%20%20%20%20return%20(model%2C)%0A%0A%0A%40app.cell%0Adef%20_(model%2C%20prices)%3A%0A%20%20%20%20w%20%3D%20cp.Variable(20)%0A%20%20%20%20y%20%3D%20cp.Variable(10)%0A%0A%20%20%20%20problem%20%3D%20minrisk_problem(model%2C%20w%2C%20y%3Dy)%0A%20%20%20%20problem.solve(solver%3D%22CLARABEL%22)%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%20print(f%22Check%20sum%20of%20weights%3A%20%7Bnp.isclose(w.value.sum()%2C%201.0)%7D%22)%0A%20%20%20%20print(f%22Check%20all%20weights%20non-negative%3A%20%7Bnp.all(w.value%20%3E%20-0.01)%7D%22)%0A%20%20%20%20print(y.value)%0A%20%20%20%20return%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20app.run()%0A
cd8caeabbc64acaa2abf72ce200156b463426066faf63bcefc6d1f2d008ae623