Ben Gratz baseball analytics & pitch modeling

Models built from pitch-level Statcast data, not just box scores.

I build metrics and tools that quantify what actually makes a pitch effective — from batter discomfort to full arsenal design — and validate them against real outcomes rather than intuition.

r = −0.39 BDI correlation with held-out xwOBA 93.6% of 2025 xwOBA variance explained by SkwOBA 78.9% ranking concordance, PAOM's swap engine

Batter Discomfort Index (BDI)

python · pybaseball · mlb statcast

Most pitch-quality metrics grade a pitch by its physics — velocity, spin, movement — and stop there. BDI instead asks how uncomfortable the pitch actually made the batter, measured two ways: how much it threw off their swing mechanics, and how often it fooled them into chasing a pitch outside the zone they normally wouldn't.

R² = 0.152vs. held-out xwOBA
r = −0.390discomfort ↑, production ↓
726K+2025 pitches modeled

SkwOBA & OOE: skill-based pitcher evaluation

stata · baseball savant

A decomposition of pitcher xwOBA into the underlying skills that produce it — strikeout-minus-walk rate, weak-contact rate, and barrel rate — to separate repeatable skill from outcome noise, plus a companion metric for how much of a season was luck.

93.6%of xwOBA variance explained
5 / 8seasons outperforming lagged xwOBA
2015–25seasons of data used

Pitch Arsenal Optimization Model (PAOM)

python · pandas · scikit-learn · mlb statcast

A recommendation system for pitchers' repertoires — which pitches to throw more, which to drop, which new pitch to add — built on a historical-precedent engine that finds real pitchers who made the same change and predicts outcomes from what actually happened to them.

78.9%ranking concordance, swap model
4,381historical arsenal-change events
459pitchers scored, 2025