import%20marimo%0A%0A__generated_with%20%3D%20%220.13.15%22%0Aapp%20%3D%20marimo.App()%0A%0Awith%20app.setup%3A%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%20%20%20%20from%20cvxsimulator%20import%20interpolate%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%20%20%20%20pd.options.plotting.backend%20%3D%20%22plotly%22%0A%0A%20%20%20%20path%20%3D%20mo.notebook_location()%20%2F%20%22public%22%20%2F%20%22Prices_hashed.csv%22%0A%20%20%20%20date_col%20%3D%20%22date%22%0A%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(%0A%20%20%20%20%20%20%20%20%5Bpl.col(col).cast(pl.Float64)%20for%20col%20in%20dframe.columns%20if%20col%20!%3D%20date_col%5D%0A%20%20%20%20)%0A%20%20%20%20prices%20%3D%20dframe.to_pandas().set_index(date_col).apply(interpolate)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%23%20CTA%205.0%20-%20Optimization%202.0%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20warnings%0A%0A%20%20%20%20%23%20Suppress%20noisy%20warnings%0A%20%20%20%20warnings.simplefilter(action%3D%22ignore%22%2C%20category%3DFutureWarning)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20from%20tinycta.linalg%20import%20inv_a_norm%2C%20solve%0A%20%20%20%20from%20tinycta.signal%20import%20osc%2C%20returns_adjust%2C%20shrink2id%0A%0A%20%20%20%20return%20inv_a_norm%2C%20osc%2C%20returns_adjust%2C%20shrink2id%2C%20solve%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20%23%20Create%20sliders%20using%20marimo's%20UI%20components%0A%20%20%20%20fast%20%3D%20mo.ui.slider(4%2C%20192%2C%20step%3D4%2C%20value%3D32%2C%20label%3D%22Fast%20Moving%20Average%22)%0A%20%20%20%20slow%20%3D%20mo.ui.slider(4%2C%20192%2C%20step%3D4%2C%20value%3D96%2C%20label%3D%22Slow%20Moving%20Average%22)%0A%20%20%20%20vola%20%3D%20mo.ui.slider(4%2C%20192%2C%20step%3D4%2C%20value%3D32%2C%20label%3D%22Volatility%22)%0A%20%20%20%20winsor%20%3D%20mo.ui.slider(1.0%2C%206.0%2C%20step%3D0.1%2C%20value%3D4.2%2C%20label%3D%22Winsorizing%22)%0A%20%20%20%20corr%20%3D%20mo.ui.slider(50%2C%20500%2C%20step%3D10%2C%20value%3D200%2C%20label%3D%22Correlation%22)%0A%20%20%20%20shrinkage%20%3D%20mo.ui.slider(0.0%2C%201.0%2C%20step%3D0.05%2C%20value%3D0.5%2C%20label%3D%22Shrinkage%22)%0A%0A%20%20%20%20%23%20Display%20the%20sliders%20in%20a%20vertical%20stack%0A%20%20%20%20mo.vstack(%5Bfast%2C%20slow%2C%20vola%2C%20winsor%2C%20corr%2C%20shrinkage%5D)%0A%0A%20%20%20%20return%20corr%2C%20shrinkage%2C%20vola%2C%20winsor%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20corr%2C%0A%20%20%20%20inv_a_norm%2C%0A%20%20%20%20osc%2C%0A%20%20%20%20returns_adjust%2C%0A%20%20%20%20shrink2id%2C%0A%20%20%20%20shrinkage%2C%0A%20%20%20%20solve%2C%0A%20%20%20%20vola%2C%0A%20%20%20%20winsor%2C%0A)%3A%0A%20%20%20%20from%20cvxsimulator%20import%20Builder%0A%0A%20%20%20%20correlation%20%3D%20corr.value%0A%0A%20%20%20%20returns_adj%20%3D%20prices.apply(returns_adjust%2C%20com%3Dvola.value%2C%20clip%3Dwinsor.value)%0A%0A%20%20%20%20%23%20DCC%20by%20Engle%0A%20%20%20%20cor%20%3D%20returns_adj.ewm(com%3Dcorrelation%2C%20min_periods%3Dcorrelation).corr()%0A%0A%20%20%20%20mu%20%3D%20np.tanh(returns_adj.cumsum().apply(osc)).values%0A%20%20%20%20vo%20%3D%20prices.pct_change().ewm(com%3Dvola.value%2C%20min_periods%3Dvola.value).std().values%0A%0A%20%20%20%20builder%20%3D%20Builder(prices%3Dprices%2C%20initial_aum%3D1e8)%0A%0A%20%20%20%20for%20n%2C%20(t%2C%20state)%20in%20enumerate(builder)%3A%0A%20%20%20%20%20%20%20%20mask%20%3D%20state.mask%0A%20%20%20%20%20%20%20%20matrix%20%3D%20shrink2id(cor.loc%5Bt%5B-1%5D%5D.values%2C%20lamb%3Dshrinkage.value)%5Bmask%2C%20%3A%5D%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%3A%2C%20mask%0A%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20%20%20%20%20expected_mu%20%3D%20np.nan_to_num(mu%5Bn%5D%5Bmask%5D)%0A%20%20%20%20%20%20%20%20expected_vo%20%3D%20np.nan_to_num(vo%5Bn%5D%5Bmask%5D)%0A%20%20%20%20%20%20%20%20risk_position%20%3D%20solve(matrix%2C%20expected_mu)%20%2F%20inv_a_norm(expected_mu%2C%20matrix)%0A%20%20%20%20%20%20%20%20builder.cashposition%20%3D%201e6%20*%20risk_position%20%2F%20expected_vo%0A%20%20%20%20%20%20%20%20builder.aum%20%3D%20state.aum%0A%0A%20%20%20%20portfolio%20%3D%20builder.build()%0A%20%20%20%20print(portfolio.sharpe())%0A%20%20%20%20return%20(portfolio%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%23%20Conclusions%0A%20%20%20%20*%20Dramatic%20relativ%20improvements%20observable%20despite%20using%20the%20same%20signals%20as%20in%20previous%20Experiment.%0A%20%20%20%20*%20Main%20difference%20here%20is%20to%20take%20advantage%20of%20cross-correlations%20in%20the%20risk%20measurement.%0A%20%20%20%20*%20Possible%20to%20add%20constraints%20on%20individual%20assets%20or%20groups%20of%20them.%0A%20%20%20%20*%20Possible%20to%20reflect%20trading%20costs%20in%20objective%20with%20regularization%20terms%20(Ridge%2C%20Lars%2C%20Elastic%20Nets%2C%20...)%0A%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(portfolio)%3A%0A%20%20%20%20portfolio.snapshot()%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
5936a4ae5b59197dbdeac2ecce94bbb9649251a2807fd7aebc33407070415038