Most published ML trading strategies die on contact with three questions: was the model retrained only on the past? was the test window touched during development? and what does a permutation null say? This post documents a system built to answer all three affirmatively, plus the unglamorous findings that made it work.
Architecture
Universe: 59 large-cap US names (every 10th name of the S&P list, plus eight mega-caps), twenty years of daily data.
Signal stack, per name:
- ~100 engineered features (trend lags, volatility structure, volume dynamics, calendar, market-relative and cross-sectional ranks), strictly causal through each day's close
- Gradient-boosted regression ensemble, retrained every 12 months on data strictly before the cutoff, predictions applied only after a 50-bar embargo
- Two horizons (5-day and 21-day forward returns) trained separately, then blended at signal level
- A cross-sectional entry overlay: on each bar, among eligible names, only the top-8 by combined score may enter; exits are never gated
The overlay deserves emphasis because it was found the honest way: it passed a pre-registered tuning gate on calibration data (+8.7pp over baseline), then delivered more on the untouched window than in tuning — test CAGR +28.06% vs baseline +17.71%, with drawdown improving from −29% to −19%. Selection quality over selection quantity: trade count barely changed.
The gauntlet results
On the held-out 2021–26 window, never used for any development decision:
| metric | value |
|---|---|
| CAGR | +27.9% |
| Sharpe | 1.26 |
| Max drawdown | −19.4% |
| Permutation null (40 shuffles) | p = 0.000 — zero nulls beat it |
| Trade bootstrap P(loss) | ≈ 0 |
Year-by-year breadth matters more than the headline: the overlay beat baseline in four of six years, including both bull (2024: +33% vs +16%) and chop (2022: +4% vs −10%).
Three findings that made the difference
1. The edge is name-concentrated. Rebuilding the identical pipeline on the full S&P cross-section (~450 names) collapsed the profit factor from 1.46 to 1.04. Three independent studies agree: this is not a broad anomaly, it is a specific book. Breadth does not scale it; it dilutes it.
2. Drawdown breakers can kill live edges. The original config locked trading below −35% total drawdown. Backtests showed that breaker retired the strategy for entire multi-year stretches while the edge was intact, costing hundreds of percent. Loosening to −50% preserved protection while letting a live edge breathe. Risk limits need their own validation.
3. Generalization has a price floor, not a guarantee. Re-running the whole pipeline on random unseen-name samples produced profitable portfolios every time — but at PF ≈ 1.25 rather than the flagship's 1.46, and below buy-and-hold. The universe itself carries part of the result. Honest accounting says so.
What it is not
Not market-neutral, not high-frequency, not ML magic. It is a long-biased rotation that happens to have real cross-sectional discrimination on one carefully-chosen universe, validated the boring way: frozen test windows, permutation nulls, full grids, and a ledger of everything that failed before it. The companion post describes that protocol end-to-end.
All figures are backtests plus paper-trading deployment; nothing here is investment advice.