diff --git a/.gitignore b/.gitignore index e3881a2..806e43e 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,6 @@ __pycache__/ *.pyc .pytest_cache/ portfolio_state.json +node_modules/ +dist/ +.DS_Store diff --git a/index.html b/index.html new file mode 100644 index 0000000..215a6b9 --- /dev/null +++ b/index.html @@ -0,0 +1,15 @@ + + +
+ + +| Asset | +Period | +Months | +CAGR | +Volatility | +Max DD | +Total Return | +
|---|---|---|---|---|---|---|
| {ticker} | +{s.startDate} to {s.endDate} | +{s.nMonths} | += 0 ? 'var(--status-positive)' : 'var(--status-negative)' }}> + {s.cagr >= 0 ? '+' : ''}{s.cagr.toFixed(1)}% + | +{s.vol.toFixed(1)}% | +-{s.maxDD.toFixed(1)}% | +{s.cumReturn.toFixed(2)}x | +
+ {selectedAssets.length === 0 + ? 'Add assets in the Portfolio tab, then fetch returns here' + : 'Click "Fetch Returns" to load historical data from Yahoo Finance'} +
++ Select assets from the left panel or load a preset +
+Configure your portfolio and run a simulation from the Settings tab
+| Metric | +5th | +10th | +25th | +Median | +75th | +90th | +95th | +
|---|---|---|---|---|---|---|---|
| CAGR | +{fmtPct(summary.cagr.p5)} | +{fmtPct(summary.cagr.p10)} | +{fmtPct(summary.cagr.p25)} | +{fmtPct(summary.cagr.median)} | +{fmtPct(summary.cagr.p75)} | +{fmtPct(summary.cagr.p90)} | +{fmtPct(summary.cagr.p95)} | +
| Volatility | +{fmt(summary.vol.p5)}% | +{fmt(summary.vol.p10)}% | +{fmt(summary.vol.p25)}% | +{fmt(summary.vol.median)}% | +{fmt(summary.vol.p75)}% | +{fmt(summary.vol.p90)}% | +{fmt(summary.vol.p95)}% | +
| Max Drawdown | +-{fmt(summary.maxDD.p5)}% | +-{fmt(summary.maxDD.p10)}% | +-{fmt(summary.maxDD.p25)}% | +-{fmt(summary.maxDD.median)}% | +-{fmt(summary.maxDD.p75)}% | +-{fmt(summary.maxDD.p90)}% | +-{fmt(summary.maxDD.p95)}% | +
| Sharpe Ratio | +{fmt(summary.sharpe.p5, 2)} | +{fmt(summary.sharpe.p10, 2)} | +{fmt(summary.sharpe.p25, 2)} | +{fmt(summary.sharpe.median, 2)} | +{fmt(summary.sharpe.p75, 2)} | +{fmt(summary.sharpe.p90, 2)} | +{fmt(summary.sharpe.p95, 2)} | +
| Sortino Ratio | +{fmt(summary.sortino.p5, 2)} | +{fmt(summary.sortino.p10, 2)} | +{fmt(summary.sortino.p25, 2)} | +{fmt(summary.sortino.median, 2)} | +{fmt(summary.sortino.p75, 2)} | +{fmt(summary.sortino.p90, 2)} | +{fmt(summary.sortino.p95, 2)} | +
| Final Wealth | +{fmt(summary.finalMult.p5, 2)}x | +{fmt(summary.finalMult.p10, 2)}x | +{fmt(summary.finalMult.p25, 2)}x | +{fmt(summary.finalMult.median, 2)}x | +{fmt(summary.finalMult.p75, 2)}x | +{fmt(summary.finalMult.p90, 2)}x | +{fmt(summary.finalMult.p95, 2)}x | +
+ Uses historical return data from Yahoo Finance. Portfolio will be backtested over the common + available date range. +
++ Uses actual returns where available, with simulated fills for assets with shorter history. + Simulated fills are conditioned on other assets' actual performance. +
++ Define the probability-weighted mix of crisis behaviors. These affect how assets correlate + and perform during market crashes. +
+ ++ Add assets in the Portfolio tab first +
+ )} +