Sortino ratio
Higher than the S&P 500's 0.87 and QQQ's 1.06 in the same modern window.
ETF RESEARCH NOTE · AUGUST 2026
The research case for combining momentum and semiconductors with a deliberately large allocation to physical gold.
See what the test found ↘THE REFERENCE MIX
40 / 30 / 30
Monthly rebalancing in the full research engine.
THE RESULT, IN CONTEXT
From SPMO's October 2015 inception through the 2026 research cutoff, the monthly-rebalanced 40/30/30 mix produced the strongest risk-adjusted result in the study's concentrated three-fund family.
ANNUALIZED RETURN
Oct. 12, 2015 → 2026 cutoff
monthly rebalanced · total return
Research engine used adjusted total-return data and a 3% risk-free rate. Figures are historical, before personal taxes and trading frictions.
Higher than the S&P 500's 0.87 and QQQ's 1.06 in the same modern window.
Shallower than the S&P 500's −33.7% and QQQ's −35.1% in the test.
An initially weighted $10,000 grew to $20,249 versus $14,851 for SPY from Aug. 2024 to Aug. 2026. This check was not rebalanced.
WHY THE PIECES FIT
30% · SPMO
SPMO selects high-momentum names from the S&P 500 and reconstitutes twice yearly. It turns broad U.S. equities into a rules-based leadership sleeve.
30% · SMH
SMH adds a deliberate semiconductor bet. That powered the recent record, but it also creates sector and single-regime concentration that can cut both ways.
40% · GOLD
Gold was the genuine diversifier in the research. It reduced downside in the tested equity shocks and improved the full-window risk-adjusted result.
THE CENTRAL IDEA
“The gold is not dead weight. It is what lets the growth sleeves stay aggressive without making the entire portfolio one bet.”
ONE STRATEGY, TWO SETTINGS
22.8% CAGR
Best fit when the goal is a smoother path, not maximum upside.
23.9% CAGR
A growth choice—not proof of better future odds.
PUT GOLD IN THE RIGHT WRAPPER
PHYS and IAUM both provide physical-gold exposure. The better wrapper can change with the tax treatment of the account.
Choose the tax option—if you will do the paperwork.
A U.S. taxable holder who makes a timely QEF election may preserve long-term capital-gain treatment rather than the higher collectibles-rate category commonly associated with physical-gold trusts.
Choose the lower carrying cost when the QEF advantage is not doing work.
Sprott says the PFIC/QEF treatment generally applies to taxable accounts, not qualified retirement accounts such as IRAs. In that wrapper, IAUM's lower sponsor fee becomes the cleaner comparison.
WHAT THE BACKTEST DID NOT PROVE
The 40/30/30 mix beat both SPY and QQQ in about 38% of the observed rolling three-year windows.
About 40% of overlapping five-year windows beat both. These are descriptive windows, not independent odds.
The seven-year result was about 36%. One strong full-period result can coexist with many losing subperiods.
SPMO launched in October 2015. Anything earlier requires a proxy, and proxy history is not actual fund history. The long-history proxy test did not find a three-fund mix that reliably beat both benchmarks.
SPMO can lean into the same large growth leaders that drive SMH. The combination is diversified by ticker count, but not necessarily by economic exposure.
Rankings reversed between 2015–2020 and 2021–2026. In 200 small ±5% weight perturbations, the base ranking flipped 82.5% of the time.
The tested monthly regime-switching system underperformed the static allocation. Whipsaw and missed V-shaped recoveries overwhelmed the intended protection.
HOW WE TESTED IT
Adjusted prices incorporated distributions rather than comparing price-only lines.
Month-end targets snapped to actual trading days.
Every candidate faced both the S&P 500 and QQQ—not whichever benchmark was easier to beat.
CAGR, drawdown and Sortino were reimplemented from scratch; the verification passed.
FOR THE ENGINEER
Give this prompt to Codex inside a clean repo—or point it at an existing research project. It asks for the data, code, tests, robustness work, and audit trail needed to challenge the thesis properly.
etf-research-prompt.md
You are a senior quantitative software engineer working in my local repository. Build a reproducible, audit-friendly Python research package to test whether static ETF combinations can beat BOTH SPY (S&P 500) and QQQ (Nasdaq-100) over long holding periods.
OBJECTIVE
Evaluate three-sleeve portfolios made from:
- Gold: PHYS or IAUM
- U.S. momentum: SPMO
- Semiconductors: SMH
The incumbent is 40% gold / 30% SPMO / 30% SMH. Also include 20% gold / 50% SPMO / 30% SMH as a named growth-tilt comparator. Do not assume either is optimal.
WORKING RULES
1. Begin read-only. Inspect the repo for existing data, code, tests, assumptions, and prior results. Preserve unrelated work.
2. Use Python 3.12+, pandas, numpy, scipy, pyarrow, pytest, and a documented market-data adapter. Pin dependencies.
3. Use adjusted total-return daily data. Cache the raw response and normalized parquet with retrieval timestamp, provider, symbols, date range, and checksum.
4. Fail loudly on missing tickers, duplicate dates, suspicious nulls, stale data, currency mismatches, or a requested sleeve being silently dropped. Never substitute a ticker without an explicit flag and disclosure.
5. The primary direct-history test begins on 2015-10-12, when all required live funds have data. Keep all pre-inception proxy tests separate and clearly labeled.
6. Rebalance monthly. Snap month-end labels to actual trading days. Include a buy-and-hold sensitivity check.
7. Use SPY and QQQ as separate total-return benchmarks. A “joint win” requires beating both over the same window.
PORTFOLIO SEARCH
- Generate a configurable 5-percentage-point grid whose weights sum to 100%.
- Default constraints: gold 10–50%, SMH 10–40%, SPMO 20–70%.
- Report the unconstrained frontier separately so recent SMH concentration cannot silently dominate the recommended set.
- Never rank on CAGR alone. Produce Pareto views for joint benchmark win rate, CAGR, Sortino, and maximum drawdown.
METRICS
- CAGR, annualized volatility, Sharpe, Sortino, maximum drawdown, Calmar, downside deviation, CVaR 5%, turnover, and benchmark excess return.
- Use a configurable risk-free rate; default to 3% and run 0%/3%/5% sensitivity.
- Compute rolling 3-, 5-, 7-, and 10-year annualized returns and the percentage of windows that beat SPY, QQQ, and both.
- State prominently that overlapping rolling windows are descriptive observations, not independent probabilities.
ROBUSTNESS
- Walk-forward analysis with at least two non-overlapping eras plus expanding-window selection followed by untouched out-of-sample evaluation.
- At least 1,000 weight perturbation trials of ±5 percentage points, preserving valid sums and constraints. Report rank-flip frequency.
- Stress tables for Q4 2018, the 2020 crash, the 2022 bear market, and any other objectively defined period in the available data.
- Sensitivity to monthly vs quarterly rebalancing, fund expenses, 0/5/10 bps trading friction, and reasonable tracking error.
- Bootstrap or block-bootstrap confidence intervals where methodologically defensible; explain limitations.
ACCOUNT LOCATION / TAX ANALYSIS
- Keep market-performance analysis pre-tax. Add a separate U.S.-investor account-location module.
- For taxable brokerage, model PHYS only under explicit scenarios: timely QEF election with annual Form 8621, missed/no QEF, and tax-preparer cost. Do not claim the favorable treatment is automatic.
- For tax-advantaged accounts, compare PHYS with IAUM primarily on fee drag, structure, liquidity, and premium/discount behavior. Verify current fees and tax rules from official issuer and IRS sources at runtime.
- Clearly label tax output educational, jurisdiction-specific, and subject to professional review.
REQUIRED ARTIFACTS
- README.md with exact setup and rerun commands
- pyproject.toml and locked dependencies
- config/default.yaml containing dates, weights, constraints, costs, and risk-free rate
- src/ package with separate data, portfolio, metrics, rolling-window, robustness, tax-scenario, and reporting modules
- tests/ covering weight sums, rebalance dates, return math, drawdown, missing-data failure, benchmark alignment, and no-look-ahead behavior
- data/manifest.json and cached parquet (or a documented fetch command if licensing prevents redistribution)
- results/summary.csv, rolling_windows.csv, walk_forward.csv, robustness.csv, stress.csv, and account_location.csv
- results/report.md with an executive summary, methods, findings, caveats, and links to every generated artifact
- output/index.html with accessible charts and tables; no external CDN dependency
ACCEPTANCE GATES
- Run formatting, linting, type checking, and pytest.
- Independently reimplement CAGR, Sortino, and max drawdown in a verification module and compare within stated tolerances.
- Confirm every chart number traces to a saved result row.
- Show the exact data cutoff and whether results are direct fund history or proxy history.
- Do not present any allocation as a forecast, guarantee, or adopted recommendation. If no mix reliably beats both benchmarks, say so plainly.
Before editing, summarize the repo state and the implementation plan. Then build the full pipeline, run it, fix failures, and return the final evidence table plus the exact commands needed to reproduce it.PRIMARY SOURCES
Fund details and U.S. tax references were refreshed in August 2026. Historical results come from the local research archive completed June–August 2026.