import%20marimo%0A%0A__generated_with%20%3D%20%220.14.17%22%0Aapp%20%3D%20marimo.App()%0A%0Awith%20app.setup%3A%0A%20%20%20%20import%20uuid%0A%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%0A%20%20%20%20from%20cvxrisk.factor%20import%20FactorModel%0A%20%20%20%20from%20cvxrisk.portfolio%20import%20minrisk_problem%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%23%20Large%20problem%20with%201000%20assets%20and%20100%20factors%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%20%23%20Get%20some%20random%20weights%0A%20%20%20%20%20%20%20%20weights%20%3D%20pd.Series(index%3Dassets%2C%20data%3Drng.random(len(assets)))%0A%20%20%20%20%20%20%20%20return%20weights%20%2F%20weights.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%20factors%20%3D%20pd.DataFrame(%0A%20%20%20%20%20%20%20%20%20%20%20%20index%3Drange(1%2C%20t%20%2B%201)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20columns%3D%5Bf%22F%7Bi%7D%22%20for%20i%20in%20range(n)%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20data%3Drng.standard_normal((t%2C%20n))%2C%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%23%20add%20the%20constant%20factor%0A%20%20%20%20%20%20%20%20if%20const_factor%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20factors%5B%22const%22%5D%20%3D%201%0A%20%20%20%20%20%20%20%20return%20factors%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%20data%20%3D%20rng.standard_normal((factors.shape%5B1%5D%2C%20len(assets)))%0A%20%20%20%20%20%20%20%20return%20pd.DataFrame(columns%3Dassets%2C%20index%3Dfactors.columns%2C%20data%3Ddata)%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%20pd.DataFrame(%0A%20%20%20%20%20%20%20%20%20%20%20%20columns%3Dframe.columns%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20index%3Dframe.index%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20data%3Drng.standard_normal((frame.shape%5B0%5D%2C%20frame.shape%5B1%5D))%2C%0A%20%20%20%20%20%20%20%20)%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%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%3Dlen(ret.columns)%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%20cp.Variable(1000)%0A%20%20%20%20y%20%3D%20cp.Variable(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.values%2C%0A%20%20%20%20%20%20%20%20cov%3Dfactors.cov().values%2C%0A%20%20%20%20%20%20%20%20idiosyncratic_risk%3Dpd.DataFrame(data%3Dret%20-%20factors%20%40%20beta%2C%20index%3Dret.index%2C%20columns%3Dret.columns).std().values%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.values%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20cov%3Dfactors.cov().values%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20idiosyncratic_risk%3Dpd.DataFrame(data%3Dret%20-%20factors%20%40%20beta%2C%20index%3Dret.index%2C%20columns%3Dret.columns)%0A%20%20%20%20%20%20%20%20%20%20%20%20.std()%0A%20%20%20%20%20%20%20%20%20%20%20%20.values%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(ignore_dpp%3DTrue%2C%20solver%3D%22CLARABEL%22)%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
cefb5b1c7061c9d821b821286213a4d981fe85333efe61fbb975b8104dba3bc5