iteration 11 · 2026-07-23 · P2 · laptop-drives-bigblack
🎲 #9 PBO / CSCV GROUNDED
Probability of Backtest Overfitting: if you pick the in-sample winner, does it stay a winner out-of-sample — or is it a coin flip? All seven §7 gates now pass, robust across 6 seeds. This supersedes the iter-10 checkpoint — the PBO-null calibration the operator descoped from #0 is closed.
null 0.51
exchangeable ≈ chance ✓
0.0 / 0.52
PBO: skill vs noise
Preflight (resource-only): load1 0.28 · 42 GiB available · si/so ~0 · ClickHouse active, readonly=2. 5c/5G/no-swap capped, single-thread BLAS.
The seven gates
| Gate (§7 row 9) | Result | Target | |
| Exchangeable null ≈ .5 | 0.514 (full within-block shuffle) | [.42,.58] | PASS |
| Overfit-noise high & fires | median 0.516; fire@.2 = 0.967 | ≥.45 & fires ≥.95 | PASS |
| Genuine-skill low & power | median 0.0, power 1.0 | ≤.10 & ≥.8 | PASS |
| AUC (skill vs noise) | 1.00 | ≥.90 | PASS |
| Known-duplicate | \|ΔPBO\| 0.005 | < .05 | PASS |
| Purge lifts PBO | 0.44 (0.00 → 0.44) | ≥ .25 | PASS |
| Harden — magnitude gate | 2 sub-cost + 3 supra-cost, all PBO 0 | pairing load-bearing | PASS |
Seed-robustness (verify-before-report): 6 seeds at K=100, all GROUNDED 7/7 — fire@.2 ∈ [.958,.983], null ∈ [.474,.514], purge ∈ [.43,.53], dup < .006.
Three structural fixes (found by attacking each number, not moving thresholds)
- Within-block-mean IC artifact (the load-bearing bug). Per-block IC was
mean(a·b) on globally-zranked values; block-permutation preserves the non-zero block-means, so each cell ≈ μfeat(b)·μtarget(b) — a cross-block-correlated signal that pushed even the exchangeable null below chance. Fix: a within-block centered correlation.
- The chance null must be maximally exchangeable. A block-preserving permutation keeps 100-bar autocorrelation intact, and CSCV misreads persistence as pseudo-skill (null 0.34). A full within-block shuffle restores it to 0.51. The 0.34 is kept as a documented autocorrelation-sensitivity — the trial statistic must ride on the leakage-free #0 CPCV substrate.
- CSCV/PBO is a MANY-TRIALS estimator. K=6 was its biased regime (raising blocks S made it worse). K=100 (the real SFI matrix has 100+ trials) tightens the noise distribution so the finite-trial gates clear for every seed.
Two calibration decisions (documented, not p-hacked)
- Fire threshold = the instrument's own §7 Admit bound. "Fires on noise" = would reject; §7 Admit is PBO<0.2, so fires ⟺ PBO ≥ 0.2. The arbitrary 0.30 is kept as a stricter sensitivity (fire@.3 = 0.85).
- K raised only after seed evidence. At K=60, seed 101 gave fire@.2 = 0.942 → NOT-GROUNDED. Rather than pick a lucky seed or lower the 95% bar, K was pushed further into the correct regime until the gate cleared for all seeds.
Operating-envelope finding. PBO is fooled by raw autocorrelation (block-perm null 0.34 << chance): an un-purged, autocorrelated performance series reads as "robust." The purge gate (lift 0.44) is the guard — and the reason #9 must consume #0's purged CPCV folds, never raw per-bar performance.