Fever BaseballFuture Value Radar (FVR) · On the record
RECORD: 0 HIT · 0 MISS · 11 OPEN · FIRST CALL RESOLVES AUG 12

The receipts · published verbatim from the working file

The EV95 of pitching — pre-registration

Frozen 2026-07-15 and pushed before the confirmatory touched a reserved-season pitch. Includes the way it can fail, stated first, and a pre-committed reading of the counter-test.

Last changed

Pre-registration — the EV95 of pitching (H-ARM)

Frozen 2026-07-15, before any 2022–2025 pitch was examined for this question. The git timestamp of this file is the freeze receipt. One confirmatory run; results published regardless.

Motivation

The hitter engine rests on a split the whole site is built to keep visible: how a ball was struck (EV95) is a fingerprint — it persists year over year and predicts future production — while what resulted from that contact (wOBA) is half luck and regresses. H2 confirmed it out of sample and the boards rank on it.

Pitching has the same split, louder. A pitcher's ERA is the biggest number on his card and the least his own: it is routed through eight fielders, a park, a bullpen that inherits his runners, and a sequence of leverage he did not pick. If EV95 is "how hard he hit it, before the defense and the luck," the pitcher's analogue is how often he beat the bat, before the defense and the luck — and the one pitch-level number that captures it is CSW%: Called Strikes plus Whiffs, per pitch (Pitcher List, 2019 — the hobby's one-number stuff metric).

The claim under test: CSW% is the EV95 of pitching. It persists where ERA does not, and it knows more about next year's ERA than this year's ERA does.

Exploratory findings (TRAIN pairs 2015→16 … 2020→21, n=1,551)

Run in catalyst/analysis/arm_exploratory.py, guarded against reading any reserved season. Sample: pitcher-seasons with ≥500 pitches in the predictor year and ≥100 batters faced in the outcome year.

Run prevention barely persists; the process is a fingerprint. Year-over-year self-correlation:

fb_velo   +0.923      k_pct   +0.680
swstr_pct +0.709      bb_pct  +0.477
csw_pct   +0.643      ra9     +0.164   <- ERA barely repeats

A pitcher's ERA in one year tells you almost nothing about his ERA the next (r=0.16). His CSW% repeats at 0.64 — four times more of a skill.

CSW% predicts next year's ERA better than ERA does. Correlation with year-Y+1 RA9:

csw_pct   r = -0.271      (higher CSW -> lower future ERA)
ra9       r = +0.164
swstr_pct r = -0.236
fb_velo   r = -0.116

|−0.271| > 0.164: the whiff-and-called-strike rate out-predicts the ERA itself. Head-to-head R² predicting next-year ERA: CSW% alone 0.074, ERA alone 0.027 — CSW carries ~2.7× the signal. Adding ERA on top of CSW (0.078) barely moves it.

The primary model, on train:

z(ra9_next) ~ z(ra9) + z(csw_pct)      (n=1,551, R² 0.078)
  ra9       beta +0.070   p=0.0086
  csw_pct   beta −0.245   p<0.0001

Controlling for this year's ERA, CSW% still carries a large negative coefficient — pitchers who miss more bats give up fewer runs next year, above and beyond where their current ERA sits. Current ERA's own coefficient collapses to +0.07.

It holds within role. CSW beats ERA at predicting next-year ERA for starters (|r| 0.361 vs 0.206) and relievers (|r| 0.234 vs 0.120).

The foul-tip choice is immaterial. CSW% without foul tips (the standard definition) predicts at R² 0.0737; with them, 0.0777. We freeze the standard definition.

The metric, defined exactly (frozen)

CSW% = (Called Strike + Swinging Strike + Swinging Strike (Blocked))
       / total pitches

from description strings in pitches_<season>.parquet. Foul tips excluded. Computed per pitcher-season, ≥500 pitches to qualify.

PRIMARY hypothesis (H-ARM-1, confirmatory)

On the reserved seasons, untouched at freeze time:

z(ra9_next) ~ z(ra9) + z(csw_pct)

Sample: pairs with predictor seasons 2022, 2023, 2024 (outcomes 2023, 2024, 2025), pooled. Pitchers with ≥500 pitches in the predictor season and ≥100 batters faced in the outcome season. RA9 = 9 × runs_allowed / innings, from components_pit.

SUCCESS = the csw_pct coefficient is NEGATIVE and two-tailed p < 0.05. Anything else — wrong sign, or p ≥ 0.05 — is a MISS and is published exactly as a hit would be.

Why this outcome and this control: RA9 is run prevention, the thing a fan reads off the card and the thing most contaminated by defense and luck. Controlling for current RA9 is the hard test — it asks whether the process number adds information beyond the result everyone already has. A bare correlation of CSW with next-year ERA could just be "good pitchers stay good"; the residualised coefficient cannot.

SECONDARY (reported, with criterion)

The headline claim, stated as a number: CSW% out-predicts current ERA.

|corr(csw_pct_Y, ra9_{Y+1})|  >  |corr(ra9_Y, ra9_{Y+1})|,  pooled.

SUCCESS = the inequality holds. On train it was 0.271 vs 0.164.

TERTIARY (reported, no criterion)

  • Year-over-year stability of csw_pct, swstr_pct, fb_velo, ra9 on the reserved seasons (does the process-vs-results gap in persistence reproduce out of sample?).
  • Head-to-head R² (ERA / CSW / SwStr / ERA+CSW) predicting next-year ERA.
  • The role split (SP vs RP), reported.
  • The arm gap. Expected ERA from process (csw + velo + bb%), gap = actual − expected, and next-year ERA change by gap quintile. This is the product framing — the "results haven't caught up / are running ahead of the stuff" signal, the pitcher analogue of the hitter luck gap. It is reported, not a criterion, and it is PARTLY MECHANICAL: the gap contains a +RA9 term and the next-year change contains a −RA9 term, so some of the negative correlation is regression to the mean by construction. It is here to show the shape, not to claim a validated signal — see the pre-commitment below.

Pre-committed reading of the counter-tests

Two things are written down before the numbers exist, so the conclusion can't be shopped afterward:

  1. If ERA's own coefficient in the primary model is itself large and significant — specifically if |beta_ra9| ≥ |beta_csw| — I will NOT write "ERA barely matters." The claim I am entitled to on a pass is only that CSW adds independent predictive power (its own negative, significant coefficient), not that current ERA is worthless.

  2. The arm gap is a presentation of the primary finding, not a separate validated signal. Any future claim that "the arm gap out-predicts plain next-year-ERA regression" — i.e. that a board ranked on the gap beats a naive baseline — is a NEW hypothesis and needs its own pre-registration and its own reserved data, exactly as H-SPG needed one after H-SP. A pass here does not license ranking pitchers by the gap.

The way it can fail

Stated plainly, before the run:

  • CSW% could be a train-era artifact. The 2015–2021 pitch-tracking regime (TrackMan into early Hawk-Eye) classified description strings and pitch types under conventions that could differ enough by 2022–25 to shift the metric. If the description vocabulary moved, CSW% moves with it and the coefficient could wash out.
  • The 2023 rule changes sit inside the holdout. The pitch clock, the shift ban, and bigger bases changed the run environment mid-window (2022 old rules; 2023–25 new). The confirmatory tests CSW→ERA through that discontinuity. If the relationship is fragile to a changed environment, this is where it breaks — which is a feature of the test, not a bug, but it is a real way to get a MISS.
  • Individual-pitcher ERA is intrinsically noisy (stability r≈0.16), so every R² here is small by construction. If the reserved seasons are a hair less kind than the train ones, a 0.271-vs-0.164 margin could narrow past the SECONDARY inequality even while the PRIMARY holds. Both can miss independently.

Caveats declared in advance

  • Season isolation is imperfect, and I will not pretend otherwise. Eleven seasons exist and prior studies have spent most of them. 2022–2023 were H2's confirmatory holdout (contact quality → WAR, no pitch-level or CSW term anywhere). 2024–2025 were H-BT's train years (hitter bat-tracking). What has never been computed on any reserved season, by anyone here, is a pitcher process → next-year run prevention relationship: no pitch-level pitcher metric has touched 2022–2025 in this repo before this freeze.
  • 2026 is excluded — the season is in progress and has no components_pit_2026 (no pitcher outcome table yet), so the last usable pair ends in 2025.
  • 2020 (the 60-game season) is a train-only concern; it is in the exploratory pool, not the confirmatory.
  • CSW% and velocity are correlated (both are "stuff"). The primary controls only for ERA, not velo. CSW is offered as the single-number hook, not as a signal orthogonal to velocity; the head-to-head and stability tables report velo alongside so the reader sees the overlap.
  • Reliever/starter pooling. The primary pools both; the split is reported. On train the finding held in each role.
  • One evaluation. No re-runs, no threshold shopping. The script is catalyst/analysis/arm_confirmatory.py, committed in the same commit as this file, before it is run.

Integration gate

If PRIMARY passes, CSW% earns the right to become a published, declared pitcher number and the basis of a watch surface — and nothing more. Concretely, a pass authorizes designing (separately, built and ratified on its own terms):

  • adding csw_pct to catalyst/frames.py with its unit, scale, sense (+1: higher CSW is the engine reading him better), and as_of, and a /legend entry — because a new published number that isn't declared is the bug this repo is named for;
  • an "MLB Arms" context board / player-page treatment that prints CSW% as the pitcher's process fingerprint the way EV95 is the hitter's, and shows the process-vs-ERA relationship honestly (elite CSW behind an ugly ERA = the results haven't caught up; the reverse = riding a result the stuff doesn't support).

A pass does NOT authorize:

  • ranking pitchers as prospects, or filing pitcher calls — that requires the pre-registered pitcher-outcome validation program already banked, and this study is not it;
  • ranking on the arm gap (its own pre-registration, per the pre-commitment above);
  • any change to a live board tonight. The surface is a watch/context board, explicit that we do not yet file arm calls — the honest analogue of the AAA watchlist, not the graded hitter boards.

If PRIMARY fails, the finding dies in public, CSW% does not enter the site as a signal, and the pitcher pages stand as they are.