The receipts · published verbatim from the working file
H2 exploratory results (train years only)
Labeled exploratory per the backtest spec; no holdout contact.
H2 Exploratory Results — TRAIN years only (2026-07-11)
EXPLORATORY, labeled per backtest-spec discipline. Predictor seasons 2015-2021 (2020 excluded); outcomes = next-2-season FanGraphs WAR; qualified batters; youth cohort = age 22-24 (June-30 baseball age). No weight tuning was performed; HOLDOUT (2022-2025 predictor seasons) remains untouched for the pre-registered confirmatory run. Code: catalyst/analysis/h2_exploratory.py (+ inline quality tests).
Finding 1 — CR v0 does NOT beat current WAR at ranking future
value. Reported plainly.
Spearman to next-2yr WAR, youth cohort (n=308): CR 0.416 vs WAR_t 0.542 (edge −0.13). All qualified (n=2,133): CR 0.289 vs 0.537. Top-10 picks/season mean next-2yr WAR: CR 5.80 vs WAR_t 7.43. Incremental: adding CR v0 to a WAR_t model: dR2 +0.004 (p=0.16) youth; +0.0002 (n.s.) overall. The v0 component set is largely redundant with WAR (RE24-family) or unstable (clutch); mild incremental signal only in baserunning (+0.14 partial), defense (+0.11), pitches/PA (+0.10).
Caveats: same-construct advantage (WAR predicting WAR); level- prediction framing favors the incumbent metric by construction; CR v0 lacked any contact-quality input (fixed below) and park adjustments (still missing).
Finding 2 — Contact quality (built from our own BIP data,
1.23M balls in play with launch params, 2015-2025):
H5 stability: ev95 (95th-pct exit velo) r = 0.880 — the most stable metric in the engine; xval (expected value on contact from launch speed/angle grid) 0.706; actual value on contact 0.526; luck_gap (actual − expected) 0.362. Process is more stable than results, and the gap is mostly transient — textbook, and consistent with the entire public xwOBA literature. 2024 xval leaders: Judge, Ohtani, Rooker, Soto (correct).
Finding 3 — THE ALPHA IS IN THE PROCESS-VS-RESULTS SPREAD.
Adding quality metrics to the WAR_t model (all qualified TRAIN, n=2,128; all coefficients per SD):
- ev95: +0.48 next-2yr WAR, t=+6.16, p<0.0001 — raw top-end power predicts future gains BEYOND current results. The BREAKOUT signal.
- luck_gap: −0.34 next-2yr WAR, t=−5.73, p<0.0001 — results outrunning contact quality predict decline. The FADE signal.
- xval conditional coefficient is negative (−0.52, t=−6.19) — suppressor structure with ev95/war_t (interpret the block jointly, not coefficient-by-coefficient); the working read: future improvers are those whose raw power exceeds what current results show ("unconverted power").
- Youth cohort: same directions, smaller n (308), luck_gap p=0.045, ev95 p=0.14.
Note: top-10-by-predicted-LEVEL barely changes (WAR dominates level ranking). The alpha is in RESIDUAL ranking — who out/under-performs their current price — which is exactly what the product sells (mispricing calls), not "who is best."
Implication for the signal engine (design consequence)
Reframe: CR-as-price stays results-anchored; the SIGNALS are spreads:
- Breakout flag ≈ high ev95 + negative/neutral luck_gap + (context layer: age, opportunity).
- Fade flag ≈ positive luck_gap + unexceptional ev95. Both are now statistically grounded on TRAIN data with |t| ≈ 6, and both have clean one-sentence narratives for calls. This converges with the Attention-Gap framework: process (quality) vs results (price) vs attention (coverage) — three spreads, one engine.
Addendum — pitcher exploratory (2026-07-11, TRAIN only, n=2,763)
Stuff-lite adds a detectable but thin edge beyond current WAR (+0.075 WAR/SD, t=2.21, p=0.027; dR2 +0.001). Raw stuff quintiles show a NEGATIVE war_delta spread (top −0.52 vs bottom −0.25) — role confounding: max-effort relievers dominate top-stuff quintiles and carry low WAR ceilings/high volatility. Also rediscovered: given FIP-based WAR, worse runs-allowed predicts bounce-back (+0.18/SD, t=4.5) — the classic ERA-vs-FIP regression, real but publicly well-known (low differentiation value). VERDICT: no pitcher signal is registrable yet. Future work: role-stratified analysis and year-over-year velocity/stuff DELTAS (the known "velo jump" breakout tell). Batter signals remain the launch content.
Queue this creates
- Park adjustments (luck_gap r=0.36 hints at park persistence; Coors etc.).
- Integrate quality_bat into the production components pipeline (currently an analysis-layer parquet).
- Pre-register the confirmatory H2: define breakout/fade labels, models, and success criteria BEFORE touching HOLDOUT 2022-2025.
- Pitcher analog: pitch-level extraction (velo/movement from playEvents) -> Stuff-lite; not yet extracted (bip pass covered batted balls only).
- MiLB: same xval/ev95 machinery on AAA Statcast (free) = the pre-consensus version of the breakout signal.