import%20marimo%0A%0A__generated_with%20%3D%20%220.13.15%22%0Aapp%20%3D%20marimo.App(width%3D%22medium%22)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20marimo%20as%20mo%0A%0A%20%20%20%20return%20(mo%2C)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20matplotlib.pyplot%20as%20plt%0A%20%20%20%20import%20numpy%20as%20np%0A%20%20%20%20import%20pandas%20as%20pd%0A%0A%20%20%20%20return%20np%2C%20pd%2C%20plt%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20%23%20StackSats%20browser-safe%20notebook%20demo%0A%0A%20%20%20%20%20%20%20%20This%20demo%20intentionally%20avoids%20subprocess%20calls%2C%20CLI%20execution%2C%20network%20access%2C%0A%20%20%20%20%20%20%20%20and%20file%20writes%20so%20it%20can%20run%20in%20browser-only%20Python%20runtimes%20(Pyodide%2FWASM).%0A%0A%20%20%20%20%20%20%20%20It%20showcases%20a%20strategy-first%20DCA%20workflow%3A%0A%0A%20%20%20%20%20%20%20%20-%20generate%20a%20deterministic%20market%20dataset%20in-memory%0A%20%20%20%20%20%20%20%20-%20compute%20features%20and%20a%20dynamic%20DCA%20policy%0A%20%20%20%20%20%20%20%20-%20compare%20dynamic%20vs%20uniform%20DCA%20outcomes%0A%20%20%20%20%20%20%20%20-%20inspect%20metrics%20and%20charts%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(np%2C%20pd)%3A%0A%20%20%20%20rng%20%3D%20np.random.default_rng(42)%0A%20%20%20%20n_days%20%3D%209%20*%20365%0A%20%20%20%20dates%20%3D%20pd.date_range(%222017-01-01%22%2C%20periods%3Dn_days%2C%20freq%3D%22D%22)%0A%0A%20%20%20%20drift%20%3D%200.00055%0A%20%20%20%20cycle%20%3D%200.0009%20*%20np.sin(np.linspace(0%2C%209%20*%20np.pi%2C%20n_days))%0A%20%20%20%20shock%20%3D%20rng.normal(0.0%2C%200.012%2C%20n_days)%0A%20%20%20%20daily_returns%20%3D%20drift%20%2B%20cycle%20%2B%20shock%0A%0A%20%20%20%20price%20%3D%201200.0%20*%20np.exp(np.cumsum(daily_returns))%0A%20%20%20%20btc_df%20%3D%20pd.DataFrame(%7B%22price%22%3A%20price%7D%2C%20index%3Ddates)%0A%20%20%20%20btc_df.index.name%20%3D%20%22date%22%0A%20%20%20%20btc_df%5B%22return_1d%22%5D%20%3D%20btc_df%5B%22price%22%5D.pct_change().fillna(0.0)%0A%0A%20%20%20%20return%20(btc_df%2C)%0A%0A%0A%40app.cell%0Adef%20_(btc_df%2C%20np%2C%20pd)%3A%0A%20%20%20%20features%20%3D%20pd.DataFrame(index%3Dbtc_df.index)%0A%20%20%20%20features%5B%22price%22%5D%20%3D%20btc_df%5B%22price%22%5D%0A%20%20%20%20features%5B%22ma_60%22%5D%20%3D%20features%5B%22price%22%5D.rolling(60%2C%20min_periods%3D20).mean()%0A%20%20%20%20features%5B%22trend_signal%22%5D%20%3D%20(features%5B%22price%22%5D%20%2F%20features%5B%22ma_60%22%5D)%20-%201.0%0A%20%20%20%20features%5B%22momentum_14%22%5D%20%3D%20features%5B%22price%22%5D.pct_change(14)%0A%20%20%20%20features%5B%22volatility_21%22%5D%20%3D%20btc_df%5B%22return_1d%22%5D.rolling(21%2C%20min_periods%3D7).std()%0A%0A%20%20%20%20features%20%3D%20features.replace(%5Bnp.inf%2C%20-np.inf%5D%2C%20np.nan).fillna(0.0)%0A%20%20%20%20return%20(features%2C)%0A%0A%0A%40app.cell%0Adef%20_(btc_df%2C%20features%2C%20np%2C%20pd)%3A%0A%20%20%20%20policy_score%20%3D%20(%0A%20%20%20%20%20%20%20%20(-2.2%20*%20features%5B%22trend_signal%22%5D)%0A%20%20%20%20%20%20%20%20%2B%20(1.1%20*%20features%5B%22momentum_14%22%5D)%0A%20%20%20%20%20%20%20%20-%20(4.2%20*%20features%5B%22volatility_21%22%5D)%0A%20%20%20%20)%0A%20%20%20%20multiplier%20%3D%201.0%20%2B%200.6%20*%20np.tanh(policy_score)%0A%20%20%20%20multiplier%20%3D%20np.clip(multiplier%2C%200.40%2C%201.60)%0A%0A%20%20%20%20base_usd%20%3D%2025.0%0A%20%20%20%20simulation%20%3D%20pd.DataFrame(index%3Dbtc_df.index)%0A%20%20%20%20simulation%5B%22price%22%5D%20%3D%20btc_df%5B%22price%22%5D%0A%20%20%20%20simulation%5B%22uniform_usd%22%5D%20%3D%20base_usd%0A%20%20%20%20simulation%5B%22dynamic_usd%22%5D%20%3D%20base_usd%20*%20multiplier%0A%20%20%20%20simulation%5B%22dynamic_multiplier%22%5D%20%3D%20multiplier%0A%0A%20%20%20%20simulation%5B%22uniform_btc%22%5D%20%3D%20simulation%5B%22uniform_usd%22%5D%20%2F%20simulation%5B%22price%22%5D%0A%20%20%20%20simulation%5B%22dynamic_btc%22%5D%20%3D%20simulation%5B%22dynamic_usd%22%5D%20%2F%20simulation%5B%22price%22%5D%0A%20%20%20%20simulation%5B%22uniform_btc_cum%22%5D%20%3D%20simulation%5B%22uniform_btc%22%5D.cumsum()%0A%20%20%20%20simulation%5B%22dynamic_btc_cum%22%5D%20%3D%20simulation%5B%22dynamic_btc%22%5D.cumsum()%0A%20%20%20%20simulation%5B%22uniform_spend_cum%22%5D%20%3D%20simulation%5B%22uniform_usd%22%5D.cumsum()%0A%20%20%20%20simulation%5B%22dynamic_spend_cum%22%5D%20%3D%20simulation%5B%22dynamic_usd%22%5D.cumsum()%0A%20%20%20%20simulation%5B%22uniform_value%22%5D%20%3D%20simulation%5B%22uniform_btc_cum%22%5D%20*%20simulation%5B%22price%22%5D%0A%20%20%20%20simulation%5B%22dynamic_value%22%5D%20%3D%20simulation%5B%22dynamic_btc_cum%22%5D%20*%20simulation%5B%22price%22%5D%0A%0A%20%20%20%20%23%20Framework-like%20invariants%20for%20this%20demo%20policy.%0A%20%20%20%20assert%20bool((simulation%5B%22dynamic_usd%22%5D%20%3E%200.0).all())%0A%20%20%20%20assert%20bool(np.isfinite(simulation%5B%22dynamic_multiplier%22%5D).all())%0A%0A%20%20%20%20return%20(simulation%2C)%0A%0A%0A%40app.cell%0Adef%20_(pd%2C%20simulation)%3A%0A%20%20%20%20def%20max_drawdown_pct(series%3A%20pd.Series)%20-%3E%20float%3A%0A%20%20%20%20%20%20%20%20running_max%20%3D%20series.cummax()%0A%20%20%20%20%20%20%20%20drawdown%20%3D%20(series%20%2F%20running_max)%20-%201.0%0A%20%20%20%20%20%20%20%20return%20float(drawdown.min()%20*%20100.0)%0A%0A%20%20%20%20final_row%20%3D%20simulation.iloc%5B-1%5D%0A%20%20%20%20uniform_final_value%20%3D%20float(final_row%5B%22uniform_value%22%5D)%0A%20%20%20%20dynamic_final_value%20%3D%20float(final_row%5B%22dynamic_value%22%5D)%0A%20%20%20%20uniform_final_btc%20%3D%20float(final_row%5B%22uniform_btc_cum%22%5D)%0A%20%20%20%20dynamic_final_btc%20%3D%20float(final_row%5B%22dynamic_btc_cum%22%5D)%0A%0A%20%20%20%20value_edge_pct%20%3D%20((dynamic_final_value%20%2F%20uniform_final_value)%20-%201.0)%20*%20100.0%0A%20%20%20%20btc_edge_pct%20%3D%20((dynamic_final_btc%20%2F%20uniform_final_btc)%20-%201.0)%20*%20100.0%0A%0A%20%20%20%20monthly_values%20%3D%20simulation%5B%5B%22uniform_value%22%2C%20%22dynamic_value%22%5D%5D.resample(%22ME%22).last()%0A%20%20%20%20monthly_returns%20%3D%20monthly_values.pct_change().dropna()%0A%20%20%20%20monthly_win_rate%20%3D%20float(%0A%20%20%20%20%20%20%20%20(monthly_returns%5B%22dynamic_value%22%5D%20%3E%20monthly_returns%5B%22uniform_value%22%5D).mean()%20*%20100.0%0A%20%20%20%20)%0A%0A%20%20%20%20uniform_mdd%20%3D%20max_drawdown_pct(simulation%5B%22uniform_value%22%5D)%0A%20%20%20%20dynamic_mdd%20%3D%20max_drawdown_pct(simulation%5B%22dynamic_value%22%5D)%0A%20%20%20%20mdd_delta%20%3D%20dynamic_mdd%20-%20uniform_mdd%0A%0A%20%20%20%20demo_score%20%3D%20(0.55%20*%20value_edge_pct)%20%2B%20(0.35%20*%20(monthly_win_rate%20-%2050.0))%20-%20(%0A%20%20%20%20%20%20%20%200.10%20*%20mdd_delta%0A%20%20%20%20)%0A%0A%20%20%20%20metrics%20%3D%20pd.DataFrame(%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22Metric%22%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Final%20value%20(uniform)%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Final%20value%20(dynamic)%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Value%20edge%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22BTC%20edge%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Monthly%20win%20rate%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Max%20drawdown%20(uniform)%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Max%20drawdown%20(dynamic)%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Demo%20score%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22Value%22%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22%24%7Buniform_final_value%3A%2C.2f%7D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22%24%7Bdynamic_final_value%3A%2C.2f%7D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22%7Bvalue_edge_pct%3A.2f%7D%25%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22%7Bbtc_edge_pct%3A.2f%7D%25%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22%7Bmonthly_win_rate%3A.2f%7D%25%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22%7Buniform_mdd%3A.2f%7D%25%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22%7Bdynamic_mdd%3A.2f%7D%25%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22%7Bdemo_score%3A.2f%7D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20)%0A%0A%20%20%20%20return%20metrics%2C%20monthly_returns%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%22%23%23%20Backtest%20summary%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(metrics)%3A%0A%20%20%20%20metrics%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(plt%2C%20simulation)%3A%0A%20%20%20%20fig%2C%20axes%20%3D%20plt.subplots(3%2C%201%2C%20figsize%3D(11%2C%2011)%2C%20sharex%3DTrue)%0A%0A%20%20%20%20axes%5B0%5D.plot(simulation.index%2C%20simulation%5B%22price%22%5D%2C%20label%3D%22BTC%20price%22%2C%20color%3D%22%23F8931A%22%2C%20lw%3D1.2)%0A%20%20%20%20axes%5B0%5D.set_title(%22Synthetic%20BTC%20price%20path%22)%0A%20%20%20%20axes%5B0%5D.set_ylabel(%22Price%20(USD)%22)%0A%20%20%20%20axes%5B0%5D.grid(alpha%3D0.20)%0A%20%20%20%20axes%5B0%5D.legend(loc%3D%22upper%20left%22)%0A%0A%20%20%20%20axes%5B1%5D.plot(%0A%20%20%20%20%20%20%20%20simulation.index%2C%0A%20%20%20%20%20%20%20%20simulation%5B%22dynamic_multiplier%22%5D%2C%0A%20%20%20%20%20%20%20%20label%3D%22Dynamic%20multiplier%22%2C%0A%20%20%20%20%20%20%20%20color%3D%22%23EFD7BD%22%2C%0A%20%20%20%20%20%20%20%20lw%3D1.1%2C%0A%20%20%20%20)%0A%20%20%20%20axes%5B1%5D.axhline(1.0%2C%20color%3D%22%23A5A5B4%22%2C%20ls%3D%22--%22%2C%20lw%3D1.0%2C%20label%3D%22Uniform%20baseline%22)%0A%20%20%20%20axes%5B1%5D.set_title(%22Strategy%20output%20(multiplier%20over%20base%20daily%20DCA)%22)%0A%20%20%20%20axes%5B1%5D.set_ylabel(%22Multiplier%22)%0A%20%20%20%20axes%5B1%5D.set_ylim(0.3%2C%201.7)%0A%20%20%20%20axes%5B1%5D.grid(alpha%3D0.20)%0A%20%20%20%20axes%5B1%5D.legend(loc%3D%22upper%20left%22)%0A%0A%20%20%20%20axes%5B2%5D.plot(%0A%20%20%20%20%20%20%20%20simulation.index%2C%0A%20%20%20%20%20%20%20%20simulation%5B%22uniform_value%22%5D%2C%0A%20%20%20%20%20%20%20%20label%3D%22Uniform%20DCA%20value%22%2C%0A%20%20%20%20%20%20%20%20color%3D%22%23A5A5B4%22%2C%0A%20%20%20%20%20%20%20%20lw%3D1.0%2C%0A%20%20%20%20)%0A%20%20%20%20axes%5B2%5D.plot(%0A%20%20%20%20%20%20%20%20simulation.index%2C%0A%20%20%20%20%20%20%20%20simulation%5B%22dynamic_value%22%5D%2C%0A%20%20%20%20%20%20%20%20label%3D%22Dynamic%20DCA%20value%22%2C%0A%20%20%20%20%20%20%20%20color%3D%22%23F8931A%22%2C%0A%20%20%20%20%20%20%20%20lw%3D1.4%2C%0A%20%20%20%20)%0A%20%20%20%20axes%5B2%5D.set_title(%22Portfolio%20value%20comparison%22)%0A%20%20%20%20axes%5B2%5D.set_ylabel(%22Value%20(USD)%22)%0A%20%20%20%20axes%5B2%5D.grid(alpha%3D0.20)%0A%20%20%20%20axes%5B2%5D.legend(loc%3D%22upper%20left%22)%0A%0A%20%20%20%20fig.tight_layout()%0A%20%20%20%20fig%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%22%23%23%20Monthly%20return%20sample%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(monthly_returns)%3A%0A%20%20%20%20monthly_returns.tail(12)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20%23%23%20Notes%0A%0A%20%20%20%20%20%20%20%20-%20This%20notebook%20is%20self-contained%20and%20browser-safe%20by%20design.%0A%20%20%20%20%20%20%20%20-%20For%20full%20StackSats%20package%20%2B%20CLI%20workflows%2C%20use%3A%0A%20%20%20%20%20%20%20%20%20%20%60examples%2Fmodel_example_notebook.py%60.%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20)%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
cc157119e7c7fa7c72cf186f3b69cf7877ae6c42360d6147e9097b559688eaa5