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%20from%20pathlib%20import%20Path%0A%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%20plotly.io%20as%20pio%0A%20%20%20%20import%20polars%20as%20pl%0A%0A%20%20%20%20pd.options.plotting.backend%20%3D%20%22plotly%22%0A%0A%20%20%20%20%23%20Ensure%20Plotly%20works%20with%20Marimo%0A%20%20%20%20pio.renderers.default%20%3D%20%22plotly_mimetype%22%0A%0A%20%20%20%20path%20%3D%20Path(__file__).parent%20%2F%20%22public%22%20%2F%20%22stock-prices.csv%22%0A%0A%20%20%20%20%23%20from%20cvxsimulator.builder%20import%20polars2pandas%0A%20%20%20%20date_col%20%3D%20%22date%22%0A%20%20%20%20dframe%20%3D%20pl.read_csv(str(path)%2C%20try_parse_dates%3DTrue)%0A%0A%20%20%20%20dframe%20%3D%20dframe.with_columns(pl.col(date_col).cast(pl.Datetime(%22ns%22)))%0A%20%20%20%20dframe%20%3D%20dframe.with_columns(%5Bpl.col(col).cast(pl.Float64)%20for%20col%20in%20dframe.columns%20if%20col%20!%3D%20date_col%5D)%0A%20%20%20%20prices%20%3D%20dframe.to_pandas().set_index(date_col)%0A%0A%20%20%20%20from%20cvxsimulator%20import%20Builder%0A%0A%20%20%20%20%23%20Initialize%20random%20number%20generator%20once%20to%20be%20used%20by%20all%20cells%0A%20%20%20%20rng%20%3D%20np.random.default_rng(42)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%23%20Monkey%20portfolios%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20_builder%20%3D%20Builder(prices%3Dprices%2C%20initial_aum%3D1000000.0)%0A%20%20%20%20for%20_time%2C%20_state%20in%20_builder%3A%0A%20%20%20%20%20%20%20%20_n%20%3D%20len(_state.assets)%0A%20%20%20%20%20%20%20%20_w%20%3D%20rng.random(_n)%0A%20%20%20%20%20%20%20%20_w%20%3D%20_w%20%2F%20np.sum(_w)%0A%20%20%20%20%20%20%20%20assert%20np.all(_w%20%3E%3D%200)%0A%20%20%20%20%20%20%20%20assert%20np.allclose(np.sum(_w)%2C%201)%0A%20%20%20%20%20%20%20%20_builder.weights%20%3D%20_w%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.snapshot()%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20_builder%20%3D%20Builder(prices%3Dprices%2C%20initial_aum%3D1000000.0)%0A%20%20%20%20for%20_time%2C%20_state%20in%20_builder%3A%0A%20%20%20%20%20%20%20%20_n%20%3D%20len(_state.assets)%0A%20%20%20%20%20%20%20%20_w%20%3D%20rng.random(_n)%0A%20%20%20%20%20%20%20%20_w%20%3D%20_w%20%2F%20np.sum(_w)%0A%20%20%20%20%20%20%20%20assert%20np.all(_w%20%3E%3D%200)%0A%20%20%20%20%20%20%20%20assert%20np.allclose(np.sum(_w)%2C%201)%0A%20%20%20%20%20%20%20%20_builder.weights%20%3D%20_w%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.snapshot()%0A%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
ff4fbbe6d7d595939b5693774157e8ad45112a8677bd2a40c1ac01706f522fba