| variant | tune CAGR | tune DD | tune PF | test CAGR | test DD | test PF | full CAGR | full DD | 2026 |
|---|---|---|---|---|---|---|---|---|---|
| base | +13.91% | 36.6% | 1.44 | +17.71% | 29.0% | 1.44 | +14.34% | 36.6% | +3.9% |
| c_w30 | +16.14% | 36.3% | 1.48 | +18.12% | 25.9% | 1.48 | +15.67% | 36.3% | +6.4% |
| c_w40 | +13.81% | 37.4% | 1.41 | +14.33% | 32.2% | 1.41 | +14.61% | 37.4% | +8.2% |
| c_w60 | +17.29% | 39.2% | 1.52 | +17.79% | 30.8% | 1.52 | +17.20% | 39.2% | +17.6% |
| c_w70 | +16.20% | 36.2% | 1.47 | +17.17% | 29.5% | 1.47 | +16.15% | 36.2% | +11.9% |
| b_tilt | +16.75% | 38.0% | 1.42 | +13.95% | 26.1% | 1.42 | +16.06% | 38.0% | +2.0% |
| a_k4 | +19.06% | 33.6% | 1.55 | +20.35% | 22.6% | 1.55 | +15.05% | 33.6% | +38.9% |
| a_k6 | +18.39% | 34.6% | 1.46 | +18.15% | 26.2% | 1.46 | +13.53% | 34.6% | +32.8% |
| a_k8 | +22.60% | 30.8% | 1.67 | +28.06% | 19.4% | 1.67 | +18.85% | 30.8% | +30.7% |
Baseline (base): test CAGR +17.71%, PF 1.44, DD 29.0%
Selection gate (tune window ONLY): tune CAGR >= base+1.5pp AND tune DD <= base+5pp AND tune PF >= base PF.
Passes gate on tune: c_w30, c_w60, c_w70, a_k4, a_k6, a_k8
- c_w30: tune +16.14% (req +15.41%) | test +18.12% | DD tune 36.3%
- c_w60: tune +17.29% (req +15.41%) | test +17.79% | DD tune 39.2%
- c_w70: tune +16.20% (req +15.41%) | test +17.17% | DD tune 36.2%
- a_k4: tune +19.06% (req +15.41%) | test +20.35% | DD tune 33.6%
- a_k6: tune +18.39% (req +15.41%) | test +18.15% | DD tune 34.6%
- a_k8: tune +22.60% (req +15.41%) | test +28.06% | DD tune 30.8%
MC gauntlet (winners only, seed 20260820)
| variant | baseline | null mean | null max | p | boot 95% CI | P(loss) |
|---|---|---|---|---|---|---|
| a_k8 | +2923.8% | +1081.9% | +1662.3% | 0.000 (0/40) | [2,609k, 5,469k] vs realized 3,024k | 0.000 |
| a_k4 | +1492.7% | +1027.0% | +1953.7% | 0.050 (2/40) | [1,296k, 2,840k] vs realized 1,593k | 0.000 |
a_k4 sits exactly at the p=0.050 false-discovery cliff (2 of 40 null permutations already beat it) — rejected despite passing the tune gate.
Decision memo
- ADOPT candidate a_k8 (top-8 cross-sectional entry overlay): passes tune gate (+22.60% vs +13.91%), test CAGR +28.06% (+10.3pp over baseline, +10.3pp over best calibration c_w60), test DD 19.4% (vs 29.0%), PF 1.67 (vs 1.44), MC 0/40 null beat it (p=0.000), P(loss)=0.000. Edge is broad-based, not single-year: 2022 +4% vs −10%, 2024 +33% vs +16%, 2025 +28% vs +39%, 2026 +31% vs +4%; 59/59 symbols still traded; 1559 vs 1576 trades (selection quality, not pick count).
- Candidate B (b_tilt) rejected: test 13.95% < base 17.71% — the regime tilt does not survive the held-out window even though it looked good on tune.
- Calibration C: w5=0.6 is the best single reweight (+17.79% test, full 17.20%) but does not beat a_k8 and adds no mechanism; keeping w5=0.5 with the a_k8 overlay.
- Ledger entries added: b_tilt (regime-weight tilt — test-fails), a_k4 (p=0.050 cliff), a_k6 (+0.4pp over calibration — complexity unproven).
Deployment — DONE (research → live, 2026-08-20)
execution/flagship_signal.pyblend_live()applies the a_k8 overlay after blending: per-bar rank ofcombinedwithin the pool (ml_active AND combined= 0.05), keep the top-8, gate the rest at entry. combined itself untouched (exits/stops never gated).
TOP_K=8,ENTRY_THRESHOLD=0.05.- Live h5/h21 legs re-extended and the blended traded cache rebuilt.
- Bug found & fixed during deploy: the h21 live leg was originally anchored
to the wrong base cache (h5), so the traded blend silently degenerated to ~h5.
extend_scores(horizon=21)now defaults to the h21 base cache; h21 leg rebuilt; final blend re-verified byte-for-byte against the validated researchbuild_topk(8)(59/59 symbols' ml_active identical, 0 combined diff bars). Last virtual bar: exactly 8 of 59 symbols entry-eligible. - No bot restart needed:
flagship_live.pyimports flagship_signal insidecmd_update, so the 16:15 ET cycle loads the fixed module.