Product / Model Cards
Model cards Matchup Engine

Matchup Engine

Pitch-type profiles for every pitcher and hitter plus the league platoon split, combined into a calibrated edge.

Supports: Which reliever faces which hitter when the choice is close (the seventh-inning lefty, the pinch hitter), and how our 2027 lineup lines up against a rival’s staff. Refresh: Weekly in season Open Matchup Engine

What it predicts

Run value per pitch in a batter–pitcher matchup.

Inputs

  • Pitcher usage by batter side and expected run value by pitch group (2025–26)
  • Hitter run value vs. each pitch group by pitcher hand (2025–26)
  • The Winter Plan’s 2027 bullpen and lineup (decisions feed); each rival’s pending free agents

Method

  • Hierarchical: each value = overall quality (shrunk with ballast measured from how profiles repeat 2024 → 2025) + the pitch-type interaction (shrunk with the ballast that predicted 2025 best)
  • Platoon: a hitter’s split by pitcher hand is shrunk toward the league’s split for hitters on his side, by pitch group, not toward zero (the earlier design got same-side matchups backwards)
  • Edge = Σ usage × (pitcher value − hitter value)
  • Calibration factor set on 2024 → 2025; tested forward on 2025 profiles → 2026 outcomes, with bootstrap intervals for what the platoon split and the pitch-type layer each add
  • Recency: a weight on the later profile season (1×–3×) tuned on 2023–24 profiles → 2025 (2023 Statcast, every setting re-measured on 2023 → 2024) and tested on 2024–25 → 2026 against equal pooling; adopted only if it wins out of sample
  • Their staff: a rival’s pitchers who are pending free agents are left out by default, so the lineup view weights arms under control for 2027
  • Bullpen grid: “best fit” = a reliever’s edge against this hitter minus his usual edge, the matchup-specific part

How well it works

Computed by the pipeline from the data on this site

Backtest: 2025 profiles → 2026 matchups
20,170 pairs, 305,778 pitches
Correlation with outcomes
Overall quality only r = 0.0789 · + league platoon split r = 0.0853 · + pitch types (the full model) r = 0.0855 What the platoon split adds: +0.0017 to +0.0110 in r, clear of zero. What pitch types add: −0.0007 to +0.0012, not distinguishable from zero (95% intervals, 500 bootstrap resamples of pairs).
Calibration
Every displayed edge is scaled by 0.79, set on 2024 → 2025 (raw edges were too large). On 2026, actual edges ran 0.91× the displayed ones: still about 9% large.
Recency weighting: tuned on 2023–24 profiles → 2025, tested on 2024–25 → 2026 (21,151 pairs)
Tuning: 1.00× r = 0.0942 · 1.25× r = 0.0952 · 1.50× r = 0.0959 · 2.00× r = 0.0963 · 3.00× r = 0.0961. Test: equal pooling r = 0.0865, slope 0.89; 2.00× r = 0.0864, slope 0.86 (r gain −0.0023 to +0.0023, 95%). The page keeps equal pooling: the weight did no better out of sample.

Data: Statcast 2024–26: shrinkage set on 2024 → 2025, scored on 20,170 2026 batter–pitcher pairs (305,778 pitches).

What it can't see

  • Sequencing, location and fatigue aren’t modeled; there is no day-of availability (the data end with the season).
  • Single matchups are noisy; edges matter only when the decision is otherwise close.
  • The pitch-type layer isn’t distinguishable from zero in the forward test: most of any edge is who’s better, then platoon.
  • Pitchers’ own platoon splits aren’t modeled beyond the league split.
  • Profiles pool 2025 and 2026 pitches equally unless a recency weight beats that out of sample (the test is below and on the Matchup Engine page). Hitter values aren’t park-neutral and pitch values aren’t count-adjusted; neither is tested.

How we'd measure impact

  • Run value of matchup-driven bullpen choices vs. the manager’s defaults
  • Same-side vs. opposite-side outcomes against the model, 2027
Keystone is an independent portfolio project. It is not affiliated with Major League Baseball or any club. Data: MLB Stats API, Baseball Savant, FanGraphs. Used under their terms for individual, non-commercial use.