import%20marimo%0A%0A__generated_with%20%3D%20%220.18.4%22%0Aapp%20%3D%20marimo.App()%0A%0Awith%20app.setup%3A%0A%20%20%20%20import%20uuid%0A%0A%20%20%20%20import%20marimo%20as%20mo%0A%20%20%20%20import%20numpy%20as%20np%0A%0A%20%20%20%20from%20cvx.core.variable%20import%20Variable%0A%20%20%20%20from%20cvx.risk.factor%20import%20FactorModel%0A%20%20%20%20from%20cvx.risk.portfolio%20import%20minrisk_problem%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%20Large%20problem%20with%201000%20assets%20and%20100%20factors%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_random()%3A%0A%20%20%20%20%23%20Create%20a%20single%20random%20number%20generator%20instance%0A%20%20%20%20rng%20%3D%20np.random.default_rng(42)%0A%0A%20%20%20%20def%20random_weights(assets)%3A%0A%20%20%20%20%20%20%20%20%22%22%22Construct%20a%20vector%20of%20non-negative%20random%20weights.%20Their%20sum%20shall%20be%201.%22%22%22%0A%20%20%20%20%20%20%20%20w%20%3D%20rng.random(len(assets))%0A%20%20%20%20%20%20%20%20return%20w%20%2F%20w.sum()%0A%0A%20%20%20%20def%20random_factors(t%2C%20n%3D2%2C%20const_factor%3DTrue)%3A%0A%20%20%20%20%20%20%20%20%22%22%22Construct%20N%20random%20factor%20time%20series%20for%20T%20timestamps.%22%22%22%0A%20%20%20%20%20%20%20%20data%20%3D%20rng.standard_normal((t%2C%20n))%0A%20%20%20%20%20%20%20%20if%20const_factor%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20data%20%3D%20np.column_stack(%5Bdata%2C%20np.ones(t)%5D)%0A%20%20%20%20%20%20%20%20return%20data%0A%0A%20%20%20%20def%20random_beta(assets%2C%20factors)%3A%0A%20%20%20%20%20%20%20%20%22%22%22Construct%20a%20random%20exposure%20matrix.%22%22%22%0A%20%20%20%20%20%20%20%20return%20rng.standard_normal((factors.shape%5B1%5D%2C%20len(assets)))%0A%0A%20%20%20%20def%20random_noise(frame)%3A%0A%20%20%20%20%20%20%20%20%22%22%22Construct%20a%20frame%20of%20random%20noise%20with%20exactly%20the%20same%20dimensions%20as%20the%20input%20frame.%22%22%22%0A%20%20%20%20%20%20%20%20return%20rng.standard_normal(frame.shape)%0A%0A%20%20%20%20def%20random_assets(num)%3A%0A%20%20%20%20%20%20%20%20%22%22%22Construct%20a%20vector%20of%20random%20assets.%22%22%22%0A%20%20%20%20%20%20%20%20return%20%5Bstr(uuid.uuid4())%5B%3A7%5D%20for%20_%20in%20range(num)%5D%0A%20%20%20%20return%20random_assets%2C%20random_beta%2C%20random_factors%2C%20random_noise%0A%0A%0A%40app.cell%0Adef%20_(random_factors)%3A%0A%20%20%20%20t%20%3D%202000%0A%20%20%20%20factors%20%3D%20random_factors(t%3Dt%2C%20n%3D100%2C%20const_factor%3DFalse)%0A%20%20%20%20return%20(factors%2C)%0A%0A%0A%40app.cell%0Adef%20_(factors%2C%20random_assets%2C%20random_beta)%3A%0A%20%20%20%20beta%20%3D%20random_beta(assets%3Drandom_assets(1000)%2C%20factors%3Dfactors)%0A%20%20%20%20return%20(beta%2C)%0A%0A%0A%40app.cell%0Adef%20_(beta%2C%20factors%2C%20random_noise)%3A%0A%20%20%20%20ret%20%3D%20factors%20%40%20beta%20%2B%200.01%20*%20random_noise(factors%20%40%20beta)%0A%20%20%20%20return%20(ret%2C)%0A%0A%0A%40app.cell%0Adef%20_(ret)%3A%0A%20%20%20%20triangle%20%3D%20FactorModel(assets%3Dret.shape%5B1%5D%2C%20k%3D100)%0A%20%20%20%20return%20(triangle%2C)%0A%0A%0A%40app.cell%0Adef%20_(beta%2C%20factors%2C%20ret%2C%20triangle)%3A%0A%20%20%20%20w%20%3D%20Variable(1000)%0A%20%20%20%20y%20%3D%20Variable(100)%0A%20%20%20%20_problem%20%3D%20minrisk_problem(triangle%2C%20w%2C%20y%3Dy)%0A%20%20%20%20triangle.update(%0A%20%20%20%20%20%20%20%20exposure%3Dbeta%2C%0A%20%20%20%20%20%20%20%20cov%3Dnp.cov(factors.T)%2C%0A%20%20%20%20%20%20%20%20idiosyncratic_risk%3D(ret%20-%20factors%20%40%20beta).std(axis%3D0)%2C%0A%20%20%20%20%20%20%20%20lower_assets%3Dnp.zeros(1000)%2C%0A%20%20%20%20%20%20%20%20upper_assets%3Dnp.ones(1000)%2C%0A%20%20%20%20%20%20%20%20lower_factors%3D-0.1%20*%20np.ones(100)%2C%0A%20%20%20%20%20%20%20%20upper_factors%3D0.1%20*%20np.ones(100)%2C%0A%20%20%20%20)%0A%20%20%20%20return%20w%2C%20y%0A%0A%0A%40app.cell%0Adef%20_(beta%2C%20factors%2C%20ret%2C%20triangle%2C%20w%2C%20y)%3A%0A%20%20%20%20for%20_i%20in%20range(1)%3A%0A%20%20%20%20%20%20%20%20_problem%20%3D%20minrisk_problem(triangle%2C%20w%2C%20y%3Dy)%0A%20%20%20%20%20%20%20%20triangle.update(%0A%20%20%20%20%20%20%20%20%20%20%20%20exposure%3Dbeta%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20cov%3Dnp.cov(factors.T)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20idiosyncratic_risk%3D(ret%20-%20factors%20%40%20beta).std(axis%3D0)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20lower_assets%3Dnp.zeros(1000)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20upper_assets%3Dnp.ones(1000)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20lower_factors%3D-0.1%20*%20np.ones(100)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20upper_factors%3D0.1%20*%20np.ones(100)%2C%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20_problem.solve()%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
224801a60cfe1dd856b89449dcbf5317