etf_portfolio_research Backtest Report
Code-generated research report built from pipeline outputs. Use it to understand model behavior, assumptions, risk, and historical simulations; do not treat it as a recommendation.
Reader Guide
This opening guide is meant to make the report readable before you inspect the tables and charts. The results are conditional on the configured inputs and should be interpreted as a historical research experiment.
| topic | guidance |
|---|---|
| Purpose | Research how a rules-based ETF portfolio behaved historically under the configured data, optimizer, constraints, and rebalance policy. |
| Research-tool warning | This report is for research and education only. It is not financial advice, investment advice, tax advice, legal advice, or a recommendation to buy or sell any security. |
| Latest rebalance | 2026-03-31 |
| ETF universe size | 12 |
| Benchmark status | Primary benchmark provided |
| Metadata status | ETF metadata included |
| Price coverage status | Price coverage included |
- Start with Assumptions and Limitations so the boundaries of the report are clear.
- Check ETF Universe Summary and Data Coverage before interpreting performance.
- Compare Latest Realized Portfolio against Optimizer Target Portfolio to separate practical holdings from ideal model weights.
- Use Benchmark Comparison, Drawdown Chart, Rolling Risk Metrics, and Stress Periods together; no single chart is enough.
- Read section explanations as guardrails for what each table or chart can and cannot tell you.
Trust And Safety
How to read this section
What this shows: Common ways readers can overinterpret the report, plus safer readings to use instead.
How to interpret it: Read this before treating any optimized portfolio, metric, or backtest as a decision.
What to watch: The report is evidence under assumptions. It is not a forecast, guarantee, or personalized recommendation.
| Common False Conclusion | Safer Reading | Why It Matters | Where To Check |
|---|---|---|---|
| A high Sharpe ratio guarantees strong future returns. | A high Sharpe ratio means the portfolio earned more historical excess return per unit of historical volatility in this sample. | Sharpe ratios can fall when returns, volatility, correlations, or rates change. | Metric Dictionary, Backtest Performance, Rolling Risk Metrics |
| A good backtest proves the strategy will work. | A backtest is a historical experiment under chosen data, costs, constraints, rebalance rules, and benchmark assumptions. | Strategies can overfit the past, especially when many universes, objectives, windows, or constraints are tried. | Reader Guide, Assumptions and Limitations, Stress Periods |
| Historical mean returns are reliable forecasts. | Historical mean returns are transparent baseline estimates, not dependable predictions of future expected returns. | Mean estimates are noisy and can be dominated by sample period, regime changes, and recent winners. | Metric Dictionary, Efficient Frontier Chart, Assumptions and Limitations |
| ETF expense ratios are the only investment cost that matters. | Expense ratios matter because they compound, but real implementation can also include spreads, slippage, taxes, FX, account fees, and liquidity costs. | A low expense ratio does not automatically make an ETF cheaper to hold or trade in every investor's situation. | Weighted Expense Ratio Over Time, Assumptions and Limitations |
| Contribution-only portfolios always match optimizer targets. | Contribution-only rebalancing uses new cash to move toward targets, but realized holdings can drift when selling is restricted. | The actual simulated portfolio may carry different risks than the optimizer target, especially after large market moves. | Latest Realized Portfolio Table, Optimizer Target Portfolio Table, Realized Constraint Warnings |
Metric Dictionary
How to read this section
What this shows: Canonical plain-language definitions for metrics used by the report and pipeline.
How to interpret it: Use this as the reference point for what each metric means before comparing values.
What to watch: Metric values are only meaningful when the caveats and assumptions fit the question you are asking.
| Metric | Category | Plain-English Meaning | Formula-Level Summary | Good/Bad Interpretation | Caveats |
|---|---|---|---|---|---|
| Portfolio Weight | Portfolio Construction | The share of the portfolio allocated to one ETF or group. | Asset weight = asset market value / total portfolio value. | Weights should match the intended exposure. Very large weights indicate concentration. | A small weight can still create large risk if the asset is very volatile. |
| Expected Return | Optimization Inputs | The return estimate the optimizer uses before choosing weights. | Currently estimated from historical mean returns in the trailing training window. | Higher expected return can make an asset more attractive to the optimizer. | This is backward-looking and should not be read as a reliable return forecast. |
| Covariance | Optimization Inputs | How asset returns moved together historically. | Covariance matrix estimated from aligned asset return histories using the configured risk model. | Lower or negative covariance can improve diversification if relationships persist. | Covariance estimates can change quickly across market regimes. |
| Portfolio Return | Performance | The portfolio's percentage gain or loss over one period. | Sum of asset weight times asset return for the period. | Higher is better for a single period, all else equal. | One-period return says little about risk, consistency, or future returns. |
| Cumulative Return | Performance | How much the portfolio grew or shrank over the full path. | Compound each period: product of (1 + return) minus 1. | Higher cumulative return is better, but only after risk is checked. | Can hide severe losses or long weak stretches along the way. |
| CAGR | Performance | The annualized growth rate implied by the compounded return path. | Compound total return over the sample, then convert it to a one-year rate. | Higher CAGR is better if risk and drawdowns are acceptable. | Smooths the path into one number and can make volatile results look cleaner than they felt. |
| Annualized Volatility | Risk | How much portfolio returns fluctuated, scaled to a yearly number. | Standard deviation of periodic returns times sqrt(periods per year). | Lower volatility is usually a smoother ride. | Does not distinguish upside surprises from downside losses. |
| Portfolio Volatility | Risk | Estimated total variability of a weighted portfolio. | Square root of weights' transpose times covariance matrix times weights. | Lower estimated volatility means less modeled return variability. | Only as reliable as the covariance estimate and portfolio weights. |
| Sharpe Ratio | Risk-Adjusted Return | Return earned per unit of total volatility after the risk-free rate. | Annualized excess return divided by annualized volatility. | Higher is generally better; below zero means underperforming cash. | Penalizes upside and downside volatility equally. If volatility is zero or undefined, the pipeline reports 0.0 rather than NaN or Infinity. |
| Sortino Ratio | Risk-Adjusted Return | Return earned per unit of downside volatility. | Annualized excess return divided by annualized downside deviation. | Higher is generally better when downside risk matters most. | Can be unstable when there are few negative observations. If downside deviation is zero or undefined, the pipeline reports 0.0. |
| Max Drawdown | Drawdown | The worst historical fall from a previous peak. | Minimum value of cumulative wealth divided by its prior running peak minus 1. | Closer to zero is better. A more negative value means deeper loss. | Only captures the worst observed historical loss, not every possible loss. |
| Drawdown | Drawdown | The current decline from a previous high-water mark. | Current cumulative wealth / prior running maximum wealth minus 1. | Closer to zero is better; deeper negatives mean larger losses. | Does not show how long recovery took unless read with the full chart. |
| Calmar Ratio | Risk-Adjusted Return | Compounded return compared with the worst drawdown. | CAGR divided by absolute value of maximum drawdown. | Higher is generally better if the drawdown estimate is credible. | Very sensitive to one worst drawdown observation. If maximum drawdown is zero or undefined, the pipeline reports 0.0. |
| Turnover | Implementation | How much of the portfolio changed at rebalances on average. | Average gross traded-weight change across rebalance-to-rebalance transitions, excluding the initial allocation from cash. | Lower usually means fewer trades, lower costs, and less tax drag. | The project models costs simply; real execution and taxes can differ. |
| Average Number of Holdings | Concentration | The average count of ETFs with non-trivial portfolio weights. | Average count of weights above a small tolerance at each rebalance. | Higher can mean broader diversification. | More holdings do not guarantee better diversification if exposures overlap. |
| Largest Position | Concentration | The biggest single ETF weight observed in the portfolio history. | Maximum asset weight across all rebalance dates. | Lower usually means less single-ETF concentration. | A broad ETF can be less risky than its weight suggests; a narrow ETF can be riskier. |
| Herfindahl Concentration Index | Concentration | A concentration score based on squared portfolio weights. | Average across rebalances of the sum of squared weights. | Lower means more evenly spread weights; higher means concentration. | Does not know whether ETFs hold overlapping underlying securities. |
| Worst Month | Period Extremes | The worst compounded calendar-month return in the sample. | Compound returns by month, then take the minimum monthly return. | Closer to zero is better. | A bad period just outside month boundaries may be split across months. |
| Worst Quarter | Period Extremes | The worst compounded calendar-quarter return in the sample. | Compound returns by quarter, then take the minimum quarterly return. | Closer to zero is better. | Quarterly windows are conventional but not the only stress window that matters. |
| Best Month | Period Extremes | The best compounded calendar-month return in the sample. | Compound returns by month, then take the maximum monthly return. | Higher is better, but not if it came with unacceptable risk. | Upside extremes can make a strategy look exciting without proving robustness. |
| Beta | Benchmark Relative | How sensitive the portfolio was to benchmark moves. | Covariance of portfolio and benchmark returns divided by benchmark variance. | Beta above 1 moved more than the benchmark; below 1 moved less; near 0 moved independently. | Beta depends on the chosen benchmark and historical window. If benchmark variance is zero or undefined, the pipeline reports 0.0. |
| Alpha | Benchmark Relative | Return not explained by benchmark exposure in a simple beta model. | Portfolio CAGR minus (risk-free rate plus beta times benchmark excess return). | Higher historical alpha is better, but it is not proof of skill. | Alpha can vanish when the benchmark, period, or risk model changes. |
| Tracking Error | Benchmark Relative | How much the portfolio's returns differed from the benchmark. | Standard deviation of active returns, annualized. Active return is portfolio return minus benchmark return. | Lower means benchmark-like behavior; higher means more benchmark-relative risk. | Low tracking error is not automatically good if the benchmark is unsuitable. With fewer than two aligned observations, the pipeline reports 0.0. |
| Information Ratio | Benchmark Relative | Benchmark-relative return per unit of tracking error. | Average active return divided by active return volatility, annualized. | Higher is better for benchmark-relative strategies. | Can be unstable when tracking error is very small. If tracking error is zero or undefined, the pipeline reports 0.0. |
| Rolling Volatility | Rolling Risk | Volatility measured repeatedly over moving windows. | Rolling standard deviation of returns times sqrt(periods per year). | Stable or lower rolling volatility suggests steadier behavior. | Window length strongly affects the result. |
| Rolling Sharpe | Rolling Risk | Sharpe ratio measured repeatedly over moving windows. | Rolling mean excess return divided by rolling volatility, annualized. | Consistently positive values are better than one isolated high value. | Short windows are noisy and can flip quickly. |
| Rolling Correlation | Rolling Risk | How closely the portfolio moved with the benchmark over moving windows. | Rolling correlation between portfolio and benchmark returns. | Lower correlation can mean diversification; higher correlation means benchmark-like movement. | Correlation can rise during crises when diversification is most needed. |
| Stress-Period Return | Stress Testing | Compounded return during a named difficult historical period. | Product of (1 + return) within the stress window minus 1. | Less negative is better during market stress. | Historical stress windows do not cover every future crisis shape. |
| Weighted Expense Ratio | Cost | The portfolio-level annual ETF fee implied by current weights. | Sum of each ETF weight times its expense ratio. | Lower is usually better for similar exposures. | Does not include taxes, spreads, market impact, or broker-specific costs. |
| Return Attribution | Attribution | How much each asset or group contributed to portfolio return. | Per-period contribution is asset weight times asset return, then aggregated. | Positive contributors helped historical return; negative hurt it. | Explains past contribution and does not identify future winners. |
| Risk Attribution | Attribution | How much each asset or group contributed to portfolio volatility. | Euler decomposition using weights and the covariance matrix. | Lower, more balanced risk contribution usually means less hidden risk. | Depends heavily on the covariance estimate. |
| Efficient Frontier | Optimization Outputs | A set of modeled portfolios showing risk and return tradeoffs. | Optimized portfolios plotted by expected return and estimated volatility. | Portfolios higher and left look better under the model, subject to constraints. | The frontier is estimate-driven and not a forecast. |
| Accuracy | ML Evaluation | The share of classification predictions that matched actual outcomes. | Correct predictions divided by total predictions. | Higher is better when classes are balanced and errors cost the same. | Can mislead when one class is much more common than another. |
| Log Loss | ML Evaluation | How well classification probabilities matched actual outcomes. | Negative average log likelihood of the true class probability. | Lower is better; confident wrong predictions are penalized heavily. | Requires calibrated probabilities to be meaningful. |
| ROC AUC | ML Evaluation | How well a classifier ranked positives above negatives. | Area under the receiver operating characteristic curve. | Higher is better; 0.5 is roughly random ranking. | Does not choose a trading threshold or account for economic payoff. |
| RMSE | ML Evaluation | Typical regression prediction error with larger errors penalized more. | Square root of mean squared prediction error. | Lower is better. | Sensitive to outliers. |
| MAE | ML Evaluation | Typical absolute regression prediction error. | Mean absolute value of actual minus predicted values. | Lower is better. | Does not penalize large misses as strongly as RMSE. |
| R2 | ML Evaluation | How much target variation the regression model explained. | One minus residual sum of squares divided by total sum of squares. | Higher is better; values below zero are worse than a mean forecast. | Can look good in-sample while failing out of sample. |
ETF Universe Summary
How to read this section
What this shows: The list of ETFs included in this run, with descriptive metadata such as name, asset class, region, currency, cost, and benchmark index when available.
How to interpret it: Treat this as the menu the optimizer was allowed to choose from. If an asset is not in this universe, it cannot appear in the portfolio.
What to watch: A narrow or biased universe can make results look more confident than they are.
| ticker | name | asset_class | region | currency | expense_ratio | benchmark_index | inception_date |
|---|---|---|---|---|---|---|---|
| BND | Vanguard Total Bond Market ETF | fixed_income | US | USD | 0.0003 | Bloomberg U.S. Aggregate Float Adjusted Index | 2007-04-03 |
| GSG | iShares S&P GSCI Commodity-Indexed Trust | commodity | Global | USD | 0.0075 | S&P GSCI Total Return Index | 2006-07-21 |
| IAU | iShares Gold Trust | commodity | Global | USD | 0.0025 | LBMA Gold Price | 2005-01-21 |
| IEI | iShares 3-7 Year Treasury Bond ETF | fixed_income | US | USD | 0.0015 | ICE U.S. Treasury 3-7 Year Bond Index | 2007-01-05 |
| QQQ | Invesco QQQ Trust | equity | US | USD | 0.0020 | Nasdaq-100 Index | 1999-03-10 |
| REMX | VanEck Rare Earth and Strategic Metals ETF | equity | Global | USD | 0.0058 | MVIS Global Rare Earth Strategic Metals Index | 2010-10-27 |
| TIP | iShares TIPS Bond ETF | fixed_income | US | USD | 0.0019 | Bloomberg U.S. Treasury Inflation Protected Securities Index | 2003-12-04 |
| TLT | iShares 20+ Year Treasury Bond ETF | fixed_income | US | USD | 0.0015 | ICE U.S. Treasury 20+ Year Bond Index | 2002-07-22 |
| VEA | Vanguard FTSE Developed Markets ETF | equity | Developed ex-US | USD | 0.0006 | FTSE Developed All Cap ex US Index | 2007-07-20 |
| VNQ | Vanguard Real Estate ETF | real_estate | US | USD | 0.0013 | MSCI US Investable Market Real Estate 25/50 Index | 2004-09-29 |
| VTI | Vanguard Total Stock Market ETF | equity | US | USD | 0.0003 | CRSP US Total Market Index | 2001-05-24 |
| VWO | Vanguard FTSE Emerging Markets ETF | equity | Emerging Markets | USD | 0.0008 | FTSE Emerging Markets All Cap China A Inclusion Index | 2005-03-10 |
Data Coverage Table
How to read this section
What this shows: The usable price history available for each ETF after the data pipeline has loaded and aligned provider data.
How to interpret it: Longer and more complete histories generally make estimates more stable, but they still only describe the past.
What to watch: Short histories, late start dates, or missing values can materially affect backtests and optimization results.
| ticker | start_date | end_date | observations | coverage_ratio | asset_class | region | currency | inception_date |
|---|---|---|---|---|---|---|---|---|
| BND | 2011-01-03 | 2026-04-24 | 3850 | 1.0 | fixed_income | US | USD | 2007-04-03 |
| GSG | 2011-01-03 | 2026-04-24 | 3850 | 1.0 | commodity | Global | USD | 2006-07-21 |
| IAU | 2011-01-03 | 2026-04-24 | 3850 | 1.0 | commodity | Global | USD | 2005-01-21 |
| IEI | 2011-01-03 | 2026-04-24 | 3850 | 1.0 | fixed_income | US | USD | 2007-01-05 |
| QQQ | 2011-01-03 | 2026-04-24 | 3850 | 1.0 | equity | US | USD | 1999-03-10 |
| REMX | 2011-01-03 | 2026-04-24 | 3850 | 1.0 | equity | Global | USD | 2010-10-27 |
| TIP | 2011-01-03 | 2026-04-24 | 3850 | 1.0 | fixed_income | US | USD | 2003-12-04 |
| TLT | 2011-01-03 | 2026-04-24 | 3850 | 1.0 | fixed_income | US | USD | 2002-07-22 |
| VEA | 2011-01-03 | 2026-04-24 | 3850 | 1.0 | equity | Developed ex-US | USD | 2007-07-20 |
| VNQ | 2011-01-03 | 2026-04-24 | 3850 | 1.0 | real_estate | US | USD | 2004-09-29 |
| VTI | 2011-01-03 | 2026-04-24 | 3850 | 1.0 | equity | US | USD | 2001-05-24 |
| VWO | 2011-01-03 | 2026-04-24 | 3850 | 1.0 | equity | Emerging Markets | USD | 2005-03-10 |
Missing Data Table
How to read this section
What this shows: Counts and patterns of missing price observations for each asset.
How to interpret it: Missing data is not just a technical issue; it can change return calculations, risk estimates, and asset eligibility.
What to watch: Investigate assets with high missing counts before trusting a result that depends heavily on them.
| ticker | missing_count | missing_fraction | non_null_observations | row_count |
|---|---|---|---|---|
| BND | 0 | 0.0 | 3850 | 3850 |
| GSG | 0 | 0.0 | 3850 | 3850 |
| IAU | 0 | 0.0 | 3850 | 3850 |
| IEI | 0 | 0.0 | 3850 | 3850 |
| QQQ | 0 | 0.0 | 3850 | 3850 |
| REMX | 0 | 0.0 | 3850 | 3850 |
| TIP | 0 | 0.0 | 3850 | 3850 |
| TLT | 0 | 0.0 | 3850 | 3850 |
| VEA | 0 | 0.0 | 3850 | 3850 |
| VNQ | 0 | 0.0 | 3850 | 3850 |
| VTI | 0 | 0.0 | 3850 | 3850 |
| VWO | 0 | 0.0 | 3850 | 3850 |
Efficient Frontier Chart
How to read this section
What this shows: A model-based map of possible risk and return combinations under the configured optimization assumptions and constraints.
How to interpret it: Points further up suggest higher estimated return; points further right suggest higher estimated volatility. These are estimates, not guarantees.
What to watch: Small input changes can move the frontier. Do not read the exact location of a point as precision about the future.
Latest Realized Portfolio Table
How to read this section
What this shows: The portfolio weights actually held at the latest rebalance after realized portfolio mechanics such as contribution-only rebalancing or drift handling.
How to interpret it: This is the practical portfolio state produced by the backtest, not necessarily the optimizer's ideal target.
What to watch: Differences from target weights may reflect rebalancing policy, constraints, transaction costs, or drift.
| ETF | Weight |
|---|---|
| VTI | 0.411967 |
| QQQ | 0.172124 |
| IAU | 0.116707 |
| BND | 0.074087 |
| IEI | 0.044333 |
| VEA | 0.043598 |
| TLT | 0.041371 |
| TIP | 0.033603 |
| VNQ | 0.030261 |
| GSG | 0.023513 |
| REMX | 0.007955 |
| VWO | 0.000479 |
Optimizer Target Portfolio Table
How to read this section
What this shows: The optimizer's desired weights at the latest rebalance before realized portfolio mechanics are applied.
How to interpret it: Use this to understand what the model wanted under its objective and constraints.
What to watch: A target can look attractive in theory while being hard to reach in practice.
| ETF | Weight |
|---|---|
| VTI | 0.333499 |
| IEI | 0.300000 |
| IAU | 0.150000 |
| QQQ | 0.111383 |
| VEA | 0.055119 |
| BND | 0.050000 |
| VWO | 0.000000 |
| TIP | 0.000000 |
| VNQ | 0.000000 |
| GSG | 0.000000 |
| TLT | 0.000000 |
| REMX | 0.000000 |
Portfolio Weights
How to read this section
What this shows: How portfolio allocations changed across rebalance dates.
How to interpret it: Stable weights suggest a more consistent allocation; large swings suggest the model is reacting strongly to new data or unstable estimates.
What to watch: Frequent large changes can imply higher turnover, implementation complexity, and model sensitivity.
Exposure
How to read this section
What this shows: Portfolio weights grouped by higher-level categories such as asset class or region.
How to interpret it: Use this to see the broad economic bets behind the ticker-level allocations.
What to watch: A portfolio can look diversified by ticker while still being concentrated in one asset class, region, or risk factor.
| Asset Class | Weight |
|---|---|
| equity | 0.636123 |
| fixed_income | 0.193395 |
| commodity | 0.140220 |
| real_estate | 0.030261 |
| Region | Weight |
|---|---|
| US | 0.807747 |
| Global | 0.148175 |
| Developed ex-US | 0.043598 |
| Emerging Markets | 0.000479 |
Benchmark Comparison
How to read this section
What this shows: Portfolio results compared with one or more configured benchmarks.
How to interpret it: The benchmark is the yardstick. Outperformance matters only relative to the risk, drawdowns, and assumptions required to achieve it.
What to watch: A poor benchmark choice can make a strategy look better or worse than it really is.
| Metric | Strategy | CAGR | Annualized Volatility | Sharpe Ratio | Sortino Ratio | Max Drawdown | Calmar Ratio | Turnover | Average Number of Holdings | Largest Position | Herfindahl Concentration Index | Worst Month | Worst Quarter | Best Month | Beta | Alpha | Tracking Error | Information Ratio |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Optimized Strategy | 0.104314 | 0.122685 | 0.625821 | 0.874228 | -0.251149 | 0.415347 | 0.021322 | 9.200000 | 0.449637 | 0.235442 | -0.082072 | -0.143583 | 0.088194 | 0.676624 | 0.019746 | 0.068530 | -0.188473 | |
| Selected Benchmark ETF | 0.110648 | 0.171215 | 0.523874 | 0.723171 | -0.342362 | 0.323189 | 0.000000 | 1.000000 | 1.000000 | 1.000000 | -0.147645 | -0.221525 | 0.123687 | 1.000000 | 0.000000 | 0.000000 | 0.000000 | |
| 60/40 Portfolio | 0.076118 | 0.107779 | 0.456474 | 0.628608 | -0.220999 | 0.344426 | 0.000000 | 2.000000 | 0.600000 | 0.520000 | -0.090026 | -0.124988 | 0.078000 | 0.617266 | -0.003663 | 0.068856 | -0.588140 | |
| simple_global_baseline | 0.105946 | 0.155252 | 0.533457 | 0.738480 | -0.314086 | 0.337314 | 0.000000 | 4.000000 | 0.550000 | 0.385000 | -0.130737 | -0.196669 | 0.110082 | 0.904370 | 0.003010 | 0.019880 | -0.345815 | |
| Equal-Weight ETF Universe | 0.087649 | 0.116463 | 0.522325 | 0.720902 | -0.215554 | 0.406623 | 0.023993 | 12.000000 | 0.226959 | 0.100569 | -0.087564 | -0.126401 | 0.081637 | 0.635684 | 0.006383 | 0.074891 | -0.385407 | |
| Inverse-Volatility Portfolio | 0.080620 | 0.105533 | 0.503394 | 0.698321 | -0.222279 | 0.362697 | 0.021637 | 12.000000 | 0.231234 | 0.125264 | -0.078521 | -0.125741 | 0.072921 | 0.582321 | 0.003657 | 0.079440 | -0.460354 | |
| Minimum-Variance Portfolio | 0.081695 | 0.096807 | 0.549863 | 0.769539 | -0.224261 | 0.364287 | 0.019778 | 8.622222 | 0.462968 | 0.273342 | -0.073087 | -0.116124 | 0.071288 | 0.528589 | 0.009066 | 0.087724 | -0.415673 | |
| Risk-Parity Portfolio | 0.089113 | 0.107907 | 0.567236 | 0.788543 | -0.227225 | 0.392180 | 0.026211 | 10.992593 | 0.218527 | 0.116671 | -0.082183 | -0.131096 | 0.075480 | 0.566931 | 0.013392 | 0.087862 | -0.324216 | |
| Previous Optimized Strategy | 0.091476 | 0.118638 | 0.544472 | 0.756548 | -0.233934 | 0.391033 | 0.025594 | 12.000000 | 0.392891 | 0.148762 | -0.082043 | -0.137338 | 0.080980 | 0.951879 | -0.009262 | 0.021724 | -0.560863 |
Backtest Performance
How to read this section
What this shows: Historical simulated performance for the portfolio over the tested period.
How to interpret it: Read this as a historical experiment: what would have happened under these exact rules, data, costs, and constraints.
What to watch: Past performance does not guarantee future results. Strong backtests can still fail out of sample.
| Metric | Strategy | CAGR | Annualized Volatility | Sharpe Ratio | Sortino Ratio | Max Drawdown | Calmar Ratio | Turnover | Average Number of Holdings | Largest Position | Herfindahl Concentration Index | Worst Month | Worst Quarter | Best Month | Beta | Alpha | Tracking Error | Information Ratio |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Optimized Strategy | 0.104314 | 0.122685 | 0.625821 | 0.874228 | -0.251149 | 0.415347 | 0.021322 | 9.200000 | 0.449637 | 0.235442 | -0.082072 | -0.143583 | 0.088194 | 0.676624 | 0.019746 | 0.068530 | -0.188473 | |
| Selected Benchmark ETF | 0.110648 | 0.171215 | 0.523874 | 0.723171 | -0.342362 | 0.323189 | 0.000000 | 1.000000 | 1.000000 | 1.000000 | -0.147645 | -0.221525 | 0.123687 | 1.000000 | 0.000000 | 0.000000 | 0.000000 | |
| 60/40 Portfolio | 0.076118 | 0.107779 | 0.456474 | 0.628608 | -0.220999 | 0.344426 | 0.000000 | 2.000000 | 0.600000 | 0.520000 | -0.090026 | -0.124988 | 0.078000 | 0.617266 | -0.003663 | 0.068856 | -0.588140 | |
| simple_global_baseline | 0.105946 | 0.155252 | 0.533457 | 0.738480 | -0.314086 | 0.337314 | 0.000000 | 4.000000 | 0.550000 | 0.385000 | -0.130737 | -0.196669 | 0.110082 | 0.904370 | 0.003010 | 0.019880 | -0.345815 | |
| Equal-Weight ETF Universe | 0.087649 | 0.116463 | 0.522325 | 0.720902 | -0.215554 | 0.406623 | 0.023993 | 12.000000 | 0.226959 | 0.100569 | -0.087564 | -0.126401 | 0.081637 | 0.635684 | 0.006383 | 0.074891 | -0.385407 | |
| Inverse-Volatility Portfolio | 0.080620 | 0.105533 | 0.503394 | 0.698321 | -0.222279 | 0.362697 | 0.021637 | 12.000000 | 0.231234 | 0.125264 | -0.078521 | -0.125741 | 0.072921 | 0.582321 | 0.003657 | 0.079440 | -0.460354 | |
| Minimum-Variance Portfolio | 0.081695 | 0.096807 | 0.549863 | 0.769539 | -0.224261 | 0.364287 | 0.019778 | 8.622222 | 0.462968 | 0.273342 | -0.073087 | -0.116124 | 0.071288 | 0.528589 | 0.009066 | 0.087724 | -0.415673 | |
| Risk-Parity Portfolio | 0.089113 | 0.107907 | 0.567236 | 0.788543 | -0.227225 | 0.392180 | 0.026211 | 10.992593 | 0.218527 | 0.116671 | -0.082183 | -0.131096 | 0.075480 | 0.566931 | 0.013392 | 0.087862 | -0.324216 | |
| Previous Optimized Strategy | 0.091476 | 0.118638 | 0.544472 | 0.756548 | -0.233934 | 0.391033 | 0.025594 | 12.000000 | 0.392891 | 0.148762 | -0.082043 | -0.137338 | 0.080980 | 0.951879 | -0.009262 | 0.021724 | -0.560863 |
Drawdown Chart
How to read this section
What this shows: The depth and duration of historical losses from prior portfolio highs.
How to interpret it: Drawdown helps translate risk into a lived experience: how much the portfolio fell before recovering.
What to watch: A strategy with attractive returns but unacceptable drawdowns may be unsuitable for many real investors.
Rolling Risk Metrics
How to read this section
What this shows: How volatility, risk-adjusted returns, and benchmark relationship changed over time.
How to interpret it: Stable rolling metrics suggest more consistent behavior; unstable metrics suggest the portfolio behaves differently across market regimes.
What to watch: Rolling windows are backward-looking and can hide sudden breaks at the edges.
Stress Periods
How to read this section
What this shows: Portfolio behavior during difficult historical windows.
How to interpret it: Use this to understand how the strategy handled adverse environments, not just average conditions.
What to watch: Stress tests are limited to periods represented in the available data.
| Period | Portfolio | Selected Benchmark ETF | 60/40 Portfolio | simple_global_baseline | Equal-Weight ETF Universe | Inverse-Volatility Portfolio | Minimum-Variance Portfolio | Risk-Parity Portfolio | Previous Optimized Strategy |
|---|---|---|---|---|---|---|---|---|---|
| COVID Crash (2020-02 to 2020-04) | -0.024082 | -0.127249 | -0.058816 | -0.105637 | -0.063208 | -0.033484 | -0.022710 | -0.019481 | -0.036624 |
| Inflation / Rate Shock (2022) | -0.205546 | -0.180034 | -0.156189 | -0.173498 | -0.166145 | -0.178969 | -0.164728 | -0.180900 | -0.192348 |
| Recent Drawdown (2026-01 to 2026-03) | -0.072866 | -0.085310 | -0.053374 | -0.077127 | -0.049349 | -0.059547 | -0.063011 | -0.062297 | -0.068769 |
Weighted Expense Ratio Over Time
How to read this section
What this shows: The portfolio's weighted average ETF expense ratio across time.
How to interpret it: Lower costs leave more gross return for the investor, but cost is only one part of portfolio quality.
What to watch: Expense ratios exclude taxes, spreads, slippage, advisory fees, and account-level costs.
| rebalance_date | weighted_expense_ratio |
|---|---|
| 2015-01-30 | 0.000850 |
| 2015-02-27 | 0.000839 |
| 2015-03-31 | 0.000833 |
| 2015-04-30 | 0.000823 |
| 2015-05-29 | 0.000817 |
| 2015-06-30 | 0.000808 |
| 2015-07-31 | 0.000815 |
| 2015-08-31 | 0.000810 |
| 2015-09-30 | 0.000809 |
| 2015-10-30 | 0.000811 |
| 2015-11-30 | 0.000808 |
| 2015-12-31 | 0.000806 |
| 2016-01-29 | 0.000809 |
| 2016-02-29 | 0.000807 |
| 2016-03-31 | 0.000805 |
| 2016-04-29 | 0.000793 |
| 2016-05-31 | 0.000796 |
| 2016-06-30 | 0.000798 |
| 2016-07-29 | 0.000802 |
| 2016-08-31 | 0.000802 |
| 2016-09-30 | 0.000804 |
| 2016-10-31 | 0.000799 |
| 2016-11-30 | 0.000788 |
| 2016-12-30 | 0.000789 |
| 2017-01-31 | 0.000797 |
| 2017-02-28 | 0.000802 |
| 2017-03-31 | 0.000804 |
| 2017-04-28 | 0.000806 |
| 2017-05-31 | 0.000809 |
| 2017-06-30 | 0.000803 |
| 2017-07-31 | 0.000804 |
| 2017-08-31 | 0.000807 |
| 2017-09-29 | 0.000801 |
| 2017-10-31 | 0.000802 |
| 2017-11-30 | 0.000805 |
| 2017-12-29 | 0.000808 |
| 2018-01-31 | 0.000811 |
| 2018-02-28 | 0.000814 |
| 2018-03-29 | 0.000818 |
| 2018-04-30 | 0.000818 |
| 2018-05-31 | 0.000826 |
| 2018-06-29 | 0.000827 |
| 2018-07-31 | 0.000827 |
| 2018-08-31 | 0.000830 |
| 2018-09-28 | 0.000826 |
| 2018-10-31 | 0.000828 |
| 2018-11-30 | 0.000829 |
| 2018-12-31 | 0.000842 |
| 2019-01-31 | 0.000845 |
| 2019-02-28 | 0.000840 |
| 2019-03-29 | 0.000844 |
| 2019-04-30 | 0.000840 |
| 2019-05-31 | 0.000844 |
| 2019-06-28 | 0.000842 |
| 2019-07-31 | 0.000840 |
| 2019-08-30 | 0.000855 |
| 2019-09-30 | 0.000851 |
| 2019-10-31 | 0.000862 |
| 2019-11-29 | 0.000862 |
| 2019-12-31 | 0.000867 |
| 2020-01-31 | 0.000885 |
| 2020-02-28 | 0.000902 |
| 2020-03-31 | 0.000934 |
| 2020-04-30 | 0.000937 |
| 2020-05-29 | 0.000939 |
| 2020-06-30 | 0.000950 |
| 2020-07-31 | 0.000964 |
| 2020-08-31 | 0.000966 |
| 2020-09-30 | 0.000965 |
| 2020-10-30 | 0.000966 |
| 2020-11-30 | 0.000954 |
| 2020-12-31 | 0.000960 |
| 2021-01-29 | 0.000961 |
| 2021-02-26 | 0.000948 |
| 2021-03-31 | 0.000943 |
| 2021-04-30 | 0.000948 |
| 2021-05-28 | 0.000955 |
| 2021-06-30 | 0.000959 |
| 2021-07-30 | 0.000968 |
| 2021-08-31 | 0.000974 |
| 2021-09-30 | 0.000977 |
| 2021-10-29 | 0.000982 |
| 2021-11-30 | 0.000996 |
| 2021-12-31 | 0.000995 |
| 2022-01-31 | 0.000998 |
| 2022-02-28 | 0.001010 |
| 2022-03-31 | 0.001016 |
| 2022-04-29 | 0.001017 |
| 2022-05-31 | 0.001017 |
| 2022-06-30 | 0.001035 |
| 2022-07-29 | 0.001037 |
| 2022-08-31 | 0.001050 |
| 2022-09-30 | 0.001062 |
| 2022-10-31 | 0.001055 |
| 2022-11-30 | 0.001068 |
| 2022-12-30 | 0.001078 |
| 2023-01-31 | 0.001095 |
| 2023-02-28 | 0.001100 |
| 2023-03-31 | 0.001115 |
| 2023-04-28 | 0.001117 |
| 2023-05-31 | 0.001130 |
| 2023-06-30 | 0.001126 |
| 2023-07-31 | 0.001134 |
| 2023-08-31 | 0.001137 |
| 2023-09-29 | 0.001149 |
| 2023-10-31 | 0.001158 |
| 2023-11-30 | 0.001143 |
| 2023-12-29 | 0.001138 |
| 2024-01-31 | 0.001135 |
| 2024-02-29 | 0.001135 |
| 2024-03-28 | 0.001142 |
| 2024-04-30 | 0.001161 |
| 2024-05-31 | 0.001157 |
| 2024-06-28 | 0.001157 |
| 2024-07-31 | 0.001147 |
| 2024-08-30 | 0.001139 |
| 2024-09-30 | 0.001143 |
| 2024-10-31 | 0.001152 |
| 2024-11-29 | 0.001131 |
| 2024-12-31 | 0.001142 |
| 2025-01-31 | 0.001146 |
| 2025-02-28 | 0.001149 |
| 2025-03-31 | 0.001173 |
| 2025-04-30 | 0.001172 |
| 2025-05-30 | 0.001164 |
| 2025-06-30 | 0.001162 |
| 2025-07-31 | 0.001166 |
| 2025-08-29 | 0.001170 |
| 2025-09-30 | 0.001181 |
| 2025-10-31 | 0.001187 |
| 2025-11-28 | 0.001193 |
| 2025-12-31 | 0.001195 |
| 2026-01-30 | 0.001222 |
| 2026-02-27 | 0.001240 |
| 2026-03-31 | 0.001263 |
Return Attribution
How to read this section
What this shows: A breakdown of which assets or groups contributed to historical portfolio returns.
How to interpret it: Positive contributors helped the backtest; negative contributors reduced it.
What to watch: Attribution explains the past. It does not prove the same assets will drive future returns.
| level | name | contribution |
|---|---|---|
| Asset | VTI | 0.625469 |
| Asset | QQQ | 0.346613 |
| Asset | IAU | 0.098141 |
| Asset | VEA | 0.041409 |
| Asset | BND | 0.033915 |
| Asset | VNQ | 0.031934 |
| Asset | GSG | 0.008126 |
| Asset | TIP | 0.002638 |
| Asset | TLT | 0.002327 |
| Asset | IEI | 0.001713 |
| Asset | VWO | 0.000044 |
| Asset | REMX | -0.000442 |
| Asset Class | equity | 1.013093 |
| Asset Class | commodity | 0.106268 |
| Asset Class | fixed_income | 0.040593 |
| Asset Class | real_estate | 0.031934 |
| Total | Portfolio | 1.191888 |
Risk Attribution
How to read this section
What this shows: A breakdown of which assets or groups contributed to estimated portfolio risk.
How to interpret it: Large risk contributors are the exposures most responsible for portfolio volatility.
What to watch: Risk contribution depends on the covariance estimate, which can change across regimes.
| level | name | risk_contribution |
|---|---|---|
| Asset | VTI | 0.067411 |
| Asset | QQQ | 0.032651 |
| Asset | VEA | 0.006275 |
| Asset | IAU | 0.005077 |
| Asset | VNQ | 0.004204 |
| Asset | GSG | 0.001829 |
| Asset | REMX | 0.001651 |
| Asset | BND | 0.000855 |
| Asset | TIP | 0.000314 |
| Asset | VWO | 0.000071 |
| Asset | IEI | 0.000021 |
| Asset | TLT | -0.000348 |
| Asset Class | equity | 0.108058 |
| Asset Class | commodity | 0.006906 |
| Asset Class | real_estate | 0.004204 |
| Asset Class | fixed_income | 0.000842 |
| Total | Portfolio Volatility | 0.120010 |
Realized Constraint Warnings
How to read this section
What this shows: Cases where realized holdings moved outside configured bounds after applying the chosen rebalance policy.
How to interpret it: Warnings do not necessarily mean the run failed; they show where practical mechanics diverged from ideal constraints.
What to watch: Repeated or large breaches may mean the rebalance policy is too loose for the intended use.
| rebalance_date | constraint_type | identifier | direction | actual | bound | breach |
|---|---|---|---|---|---|---|
| 2015-02-27 | ticker | QQQ | above_max | 0.155874 | 0.15 | 0.005874 |
| 2015-03-31 | ticker | QQQ | above_max | 0.150654 | 0.15 | 0.000654 |
| 2015-04-30 | ticker | QQQ | above_max | 0.151993 | 0.15 | 0.001993 |
| 2015-05-29 | ticker | QQQ | above_max | 0.152709 | 0.15 | 0.002709 |
| 2015-06-30 | ticker | QQQ | above_max | 0.150323 | 0.15 | 0.000323 |
| 2015-06-30 | ticker | VEA | below_min | 0.049792 | 0.05 | 0.000208 |
| 2015-07-31 | ticker | QQQ | above_max | 0.151071 | 0.15 | 0.001071 |
| 2015-07-31 | ticker | VEA | below_min | 0.048624 | 0.05 | 0.001376 |
| 2015-08-31 | ticker | VEA | below_min | 0.046694 | 0.05 | 0.003306 |
| 2015-09-30 | ticker | VEA | below_min | 0.044888 | 0.05 | 0.005112 |
| 2015-10-30 | ticker | VEA | below_min | 0.045109 | 0.05 | 0.004891 |
| 2015-11-30 | ticker | VEA | below_min | 0.044436 | 0.05 | 0.005564 |
| 2015-12-31 | ticker | VEA | below_min | 0.043766 | 0.05 | 0.006234 |
| 2016-01-29 | ticker | VEA | below_min | 0.042416 | 0.05 | 0.007584 |
| 2016-02-29 | ticker | VEA | below_min | 0.041498 | 0.05 | 0.008502 |
| 2016-03-31 | ticker | VEA | below_min | 0.042701 | 0.05 | 0.007299 |
| 2016-04-29 | ticker | VEA | below_min | 0.043626 | 0.05 | 0.006374 |
| 2016-05-31 | ticker | VEA | below_min | 0.042884 | 0.05 | 0.007116 |
| 2016-06-30 | ticker | VEA | below_min | 0.041550 | 0.05 | 0.008450 |
| 2016-07-29 | ticker | VEA | below_min | 0.042003 | 0.05 | 0.007997 |
| 2016-08-31 | ticker | VEA | below_min | 0.042596 | 0.05 | 0.007404 |
| 2016-09-30 | ticker | VEA | below_min | 0.043468 | 0.05 | 0.006532 |
| 2016-10-31 | ticker | VEA | below_min | 0.043557 | 0.05 | 0.006443 |
| 2016-11-30 | ticker | VEA | below_min | 0.043127 | 0.05 | 0.006873 |
| 2016-12-30 | ticker | VEA | below_min | 0.043708 | 0.05 | 0.006292 |
| 2017-01-31 | ticker | VEA | below_min | 0.044767 | 0.05 | 0.005233 |
| 2017-02-28 | ticker | VEA | below_min | 0.044290 | 0.05 | 0.005710 |
| 2017-03-31 | ticker | VEA | below_min | 0.045562 | 0.05 | 0.004438 |
| 2017-04-28 | ticker | VEA | below_min | 0.045857 | 0.05 | 0.004143 |
| 2017-05-31 | ticker | VEA | below_min | 0.046585 | 0.05 | 0.003415 |
| 2017-06-30 | ticker | VEA | below_min | 0.046596 | 0.05 | 0.003404 |
| 2017-07-31 | ticker | VEA | below_min | 0.047072 | 0.05 | 0.002928 |
| 2017-08-31 | ticker | VEA | below_min | 0.046497 | 0.05 | 0.003503 |
| 2017-09-29 | ticker | VEA | below_min | 0.047358 | 0.05 | 0.002642 |
| 2017-10-31 | ticker | VEA | below_min | 0.047315 | 0.05 | 0.002685 |
| 2017-11-30 | ticker | VEA | below_min | 0.046617 | 0.05 | 0.003383 |
| 2017-12-29 | ticker | VEA | below_min | 0.046661 | 0.05 | 0.003339 |
| 2018-01-31 | ticker | QQQ | above_max | 0.154391 | 0.15 | 0.004391 |
| 2018-01-31 | ticker | VEA | below_min | 0.047350 | 0.05 | 0.002650 |
| 2018-02-28 | ticker | QQQ | above_max | 0.155925 | 0.15 | 0.005925 |
| 2018-02-28 | ticker | VEA | below_min | 0.046077 | 0.05 | 0.003923 |
| 2018-03-29 | ticker | VEA | below_min | 0.045973 | 0.05 | 0.004027 |
| 2018-04-30 | ticker | VEA | below_min | 0.046327 | 0.05 | 0.003673 |
| 2018-05-31 | ticker | QQQ | above_max | 0.152711 | 0.15 | 0.002711 |
| 2018-05-31 | ticker | VEA | below_min | 0.044389 | 0.05 | 0.005611 |
| 2018-06-29 | ticker | QQQ | above_max | 0.152239 | 0.15 | 0.002239 |
| 2018-06-29 | ticker | VEA | below_min | 0.043216 | 0.05 | 0.006784 |
| 2018-07-31 | ticker | QQQ | above_max | 0.152779 | 0.15 | 0.002779 |
| 2018-07-31 | ticker | VEA | below_min | 0.043338 | 0.05 | 0.006662 |
| 2018-08-31 | ticker | QQQ | above_max | 0.156371 | 0.15 | 0.006371 |
| 2018-08-31 | ticker | VEA | below_min | 0.041440 | 0.05 | 0.008560 |
| 2018-09-28 | ticker | QQQ | above_max | 0.155678 | 0.15 | 0.005678 |
| 2018-09-28 | ticker | VEA | below_min | 0.041889 | 0.05 | 0.008111 |
| 2018-10-31 | ticker | VEA | below_min | 0.040402 | 0.05 | 0.009598 |
| 2018-11-30 | ticker | VEA | below_min | 0.040005 | 0.05 | 0.009995 |
| 2018-12-31 | ticker | VEA | below_min | 0.039585 | 0.05 | 0.010415 |
| 2019-01-31 | ticker | VEA | below_min | 0.040084 | 0.05 | 0.009916 |
| 2019-02-28 | ticker | VEA | below_min | 0.040268 | 0.05 | 0.009732 |
| 2019-03-29 | ticker | VEA | below_min | 0.039599 | 0.05 | 0.010401 |
| 2019-04-30 | ticker | VEA | below_min | 0.039851 | 0.05 | 0.010149 |
| 2019-05-31 | ticker | VEA | below_min | 0.039014 | 0.05 | 0.010986 |
| 2019-06-28 | ticker | VEA | below_min | 0.039612 | 0.05 | 0.010388 |
| 2019-07-31 | ticker | VEA | below_min | 0.038503 | 0.05 | 0.011497 |
| 2019-08-30 | ticker | VEA | below_min | 0.037581 | 0.05 | 0.012419 |
| 2019-09-30 | ticker | VEA | below_min | 0.039219 | 0.05 | 0.010781 |
| 2019-10-31 | ticker | VEA | below_min | 0.039951 | 0.05 | 0.010049 |
| 2019-11-29 | ticker | VEA | below_min | 0.039816 | 0.05 | 0.010184 |
| 2019-12-31 | ticker | VEA | below_min | 0.040610 | 0.05 | 0.009390 |
| 2020-01-31 | ticker | VEA | below_min | 0.038834 | 0.05 | 0.011166 |
| 2020-02-28 | ticker | VEA | below_min | 0.037537 | 0.05 | 0.012463 |
| 2020-03-31 | ticker | TLT | above_max | 0.151552 | 0.15 | 0.001552 |
| 2020-03-31 | ticker | VEA | below_min | 0.034540 | 0.05 | 0.015460 |
| 2020-04-30 | ticker | QQQ | above_max | 0.151458 | 0.15 | 0.001458 |
| 2020-04-30 | ticker | VEA | below_min | 0.034114 | 0.05 | 0.015886 |
| 2020-05-29 | ticker | QQQ | above_max | 0.155447 | 0.15 | 0.005447 |
| 2020-05-29 | ticker | VEA | below_min | 0.034939 | 0.05 | 0.015061 |
| 2020-06-30 | ticker | QQQ | above_max | 0.160490 | 0.15 | 0.010490 |
| 2020-06-30 | ticker | VEA | below_min | 0.035374 | 0.05 | 0.014626 |
| 2020-07-31 | ticker | QQQ | above_max | 0.163093 | 0.15 | 0.013093 |
| 2020-07-31 | ticker | VEA | below_min | 0.034621 | 0.05 | 0.015379 |
| 2020-08-31 | ticker | QQQ | above_max | 0.173486 | 0.15 | 0.023486 |
| 2020-08-31 | ticker | VEA | below_min | 0.035137 | 0.05 | 0.014863 |
| 2020-09-30 | ticker | QQQ | above_max | 0.167269 | 0.15 | 0.017269 |
| 2020-09-30 | ticker | VEA | below_min | 0.035539 | 0.05 | 0.014461 |
| 2020-10-30 | ticker | QQQ | above_max | 0.164788 | 0.15 | 0.014788 |
| 2020-10-30 | ticker | VEA | below_min | 0.035075 | 0.05 | 0.014925 |
| 2020-11-30 | ticker | QQQ | above_max | 0.170038 | 0.15 | 0.020038 |
| 2020-11-30 | ticker | VEA | below_min | 0.037377 | 0.05 | 0.012623 |
| 2020-12-31 | ticker | QQQ | above_max | 0.171896 | 0.15 | 0.021896 |
| 2020-12-31 | ticker | VEA | below_min | 0.038214 | 0.05 | 0.011786 |
| 2021-01-29 | ticker | QQQ | above_max | 0.173053 | 0.15 | 0.023053 |
| 2021-01-29 | ticker | VEA | below_min | 0.038261 | 0.05 | 0.011739 |
| 2021-02-26 | ticker | QQQ | above_max | 0.171728 | 0.15 | 0.021728 |
| 2021-02-26 | ticker | VEA | below_min | 0.039093 | 0.05 | 0.010907 |
| 2021-03-31 | ticker | QQQ | above_max | 0.171648 | 0.15 | 0.021648 |
| 2021-03-31 | ticker | VEA | below_min | 0.039617 | 0.05 | 0.010383 |
| 2021-04-30 | ticker | QQQ | above_max | 0.173771 | 0.15 | 0.023771 |
| 2021-04-30 | ticker | VEA | below_min | 0.039164 | 0.05 | 0.010836 |
| 2021-05-28 | ticker | QQQ | above_max | 0.169893 | 0.15 | 0.019893 |
| 2021-05-28 | ticker | VEA | below_min | 0.040267 | 0.05 | 0.009733 |
| 2021-06-30 | ticker | QQQ | above_max | 0.175842 | 0.15 | 0.025842 |
| 2021-06-30 | ticker | VEA | below_min | 0.038996 | 0.05 | 0.011004 |
| 2021-07-30 | ticker | QQQ | above_max | 0.176354 | 0.15 | 0.026354 |
| 2021-07-30 | ticker | VEA | below_min | 0.038335 | 0.05 | 0.011665 |
| 2021-08-31 | ticker | QQQ | above_max | 0.179511 | 0.15 | 0.029511 |
| 2021-08-31 | ticker | VEA | below_min | 0.038048 | 0.05 | 0.011952 |
| 2021-09-30 | ticker | QQQ | above_max | 0.175509 | 0.15 | 0.025509 |
| 2021-09-30 | ticker | VEA | below_min | 0.038224 | 0.05 | 0.011776 |
| 2021-10-29 | ticker | QQQ | above_max | 0.179755 | 0.15 | 0.029755 |
| 2021-10-29 | ticker | VEA | below_min | 0.037583 | 0.05 | 0.012417 |
| 2021-11-30 | ticker | QQQ | above_max | 0.183134 | 0.15 | 0.033134 |
| 2021-11-30 | ticker | VEA | below_min | 0.035931 | 0.05 | 0.014069 |
| 2021-12-31 | ticker | QQQ | above_max | 0.180365 | 0.15 | 0.030365 |
| 2021-12-31 | ticker | VEA | below_min | 0.036632 | 0.05 | 0.013368 |
| 2022-01-31 | ticker | QQQ | above_max | 0.173436 | 0.15 | 0.023436 |
| 2022-01-31 | ticker | VEA | below_min | 0.037239 | 0.05 | 0.012761 |
| 2022-02-28 | ticker | QQQ | above_max | 0.168288 | 0.15 | 0.018288 |
| 2022-02-28 | ticker | VEA | below_min | 0.036960 | 0.05 | 0.013040 |
| 2022-03-31 | ticker | QQQ | above_max | 0.172774 | 0.15 | 0.022774 |
| 2022-03-31 | ticker | VEA | below_min | 0.036632 | 0.05 | 0.013368 |
| 2022-04-29 | ticker | QQQ | above_max | 0.161901 | 0.15 | 0.011901 |
| 2022-04-29 | ticker | VEA | below_min | 0.037174 | 0.05 | 0.012826 |
| 2022-05-31 | ticker | QQQ | above_max | 0.160075 | 0.15 | 0.010075 |
| 2022-05-31 | ticker | VEA | below_min | 0.038095 | 0.05 | 0.011905 |
| 2022-06-30 | ticker | QQQ | above_max | 0.154619 | 0.15 | 0.004619 |
| 2022-06-30 | ticker | VEA | below_min | 0.036863 | 0.05 | 0.013137 |
| 2022-07-29 | ticker | QQQ | above_max | 0.162288 | 0.15 | 0.012288 |
| 2022-07-29 | ticker | VEA | below_min | 0.036332 | 0.05 | 0.013668 |
| 2022-08-31 | ticker | QQQ | above_max | 0.159604 | 0.15 | 0.009604 |
| 2022-08-31 | ticker | VEA | below_min | 0.035661 | 0.05 | 0.014339 |
| 2022-09-30 | ticker | QQQ | above_max | 0.154895 | 0.15 | 0.004895 |
| 2022-09-30 | ticker | VEA | below_min | 0.035082 | 0.05 | 0.014918 |
| 2022-10-31 | ticker | QQQ | above_max | 0.154959 | 0.15 | 0.004959 |
| 2022-10-31 | ticker | VEA | below_min | 0.036002 | 0.05 | 0.013998 |
| 2022-11-30 | ticker | QQQ | above_max | 0.154368 | 0.15 | 0.004368 |
| 2022-11-30 | ticker | VEA | below_min | 0.038405 | 0.05 | 0.011595 |
| 2022-12-30 | ticker | VEA | below_min | 0.039291 | 0.05 | 0.010709 |
| 2023-01-31 | ticker | QQQ | above_max | 0.150806 | 0.15 | 0.000806 |
| 2023-01-31 | ticker | VEA | below_min | 0.040021 | 0.05 | 0.009979 |
| 2023-02-28 | ticker | QQQ | above_max | 0.153963 | 0.15 | 0.003963 |
| 2023-02-28 | ticker | VEA | below_min | 0.039723 | 0.05 | 0.010277 |
| 2023-03-31 | ticker | QQQ | above_max | 0.161489 | 0.15 | 0.011489 |
| 2023-03-31 | ticker | VEA | below_min | 0.039154 | 0.05 | 0.010846 |
| 2023-04-28 | ticker | QQQ | above_max | 0.160436 | 0.15 | 0.010436 |
| 2023-04-28 | ticker | VEA | below_min | 0.041805 | 0.05 | 0.008195 |
| 2023-05-31 | ticker | QQQ | above_max | 0.171574 | 0.15 | 0.021574 |
| 2023-05-31 | ticker | VEA | below_min | 0.040022 | 0.05 | 0.009978 |
| 2023-06-30 | ticker | QQQ | above_max | 0.174652 | 0.15 | 0.024652 |
| 2023-06-30 | ticker | VEA | below_min | 0.040114 | 0.05 | 0.009886 |
| 2023-07-31 | ticker | QQQ | above_max | 0.176402 | 0.15 | 0.026402 |
| 2023-07-31 | ticker | VEA | below_min | 0.040326 | 0.05 | 0.009674 |
| 2023-08-31 | ticker | QQQ | above_max | 0.176469 | 0.15 | 0.026469 |
| 2023-08-31 | ticker | VEA | below_min | 0.039629 | 0.05 | 0.010371 |
| 2023-09-29 | ticker | QQQ | above_max | 0.174816 | 0.15 | 0.024816 |
| 2023-09-29 | ticker | VEA | below_min | 0.039895 | 0.05 | 0.010105 |
| 2023-10-31 | ticker | QQQ | above_max | 0.173972 | 0.15 | 0.023972 |
| 2023-10-31 | ticker | VEA | below_min | 0.039275 | 0.05 | 0.010725 |
| 2023-11-30 | ticker | QQQ | above_max | 0.177986 | 0.15 | 0.027986 |
| 2023-11-30 | ticker | VEA | below_min | 0.039581 | 0.05 | 0.010419 |
| 2023-12-29 | ticker | QQQ | above_max | 0.178451 | 0.15 | 0.028451 |
| 2023-12-29 | ticker | VEA | below_min | 0.039788 | 0.05 | 0.010212 |
| 2024-01-31 | ticker | QQQ | above_max | 0.180728 | 0.15 | 0.030728 |
| 2024-01-31 | ticker | VEA | below_min | 0.039255 | 0.05 | 0.010745 |
| 2024-02-29 | ticker | QQQ | above_max | 0.183905 | 0.15 | 0.033905 |
| 2024-02-29 | ticker | VEA | below_min | 0.039111 | 0.05 | 0.010889 |
| 2024-03-28 | ticker | QQQ | above_max | 0.180875 | 0.15 | 0.030875 |
| 2024-03-28 | ticker | VEA | below_min | 0.039496 | 0.05 | 0.010504 |
| 2024-04-30 | ticker | QQQ | above_max | 0.178822 | 0.15 | 0.028822 |
| 2024-04-30 | ticker | VEA | below_min | 0.039569 | 0.05 | 0.010431 |
| 2024-05-31 | ticker | QQQ | above_max | 0.181929 | 0.15 | 0.031929 |
| 2024-05-31 | ticker | VEA | below_min | 0.039812 | 0.05 | 0.010188 |
| 2024-06-28 | ticker | QQQ | above_max | 0.188134 | 0.15 | 0.038134 |
| 2024-06-28 | ticker | VEA | below_min | 0.038164 | 0.05 | 0.011836 |
| 2024-07-31 | ticker | QQQ | above_max | 0.181286 | 0.15 | 0.031286 |
| 2024-07-31 | ticker | VEA | below_min | 0.038643 | 0.05 | 0.011357 |
| 2024-08-30 | ticker | QQQ | above_max | 0.179472 | 0.15 | 0.029472 |
| 2024-08-30 | ticker | VEA | below_min | 0.039036 | 0.05 | 0.010964 |
| 2024-09-30 | ticker | QQQ | above_max | 0.179571 | 0.15 | 0.029571 |
| 2024-09-30 | ticker | VEA | below_min | 0.038569 | 0.05 | 0.011431 |
| 2024-10-31 | ticker | QQQ | above_max | 0.179485 | 0.15 | 0.029485 |
| 2024-10-31 | ticker | VEA | below_min | 0.037007 | 0.05 | 0.012993 |
| 2024-11-29 | ticker | QQQ | above_max | 0.181249 | 0.15 | 0.031249 |
| 2024-11-29 | ticker | VEA | below_min | 0.035737 | 0.05 | 0.014263 |
| 2024-12-31 | ticker | QQQ | above_max | 0.186021 | 0.15 | 0.036021 |
| 2024-12-31 | ticker | VEA | below_min | 0.035384 | 0.05 | 0.014616 |
| 2025-01-31 | ticker | QQQ | above_max | 0.184531 | 0.15 | 0.034531 |
| 2025-01-31 | ticker | VEA | below_min | 0.036026 | 0.05 | 0.013974 |
| 2025-02-28 | ticker | QQQ | above_max | 0.179859 | 0.15 | 0.029859 |
| 2025-02-28 | ticker | VEA | below_min | 0.037039 | 0.05 | 0.012961 |
| 2025-03-31 | ticker | QQQ | above_max | 0.171308 | 0.15 | 0.021308 |
| 2025-03-31 | ticker | VEA | below_min | 0.038296 | 0.05 | 0.011704 |
| 2025-04-30 | ticker | QQQ | above_max | 0.172701 | 0.15 | 0.022701 |
| 2025-04-30 | ticker | VEA | below_min | 0.039725 | 0.05 | 0.010275 |
| 2025-05-30 | ticker | QQQ | above_max | 0.180416 | 0.15 | 0.030416 |
| 2025-05-30 | ticker | VEA | below_min | 0.040038 | 0.05 | 0.009962 |
| 2025-06-30 | ticker | QQQ | above_max | 0.184082 | 0.15 | 0.034082 |
| 2025-06-30 | ticker | VEA | below_min | 0.039778 | 0.05 | 0.010222 |
| 2025-07-31 | ticker | QQQ | above_max | 0.185472 | 0.15 | 0.035472 |
| 2025-07-31 | ticker | VEA | below_min | 0.038674 | 0.05 | 0.011326 |
| 2025-08-29 | ticker | QQQ | above_max | 0.182644 | 0.15 | 0.032644 |
| 2025-08-29 | ticker | VEA | below_min | 0.040118 | 0.05 | 0.009882 |
| 2025-09-30 | ticker | QQQ | above_max | 0.184699 | 0.15 | 0.034699 |
| 2025-09-30 | ticker | VEA | below_min | 0.039979 | 0.05 | 0.010021 |
| 2025-10-31 | ticker | QQQ | above_max | 0.188594 | 0.15 | 0.038594 |
| 2025-10-31 | ticker | VEA | below_min | 0.039785 | 0.05 | 0.010215 |
| 2025-11-28 | ticker | QQQ | above_max | 0.184135 | 0.15 | 0.034135 |
| 2025-11-28 | ticker | VEA | below_min | 0.040102 | 0.05 | 0.009898 |
| 2025-12-31 | ticker | QQQ | above_max | 0.182520 | 0.15 | 0.032520 |
| 2025-12-31 | ticker | VEA | below_min | 0.041378 | 0.05 | 0.008622 |
| 2026-01-30 | ticker | QQQ | above_max | 0.179235 | 0.15 | 0.029235 |
| 2026-01-30 | ticker | VEA | below_min | 0.042870 | 0.05 | 0.007130 |
| 2026-02-27 | ticker | QQQ | above_max | 0.172343 | 0.15 | 0.022343 |
| 2026-02-27 | ticker | VEA | below_min | 0.045367 | 0.05 | 0.004633 |
| 2026-03-31 | ticker | QQQ | above_max | 0.172124 | 0.15 | 0.022124 |
| 2026-03-31 | ticker | VEA | below_min | 0.043598 | 0.05 | 0.006402 |
Assumptions and Limitations
How to read this section
What this shows: The configuration, modeling assumptions, known limitations, and caveats attached to this report.
How to interpret it: This section defines the boundary of the result. The report should not be read without it.
What to watch: If an assumption is unrealistic for your use case, the conclusions may not transfer.
| parameter | value |
|---|---|
| periods_per_year | 252 |
| risk_free_rate | 0.030000 |
| max_weight | 0.2500 |
| rebalance_count | 135 |
| first_rebalance_date | 2015-01-30 |
| last_rebalance_date | 2026-03-31 |
| key | assumption |
|---|---|
| scope | Research-only system for long-horizon retirement-style accumulation. Not live trading, not personalized financial advice. |
| currency | Base currency is USD. No FX hedging applied to non-USD exposures. |
| data | Adjusted prices from the configured provider; survivorship bias and data revisions are not corrected for. |
| no_lookahead | Walk-forward backtest estimates target weights only with returns observed strictly before each rebalance date. |
| execution_timing | The return labeled with a rebalance date belongs to the previous holding period; new weights and trade-cost impact start on the next return date. |
| costs | Transaction costs and configured slippage are modeled as simple bps assumptions; taxes, spreads beyond configured slippage, market impact, and account-specific fees are not modeled. |
| rebalancing | Contribution-only mode avoids selling unless fallback or hard-constraint policies trigger; tolerance-band mode uses constrained projection when configured drift bands are breached. |
| benchmark_fairness | Optimized benchmark objectives use the same rebalance mode (contribution_only), contribution amount (1500.00), initial capital, transaction cost/slippage rate, constraints, and rebalance schedule as the main strategy. |
| optimization | Mean-variance style optimization with documented constraints; expected returns use historical means unless overridden. |
| data_provider | Data provider: yfinance |
| benchmark | Primary benchmark: VT |
| optimization_method | Optimization method: max_sharpe |
| risk_model | Risk model: ledoit_wolf |
| expected_returns | Expected return estimator: historical_mean |
| rebalance_mode | Rebalance mode: contribution_only |
| rebalance_frequency | Rebalance frequency: monthly |
| rebalance_execution | Rebalance execution: target weights are estimated with returns strictly before each rebalance date; the return labeled with the rebalance date remains in the previous holding period; new weights and trade-cost impact start on the next return date. |
| benchmark_return_series | The selected benchmark ETF and configured secondary allocation benchmarks are external/theoretical return-series baselines; they are not simulated with contribution-only drift or strategy transaction costs. |
| transaction_costs | Transaction cost assumptions: 2.00 bps fees + 1.00 bps slippage |
| weight_cap | Default maximum ETF weight: 25.00%; ticker-specific bounds may override this default. |
| risk_free_rate | Annualized risk-free rate (constant): 3.00% |
| run_id | Run ID: run-all-20260425T083756Z-f6f9560b |
| Metric | Value |
|---|---|
| Weighted Expense Ratio | 0.001263 |
| Portfolio Beta | 0.676624 |
- This report is for research and education only. It is not financial advice, investment advice, tax advice, legal advice, or a recommendation to buy or sell any security.
- Past performance does not guarantee future results.
- Transaction costs and configured slippage are modeled as simple bps assumptions; taxes, spreads beyond configured slippage, market impact, and account-specific fees are not modeled.
- Provider data may be subject to revisions or vendor outages.
- This report is generated from pipeline artifacts, not manually curated notebook output.
- Expected returns and covariance estimates are backward-looking and depend on the configured historical window.
- Transaction costs and configured slippage are modeled as simple bps assumptions; taxes, spreads beyond configured slippage, market impact, and account-specific fees are not modeled.
- FX-adjusted returns, MXN/NOK reporting layers, UCITS comparisons, and tax-aware domicile analysis are deferred follow-on work.
- Benchmark and portfolio analytics reflect the configured universe and selected benchmark (VT) only.
- Contribution-only realized holdings drifted outside configured caps under soft realized-constraint handling; see the realized constraint warnings table (max breach 0.0386).