Backtest framework
The empirical engine. Rigorous, conservative, and designed to avoid the classic backtesting traps.
Universe
S&P 500 constituents
Point-in-time membership where possible; survivorship-bias minimised.
Period
Feb 2007 → Feb 2026
19 years covering GFC, EU debt crisis, COVID, AI rally.
Rebalance frequency
Monthly
Month-end signals, daily P&L tracking until next rebalance.
Accounting lag
2-3 months
Fundamental data only used after the 10-K publication date.
Positions
Top decile, capped at 40
Concentrated enough for conviction, diversified enough for stability.
Weighting
Quality-proportional
Higher-quality stocks get larger weights.
Bias prevention
- ✓Look-ahead bias: fundamentals used with a 2-month publication lag; momentum uses prices strictly before the signal date.
- ✓Survivorship bias: delisted tickers retained in the universe where data is available.
- ✓Data-snooping: parameters fixed ex-ante from the QMJ paper; no walk-forward optimization.
- ✓Outliers: cross-sectional rank z-scores rather than raw values—robust to fat tails.
- !Transaction costs: not modelled. The reader should subtract ~10-25 bps/year for a retail implementation, less for institutional.