Split IS<2023-01-01 / OOS>=2023-01-01 (fixed in advance). Long-only, next-open, 10bps one-way. OOS read once as confirmation.
| Variant | IS Sharpe | IS maxDD | OOS Sharpe | OOS maxDD | OOS ret | turn/yr |
|---|---|---|---|---|---|---|
| V0 BASE raw/H21/k10 | 1.05 | -48.8% | 1.64 | -18.4% | +170.0% | 8.3 |
| V1 +SMA gate | 1.07 | -54.8% | 1.37 | -25.2% | +170.6% | 10.9 |
| V2 resid+SMA | 1.07 | -54.8% | 1.37 | -25.2% | +170.6% | 10.9 |
| V3 +sector | 0.89 | -54.9% | 1.09 | -26.9% | +104.0% | 12.1 |
| V4 H42 | 1.00 | -54.3% | 1.38 | -25.5% | +157.6% | 7.4 |
| V5 k15% | 0.97 | -46.0% | 1.22 | -18.5% | +96.2% | 11.3 |
| V6 reversal-tilt | 1.00 | -53.7% | 1.01 | -24.8% | +83.0% | 17.0 |
| V7 vol12 | 0.84 | -23.5% | 1.02 | -16.9% | +42.9% | 6.8 |
| V8 vol18 | 0.90 | -30.8% | 1.03 | -19.1% | +62.2% | 9.1 |
| V9 thin-book | 0.81 | -55.2% | 1.06 | -29.8% | +107.9% | 12.5 |
IS winner on Sharpe: V1 +SMA gate (1.07).
- V1 +SMA gate: IS p=0.099, OOS Sharpe delta -0.27
- V2 resid+SMA: IS p=0.099, OOS Sharpe delta -0.27
- V3 +sector: IS p=0.598, OOS Sharpe delta -0.55
- V4 H42: IS p=0.296, OOS Sharpe delta -0.26
- V5 k15%: IS p=0.700, OOS Sharpe delta -0.42
- V6 reversal-tilt: IS p=0.443, OOS Sharpe delta -0.63
- V7 vol12: IS p=0.999, OOS Sharpe delta -0.62
- V8 vol18: IS p=0.994, OOS Sharpe delta -0.61
- V9 thin-book: IS p=0.725, OOS Sharpe delta -0.58
Verdicts (2026-09-09)
ADOPT: nothing. No variant clears the pre-registered bar (all IS p > 0.05), so per house rules nothing is promoted on ranking/hold/breadth.
- V1 SMA gate — INCONCLUSIVE, kept as philosophy. IS 1.07 vs 1.05 (p=0.099,
noise), OOS worse (1.37 vs 1.64). Kept ON as the multi-timeframe leg with
TESTBOT_SMA_GATE=0reproducing pure BASE. Costs turnover (10.9 vs 8.3/yr). - V2 resid — NULLO. Bit-identical portfolio to V1: under an equal-weight
market proxy, large-cap 126d betas sit near 1, so residualization is a
near-monotone transform of raw momentum and preserves ranks. Complexity with
zero benefit in this setup → default back to raw (
TESTBOT_MOM_MODE=residstays opt-in). Discrepancy vs live-eqmom docs (resid 1.61 vs raw 1.24) is scoped to their 501-name setup — live eqmom untouched; follow-up study on the delisting-inclusive universe before any claim there. - V3 sector demean — REJECT here. Hurts both segments (IS 0.89, OOS 1.09).
Default OFF (
TESTBOT_SECTOR_NEUTRAL=1opt-in). - V6 reversal-tilt — REJECT. The "mean reversion takes weight in chop/bear" hypothesis fails outright (OOS 1.01, worst DD-adjusted, turnover 17/yr). Agrees with the P5b PEAD reversal-blend rejection. Stays out; revisit only with a new mechanism, not a re-blend.
- V5 k15% — REJECT. Breadth dilutes (OOS 1.22 vs 1.37 at same DD).
- V9 thin-book proxy — REJECT as proxy. Half-sizing on dollar-volume alone
hurts; the full wall+thin overlay stays cited from
reports/equity_book_overlay.md (needs high/low the ADJ cache lacks).
TESTBOT_BOOK_OVERLAYdefault OFF, opt-in. - V7/V8 vol-target — INSURANCE, not alpha. Confirms the B5 trade: IS Sharpe
cost (0.84/0.90 vs 0.89) for DD halved (-23.5%/-30.8% vs -54.9%). Default
shadow-only (
TESTBOT_VOL_TARGET=0logs the scale, deploys full gross); set 0.12/0.18 to actually cut exposure. - V4 H42 — approved cost-fallback (turnover 7.4 vs 10.9/yr, OOS 1.38 ≈ V1), consistent with the existing H42/H63 fallback stance. Not default (H21 wins IS).
Caveats
- 99-name curated current-constituent universe → survivorship bias inflates absolute Sharpes. Compare P5a BASE OOS 1.07 on the 501-name delisting-inclusive universe for absolute claims; only relative ordering is used here.
- OOS 2023+ was megacap-momentum friendly; an earlier informal probe had already eyeballed OOS, so this read is confirmatory. 30d forward shadow still required before any live-testbot promotion.
- Regime deploy fractions were NOT applied in-study (isolated ranking question); the live testbot keeps them + log-only C7 hedge proxy.