I love stuff models, but I am also frustrated by stuff models. I desperately want to know WHY a pitcher’s specific pitch is great, and at the risk of writing something that sounds highly pejorative, I find that these models often have a “trust me bro” kind of feel to them. They’re picking up on subtleties of pitch shape interactions, but I want to know what those interactions are!
This is why I’m working on SMOKE, which stands for Stuff Model: Open, Knowledge Enhancing. The punctuation may change from iteration to iteration, but the principle will remain constant: A Stuff Model, that is transparent, good enough, and ideally, enhances our knowledge of what makes a pitch good. In the first post in this series, we looked at 4-Seam Fastballs, as well as Hard Cutters, please read that post first, as many of the things here build upon concepts introduced there.
Where There's SMOKE There's Fire
I’ve been on a mission to create a formulaic Stuff+ for all pitch types, with the goal of deepening our understanding of what makes a pitch great. I am somewhat far away from my research goals, but I’m making slow, incremental progress. Here was my first iteration, which I dubbed Fastball+ at the time:
An important caveat with SMOKE is that it relies heavily on pitch classification, however, that also aligns with how pitchers and batters approach pitch shapes. There is a lot of information packed into pitch classification, and it feels reasonable to me to leverage that information. We can also easily check how the models would re-interpret a pitch if it had a different classification. Another caveat is that it will likely fail (spectacularly) for pitchers like Tyler Rogers who break linear classifications.
Sinkers!!!!
My research for 4-seam fastballs went quite smoothly; my sinker research has been a very bumpy ride. Sinkers are weird. They mostly rely on managing contact quality, but some sinkers are intended to be whiff pitches (Hader, Chapman). They also act as completely different pitches depending on the platoon matchup.
My first iteration had a great formula, but it made Hader look terrible to same-handed batters. While I could simply caveat the result, it just didn’t sit right for me, so I’ve been mired in Sinker research for at least a month now. At long last, I came up with a formula I’m satisfied with, that’s simple enough to explain, and good enough to use (I think).
Platoon-Neutral “Stuff” Values
I look at each pitch thrown and subtract the luck-neutral value from the pitch, assigning the average value based on launch angle and exit velocity, 0.055 runs for a ball, and -0.073 runs for a strike of any kind. The Stuff number you’ll see is the surplus value that the pitch generated compared to the same pitch type, batter matchup, year and general location. It’s somewhat crude, but works well enough for this iteration. When I get through all the pitch types, I’ll revisit with a more robust methodology and we’ll see if it improves things. We’re modelling based off of macro trends with large samples, so simple averages work decently well here.
It’s important to note that the run values are platoon neutral, so although sinkers are much better against same handed opponents (about 1 run/100 pitches according to my estimates), we’ll ignore that for now. I tried adding back a platoon adjustment at the end, but that only made things worse for some reason. I can’t explain why.
What Makes a Sinker Good?
There are 2 ingredients which apply regardless of platoon matchup: Velocity and Estimated Spin Efficiency, though they work in different ways, depending on the matchup. Then for same-handed matchups, vertical movement deviation is key, and for oppo matchups, Net IVB is key. But before we dive in, we’ll need to go over some technical details:
Net IVB & Expected IVB for Sinkers
Not all movement is created equal. The pitcher’s arm slot will heavily impact the spin axis, which impacts the movement direction, so it’s helpful to contextualize the expected movement based on the release characteristics, and then compare the movement to that.
We can model the expected IVB for sinkers as follows:
xIVB = -19.4
- x_release * 0.28
+ z_release * 4.46
- pitcher_height_in * 0.32
+ extension * 1.84
+ velocity * 0.16
Net IVB = IVB/F - xIVB (IVB/F = IVB per 0.4 seconds)
The Spin Axis
We’ll need to unitize the spin vector to see how much the spin is impacting horizontal and vertical movement. This is fairly straightforward.
Spin Axis Z = -COS(RADIANS(spin_axis))
This essentially goes from +1 at 180° (pure backspin 4-Seam) to 0 at 90° (pure sidespin) to -1 at 0°/360° (pure topspin curveball). By converting to unitized spin, we can compare the vertical components.
Spin Axis X = SIN(RADIANS(spin_axis)) ** multiply by -1 for RHP **
Simple, straightforward math.
Ingredient #1 Velocity
I bucketed results into groups of 2 MPH, and at roughly 90 mph and below, we see a plateau for the loss of pitch quality, -0.6 runs/100 for same hand matchups and -0.4 runs/100 for oppo matchups. From there' it’s a pretty linear gain. Here’s the formula I use:
If [Batter Bats] = [Pitcher Throws] THEN
IF [Pitch Velo] <= 90 THEN -0.6
ELSE 0.162 * [Pitch Velo] - 15.136
END
ELSE
IF [Pitch Velo] <= 90 THEN -0.4
ELSE 0.105 * [Pitch Velo] - 9.8
END
END
You could probably tweak this and perhaps get a better result, but this was the version I settled on after many many hours of research. As I mentioned in the first SMOKE article, I will be thrilled if someone improves on this.
Ingredient #2 Spin Efficiency / Total Movement
Thinking in terms of total movement is more intuitive than spin efficiency, however, the formula worked slightly better with spin efficiency so I used that instead.
What we see here is very interesting: A lot of movement is good, period. But if your pitches have low total movement, you probably don’t want to throw many pitches to opposite handed batters.
Naturally, we see the same trend for estimated spin efficiency. The key principle is you either want to be as close to perfectly efficient (maximize movement), or have extreme gyro spin, and then avoid using it against opposite handed batters.
Here are the formulas I used for each version, starting with movement total.
If [Batter Bats] = [Pitcher Throws] THEN
0.13 * [mov_tot_nathan_f] - 2.25
ELSE
0.0315 * SQUARE([mov_tot_nathan_f]) - 1.015 * [mov_tot_nathan_f] + 7.8
END
Note that I’m using the estimated Magnus movement from Dr. Nathan’s spreadsheet. This is of course Magnus + SSW + weather + other factors (I think it removes drag). You’ll need the estimated Magnus movement for the next step.
For estimated spin efficiency here’s the formula:
If [Pitcher Throws] = [Batter Bats] THEN
1.79 * [Spin Efficiency] -1.39
ELSE
6.02 * SQUARE([Spin Efficiency]) -8.3 *[Spin Efficiency] +2.62
END
Ingredient #3 Vertical Movement Deviation
See above for how to calculate Spin Axis X and Spin Axis Z.
We’re going to estimate non spin based movement, using a simple methodology. First, we take the estimated non-drag movement from Dr. Nathan’s spreadsheet. Then we estimate the spin-based movement as follows:
movement_z_spin_axis = [Spin Axis Z] * [mov_tot_nathan]
That means, if we look at how much the pitch moved, how much would it have moved vertically, if the movement was based on the spin axis. This is very similar to using “spin axis shift” which I’ve been told is incorrect terminology, and have adopted this methodology, as it more aligns to the correct “movement deviation” lens.
movement_z_deviation = mov_z_nathan - movement_z_spin_axis
Number with negative deviation get more sink. Guys like Josh Hader will get positive deviation here, which may or may not mean that the non-Magnus effects are pulling the ball up.
We see a firm linear trend all the way down to about +1 inches of vertical movement deviation. It’s actually closer to +0.5 inches if we zoom in on the buckets. We also see that having a sinking sinker is generally very good, no matter the platoon, but is mostly irrelevant to opposite handed batters, except for the rare pitches with incredible sink.
We’re only going to use this for same-handed batters:
IF [mov_z_deviation] <= 0.5 THEN -0.213 * [mov_z_deviation] -1.17
ELSE 0.785 * [mov_z_deviation] - 1.55 END
It’s possible I’m being too aggressive with bonus at +0.5” of vertical movement deviation, but I was subjectively heavily influenced by Josh Hader living there and put my finger on the scale a touch to make sure his pitch graded well. It’s perhaps unscientific of me, but modelling Sinkers is part art, part science, or something like that.
Ingredient #4 Net IVB
See above for how to calculate Net IVB for sinkers.
Net IVB has a very strong relationship to movement Z deviation, and presents a very clear picture for opposite handed matchups: you want to be as far away from 0 as possible. Here’s the formula for opposite handed matchups:
Net IVB Value = 0.017* SQUARE([Net IVB (Sinker)]) -0.034 * [Net IVB (Sinker)] - 0.25
Mixing the Ingredients
The pieces are all heavily correlated, so I tried a hundred different variations, using simple multiple linear regressions, trained on pitcher seasons. I settled on the following version:
SAME HANDED MATCHUPS:
0.0047
+ 0.816 * [value_velo]
+ 1.01 * [value_spin_efficiency]
+ 0.689 * [value_movement_z_deviation]
OPPOSITE HANDED MATCHUPS:
0.113
+ 0.9 * [value_velo]
+ 1.187 * [value_spin_efficiency]
+ 0.645 * [value_net_ivb]
This gave the most consistent results, based on a variety of tests I ran. It’s also nice that the weights were pretty similar across the board. You can probably create one master formula for each one, or even just do a simple A+B+C if you really want, I don;t think the results will differ too much. This version is likely more conservative than simply just adding the values together, and theoretically removes the co-linearities.
Does it Work? The Eye Tes
I certainly hope it does! The most important thing to me is that the best pitches get picked up, as well as the worst pitches. It doesn’t have to be perfect, but if the guy that is the poster child for a pitch doesn’t grade well, that’s a big problem, and a big reason why I haven’t posted SMOKE for sliders just yet (the Clayton Kershaw problem).
Luis Castillo is a nice win, in my opinion. Both StuffPro and Stuff+ have not been fans of his sinker, though it has been a positive pitch every season from 2019 through 2023, with the exception of 2021. SMOKE will lose to StuffPro generally speaking, so I’ll take this small W.
We see that Bobby Miller and Dustin May have great sinkers, mostly due to velocity, and that Logan Webb’s was great mostly because of his movement deviation, as with Cristopher Sanchez and Michael King. SMOKE really like Sale’s sinker despite the 93.4 MPH velo.
These are the worst SP sinkers according to SMOKE. Bryce Elder is really interesting in that his sinker was roughly average in 2023, but Stuff+ had it as 82 and StuffPro had it as 0. 6 runs worse than the average pitch, so we’re all in agreement on the grade.
I love this list, except for the obvious miss with Chapman, who should probably be higher. I love that Yennier Cano and Clay Holmes are near the top. I love that Lucas Erceg ranked well.
Here was 2022 top RPs:
2021:
I wanted to go back to 2021, as I wanted to see if Blake Treinen would pop. Having him at #3 makes me very happy, and we see him with positive run values (i.e. good) in all the buckets. Also nice to see that my finger on the scale helped Hader’s sinker top the list for 2021, though he still graded poorly on movement deviation, his Net IVB drove a lot of his value.
Does it Work? FanGraphs Run Values
Run values for sinkers drove me crazy! They still do. I’m not overly enthusiastic about how SMOKE Sinker does at correlating to FG run values. There are some errata in the source data, so the following chart removes some of those erroneous values:
We get an R² of 0.125, which is decent. This includes a season in 2022 by Josh Hader where he just performed terribly. Also Adam Wainwright somehow was great in 2021. Sinkers!
SMOKE has no knowledge of any other pitch interaction. For pitchers that use it as a secondary, SMOKE may be very wrong. This is an area of exploration for someone looking to iterate on this.
Does it Work? StuffPro and Stuff+
With a minimum of 300 pitches in 2023, it has a .37 R² with StuffPro and 0.43 R² with Stuff+. Brent Suter is an interesting name that pops out as one that StuffPro “loves” and SMOKE “hates”, however he was in Colorado in 2023, so that might have something to do with it. Hoby Milner’s sinker was good in 2022 and 2023, but it’s been terrible in 2024 so far. Luis Castillo’s SMOKE grade is I think correct; Zack Wheeler’s is definitely not (StuffPro has it correct I think). Kevin Kelley has a weird arm slot that will break SMOKE.
I did not build these with any knowledge of StuffPro or Stuff+, so it’s nice to see that it correlates reasonably well.
Concluding Thoughts
I’ve spent a HUGE amount of time on this; you’re seeing the final cuts of many many things that I tried. I sincerely hope this is useful to you, and that someone, somewhere will publish something even better.
This is awesome! I've felt that Stuff+ models are less helpful than I'd hope because they are, literally, reductive. There's no new information presented to me if I find out Corbin Burnes' hard cutter grades out well by models. But by having an "open source" model, we can piece together the "why" more than the "what."
I find sinkers to be interesting in general because pitch classification is ultimately "made up," and sinkers (and cutters*) are the poster children for this. Ex: Josh Hader's sinker essentially isn't one - it's a four-seam fastball by another name and grip. It has ~20 inches of vert and ~7 inches of run, and he frequently throws it at the top of the zone with no other secondary fastball. Félix Bautista throws his fastball with a two-seam grip as well, it's just that it also has similar shape to Hader's (with a dramatically different release point) and he pounds the top of the zone as well. Interestingly, Brooks Baseball has him throwing both a 4SF and a sinker, but they are heavily clustered and separated by a few inches of horizontal break. The reverse of this is Paul Skenes' splinker, which is obviously being thrown as a fastball and not a true offspeed offering (Skenes himself apparently calls it a sinker).
*StuffPro/PitchPro made the leap and finally broke down cutters between hard cutters (Burnes, Clase, Jansen) and breaking ball cutters (nearly everybody else). I would be curious to see a SMOKE model for cutters, as well as changeups, which generally do not grade well by Stuff+.
Side note, what exactly is an arm-side pitch with gyro spin? A screwball?
Why wouldn’t you want to throw pitches with a low Spin Efficiency / Total Movement if it has better stuff +?