In 2025, Statcast started measuring something it never could before: not just how fast the bat moves, but the shape of its path — the attack angle, the up-or-down tilt of the barrel at contact. The swing-instruction world pounced. “Get your attack angle into the ideal window.” “Match your swing plane to the pitch.” A new leaderboard, a new product. So we asked the question those products are quietly built on: do hitters actually adjust the shape of their swing to the pitch — and if they do, does it make them better?

The first half is true, and it’s genuinely cool. Hitters do have a dial: across the league, a swing’s attack angle falls about 10° as the pitch climbs from the bottom of the zone to the top — steep and uppercut on the low ball, flat and level up high. And how much a given hitter turns that dial is one of the most stable things about him. We ran the whole study the way we ran the Arm-Angle Gambit and the Two-Strike Brake: two analytical agents with opposite instincts — one interpretability-first, one machine-learning — each working ~476,000 tracked swings blind to the other, then forced to referee each other’s work. They agreed on which hitters have the biggest dial to a correlation of r = 0.99.

The second half is where the brochure falls apart.

What we found

  1. The dial is real. Attack angle drops ~10° from the bottom of the zone to the top — hitters genuinely steepen on low pitches and flatten on high ones. The relationship even bends, flattening out at the zone’s extremes.
  2. The dial is one of the most reliable traits in hitting. Split-half reliability is 0.94; a hitter’s dial in 2025 predicts his dial in 2026 at r = 0.88. Most celebrated hitting “skills” don’t come close to that.
  3. It doesn’t add power. Bat speed alone explains 47% of the gap in contact quality between hitters. Add a hitter’s average swing shape and you’re at 57%. Add how adjustable his dial is — the supposed skill — and you gain 0.2 percentage points. Its independent effect can’t be told apart from zero.
  4. It doesn’t save contact, either. If the dial pays off anywhere it should be in not whiffing on the tough pitch. The more adjustable hitters whiff slightly more — and the penalty is largest at the top and bottom of the zone, exactly where matching your plane is supposed to help. Both methods, same answer.
  5. “Ideal attack angle” is mostly bat speed. The marketed 5–20° rate looks correlated with production — until you account for bat speed, which erases ~88% of it and leaves nothing you can distinguish from zero.
  6. Exhibit A: Juan Soto. The least-adjustable qualified hitter in 2025 — essentially one swing, whatever the pitch height — and one of the best hitters alive.

One honesty note up front, because it governs everything below: this is all associational, measured on the swings hitters chose to take. We can show you that the dial doesn’t travel with better outcomes. We can’t prove that surgically changing a hitter’s dial would do nothing — only that, across the league, the hitters who have the dial aren’t cashing it in. Here’s the case.

1. The dial is real — and beautifully consistent

Start with the part that holds up. For every tracked swing we have the attack angle and the height of the pitch; line them up within each hitter and a clean pattern falls out. On a pitch at the knees, the average swing tilts up around 16°; on a pitch at the letters, it flattens toward . That’s the dial — an adjustment of roughly 10° across the vertical zone, and it bends at the ends, because there’s only so flat or so steep a human swing goes.

The dial: attack angle by pitch height (2025)-10-5051015200.000.250.500.751.00pitch height in the zone (0 = knees, 1 = letters)attack angle (°)LeagueSoto+0.1°/zoneDoyle−10.0°/zoneCronenworth−20.6°/zone
Each line is a hitter's average swing tilt across the vertical zone. The league bends ~10° from low to high; individual dials range from Cronenworth's ~20° to Soto's nearly flat.

Every hitter sits somewhere on a spectrum of how hard he turns the dial. Jake Cronenworth swings almost 20° steeper on the low pitch than the high one. Juan Soto barely moves — his line is nearly flat, the same swing shape from the shins to the letters. Both are real, repeatable signatures.

And “repeatable” is not a throwaway word here. Split a hitter’s 2025 swings in half at random and the two halves agree on his dial at a Spearman-Brown reliability of 0.94. Better still, his 2025 dial predicts his 2026 dial at r = 0.88 — a full season apart. For comparison, plenty of stats that hitters get praised or benched over don’t clear 0.5 on the same test. If reliability alone made something valuable, the dial would be a headline skill. It is exactly that reliable. It is also, as far as we can measure, worth nothing.

2. The payoff that isn’t: power

The first thing a swing-shape evangelist will tell you is that matching your plane lets you square the ball up — more flush contact, more damage. So we built the per-hitter model the honest way, adding one variable at a time and watching what each one buys, with the outcome being expected production on contact (xwOBAcon, the quality of a hitter’s batted balls stripped of luck and defense).

The dial vs the payoff (each dot a hitter, 2025)0.200.250.300.350.400.450.500.550.6005101520the dial → attack-angle adjustabilityxwOBAcon (contact quality)r = 0.21Jake Cronenworth: dial 20.09, xwOBAcon 0.326, 68.9 mphJake Fraley: dial 20, xwOBAcon 0.357, 70.3 mphYoán Moncada: dial 19.64, xwOBAcon 0.374, 70.9 mphTrevor Larnach: dial 19.52, xwOBAcon 0.348, 70.3 mphKyle Teel: dial 19.52, xwOBAcon 0.403, 67.6 mphBo Bichette: dial 18.56, xwOBAcon 0.368, 67.1 mphMichael Toglia: dial 18.03, xwOBAcon 0.407, 71.2 mphZach Mckinstry: dial 17.76, xwOBAcon 0.335, 66.2 mphColson Montgomery: dial 17.66, xwOBAcon 0.452, 75.5 mphJames Wood: dial 17.6, xwOBAcon 0.503, 73.9 mphJ. P. Crawford: dial 17.28, xwOBAcon 0.357, 69.4 mphRyan O'Hearn: dial 17.11, xwOBAcon 0.382, 70.1 mphBrent Rooker: dial 17.04, xwOBAcon 0.409, 71.5 mphYordan Álvarez: dial 16.99, xwOBAcon 0.433, 75 mphHyeseong Kim: dial 16.99, xwOBAcon 0.332, 66 mphMichael Busch: dial 16.79, xwOBAcon 0.443, 67.7 mphEvan Carter: dial 16.71, xwOBAcon 0.327, 68.1 mphSpencer Torkelson: dial 16.63, xwOBAcon 0.396, 71.6 mphLuis Robert: dial 16.56, xwOBAcon 0.400, 73.5 mphRyan Mountcastle: dial 16.51, xwOBAcon 0.407, 73.7 mphRiley Adams: dial 16.34, xwOBAcon 0.411, 76.4 mphRyan Mcmahon: dial 16.17, xwOBAcon 0.424, 72.1 mphRyan Ritter: dial 16.1, xwOBAcon 0.302, 67.2 mphOneil Cruz: dial 15.97, xwOBAcon 0.430, 76.5 mphColton Cowser: dial 15.89, xwOBAcon 0.420, 71.2 mphOtto Kemp: dial 15.88, xwOBAcon 0.407, 70.7 mphCarlos Correa: dial 15.81, xwOBAcon 0.391, 72.2 mphDerek Hill: dial 15.71, xwOBAcon 0.424, 70.7 mphRiley Greene: dial 15.71, xwOBAcon 0.451, 74.2 mphCoby Mayo: dial 15.66, xwOBAcon 0.343, 72.8 mphStarling Marte: dial 15.64, xwOBAcon 0.365, 70.5 mphAaron Judge: dial 15.55, xwOBAcon 0.578, 74.9 mphBo Naylor: dial 15.51, xwOBAcon 0.325, 70.3 mphKyle Tucker: dial 15.48, xwOBAcon 0.387, 69.7 mphJake Meyers: dial 15.42, xwOBAcon 0.342, 66.5 mphWill Wagner: dial 15.35, xwOBAcon 0.335, 67.5 mphHeston Kjerstad: dial 15.29, xwOBAcon 0.350, 67.8 mphSpencer Horwitz: dial 15.18, xwOBAcon 0.330, 66.7 mphBrandon Marsh: dial 15.17, xwOBAcon 0.413, 69.9 mphJosh Naylor: dial 15.06, xwOBAcon 0.355, 68.9 mphNick Castellanos: dial 15.05, xwOBAcon 0.357, 68.8 mphTyler Freeman: dial 15.02, xwOBAcon 0.324, 69.8 mphNolan Gorman: dial 14.95, xwOBAcon 0.402, 70.9 mphFreddie Freeman: dial 14.92, xwOBAcon 0.401, 68.3 mphWilli Castro: dial 14.89, xwOBAcon 0.348, 70 mphMike Trout: dial 14.79, xwOBAcon 0.471, 72.1 mphNolan Jones: dial 14.7, xwOBAcon 0.368, 71 mphChristian Yelich: dial 14.55, xwOBAcon 0.407, 71.6 mphJosé Herrera: dial 14.4, xwOBAcon 0.231, 65.2 mphJoey Bart: dial 14.38, xwOBAcon 0.360, 72.2 mphMickey Moniak: dial 14.23, xwOBAcon 0.428, 72.1 mphLiam Hicks: dial 14.21, xwOBAcon 0.301, 65.4 mphBen Williamson: dial 14.19, xwOBAcon 0.314, 68.1 mphJung Hoo Lee: dial 14.16, xwOBAcon 0.324, 67 mphEdouard Julien: dial 14.07, xwOBAcon 0.414, 68.6 mphColt Keith: dial 14.04, xwOBAcon 0.385, 69 mphBryce Harper: dial 14, xwOBAcon 0.418, 72.6 mphWill Benson: dial 13.91, xwOBAcon 0.441, 70.1 mphShohei Ohtani: dial 13.89, xwOBAcon 0.555, 74.2 mphBrandon Lowe: dial 13.83, xwOBAcon 0.428, 71.9 mphMax Kepler: dial 13.72, xwOBAcon 0.370, 69.1 mphDonovan Solano: dial 13.58, xwOBAcon 0.280, 64.3 mphCarson Kelly: dial 13.58, xwOBAcon 0.343, 69.4 mphMichael Taylor: dial 13.58, xwOBAcon 0.369, 69.9 mphLeody Taveras: dial 13.55, xwOBAcon 0.285, 69.6 mphSam Haggerty: dial 13.53, xwOBAcon 0.346, 69.4 mphCam Smith: dial 13.42, xwOBAcon 0.377, 72.4 mphIsaac Collins: dial 13.41, xwOBAcon 0.349, 70.8 mphKyle Farmer: dial 13.41, xwOBAcon 0.323, 65.1 mphJake Bauers: dial 13.31, xwOBAcon 0.440, 74.8 mphAlejandro Osuna: dial 13.26, xwOBAcon 0.347, 70.2 mphRoman Anthony: dial 13.26, xwOBAcon 0.440, 73 mphTrevor Story: dial 13.23, xwOBAcon 0.391, 69.9 mphKameron Misner: dial 13.23, xwOBAcon 0.309, 71.2 mphBlaze Alexander: dial 13.22, xwOBAcon 0.378, 70.1 mphDrake Baldwin: dial 13.1, xwOBAcon 0.382, 73.8 mphGiancarlo Stanton: dial 13.1, xwOBAcon 0.505, 79.2 mphMichael Conforto: dial 13.1, xwOBAcon 0.387, 72.6 mphEzequiel Duran: dial 13.09, xwOBAcon 0.305, 69.9 mphEzequiel Tovar: dial 12.87, xwOBAcon 0.400, 70.3 mphJosh Smith: dial 12.85, xwOBAcon 0.333, 67.5 mphGunnar Henderson: dial 12.83, xwOBAcon 0.399, 73.8 mphPatrick Bailey: dial 12.77, xwOBAcon 0.339, 70.3 mphAustin Riley: dial 12.75, xwOBAcon 0.427, 74 mphNolan Schanuel: dial 12.75, xwOBAcon 0.312, 65.9 mphAlexander Canario: dial 12.73, xwOBAcon 0.412, 74.4 mphBrandon Nimmo: dial 12.71, xwOBAcon 0.367, 70.6 mphAustin Wells: dial 12.69, xwOBAcon 0.361, 71.7 mphVictor Scott: dial 12.63, xwOBAcon 0.316, 66.4 mphCurtis Mead: dial 12.49, xwOBAcon 0.337, 71.3 mphIván Herrera: dial 12.46, xwOBAcon 0.396, 72.6 mphThomas Saggese: dial 12.42, xwOBAcon 0.361, 68 mphTy France: dial 12.41, xwOBAcon 0.355, 69.4 mphEnrique Hernández: dial 12.34, xwOBAcon 0.349, 69.7 mphJhonkensy Noel: dial 12.34, xwOBAcon 0.284, 76.7 mphNacho Alvarez: dial 12.32, xwOBAcon 0.313, 66.2 mphDaniel Schneemann: dial 12.31, xwOBAcon 0.361, 68.8 mphIsiah Kiner-Falefa: dial 12.3, xwOBAcon 0.290, 65.2 mphCody Bellinger: dial 12.29, xwOBAcon 0.341, 68.9 mphAddison Barger: dial 12.27, xwOBAcon 0.406, 74.8 mphDillon Dingler: dial 12.25, xwOBAcon 0.422, 70.2 mphTyler Fitzgerald: dial 12.22, xwOBAcon 0.294, 67.3 mphJordan Beck: dial 12.15, xwOBAcon 0.388, 71.6 mphXander Bogaerts: dial 12.13, xwOBAcon 0.353, 70.2 mphMax Muncy: dial 12.12, xwOBAcon 0.358, 71.2 mphPedro Pagés: dial 12.08, xwOBAcon 0.330, 71 mphJosh Jung: dial 12.08, xwOBAcon 0.382, 69.2 mphBrady House: dial 12.06, xwOBAcon 0.383, 71.1 mphMasataka Yoshida: dial 12.05, xwOBAcon 0.337, 70.1 mphVinnie Pasquantino: dial 12, xwOBAcon 0.366, 71.4 mphSean Murphy: dial 11.96, xwOBAcon 0.385, 70.2 mphCasey Schmitt: dial 11.95, xwOBAcon 0.389, 69.9 mphSeiya Suzuki: dial 11.94, xwOBAcon 0.436, 71.3 mphBen Rice: dial 11.92, xwOBAcon 0.442, 71.6 mphBrice Turang: dial 11.91, xwOBAcon 0.400, 68.5 mphJorge Soler: dial 11.88, xwOBAcon 0.374, 72.5 mphMiguel Rojas: dial 11.87, xwOBAcon 0.317, 66.2 mphDrew Waters: dial 11.85, xwOBAcon 0.343, 69.8 mphAndy Pages: dial 11.81, xwOBAcon 0.377, 70.7 mphMike Tauchman: dial 11.78, xwOBAcon 0.353, 67.1 mphConnor Norby: dial 11.72, xwOBAcon 0.373, 67 mphKristian Campbell: dial 11.71, xwOBAcon 0.350, 71 mphBrett Baty: dial 11.7, xwOBAcon 0.415, 73.1 mphVladimir Guerrero: dial 11.7, xwOBAcon 0.411, 75.3 mphNick Kurtz: dial 11.68, xwOBAcon 0.502, 75.4 mphGavin Lux: dial 11.64, xwOBAcon 0.337, 67.7 mphHarrison Bader: dial 11.61, xwOBAcon 0.361, 71.8 mphIan Happ: dial 11.59, xwOBAcon 0.399, 70.2 mphCal Raleigh: dial 11.59, xwOBAcon 0.466, 73.2 mphCorey Seager: dial 11.52, xwOBAcon 0.457, 71.1 mphWilyer Abreu: dial 11.52, xwOBAcon 0.410, 72.6 mphJasson Domínguez: dial 11.45, xwOBAcon 0.376, 72.8 mphTim Tawa: dial 11.43, xwOBAcon 0.369, 71 mphBrayan Rocchio: dial 11.37, xwOBAcon 0.333, 68.5 mphConnor Wong: dial 11.32, xwOBAcon 0.300, 70 mphJj Bleday: dial 11.32, xwOBAcon 0.318, 69.9 mphTeoscar Hernández: dial 11.28, xwOBAcon 0.402, 71 mphLuke Raley: dial 11.27, xwOBAcon 0.358, 72.2 mphWillson Contreras: dial 11.16, xwOBAcon 0.436, 74.4 mphJared Triolo: dial 11.14, xwOBAcon 0.339, 69.3 mphEli White: dial 11.13, xwOBAcon 0.394, 70.2 mphBrendan Donovan: dial 11.12, xwOBAcon 0.363, 67.9 mphTrey Sweeney: dial 11.09, xwOBAcon 0.295, 72.1 mphJordan Walker: dial 11.08, xwOBAcon 0.373, 76.2 mphMarcell Ozuna: dial 11.04, xwOBAcon 0.405, 71 mphBryan Reynolds: dial 11.03, xwOBAcon 0.413, 70.1 mphGraham Pauley: dial 11.01, xwOBAcon 0.311, 68 mphJ. T. Realmuto: dial 11.01, xwOBAcon 0.358, 70.6 mphJeff Mcneil: dial 10.97, xwOBAcon 0.326, 69 mphJose Iglesias: dial 10.96, xwOBAcon 0.299, 67.1 mphLogan O'Hoppe: dial 10.96, xwOBAcon 0.398, 70 mphMatt Wallner: dial 10.94, xwOBAcon 0.414, 74.5 mphLawrence Butler: dial 10.93, xwOBAcon 0.386, 71.9 mphTyler Heineman: dial 10.89, xwOBAcon 0.280, 64.3 mphGio Urshela: dial 10.83, xwOBAcon 0.318, 67 mphMatt Olson: dial 10.83, xwOBAcon 0.425, 72.4 mphJeremy Peña: dial 10.8, xwOBAcon 0.370, 71 mphEugenio Suárez: dial 10.8, xwOBAcon 0.410, 69.8 mphJake Mccarthy: dial 10.73, xwOBAcon 0.327, 68.2 mphLamonte Wade: dial 10.72, xwOBAcon 0.310, 68.3 mphRamón Laureano: dial 10.69, xwOBAcon 0.437, 70.2 mphHeliot Ramos: dial 10.62, xwOBAcon 0.359, 72.3 mphVíctor Caratini: dial 10.6, xwOBAcon 0.356, 70.7 mphAndy Ibáñez: dial 10.58, xwOBAcon 0.305, 68.1 mphNick Loftin: dial 10.57, xwOBAcon 0.293, 67.7 mphMookie Betts: dial 10.57, xwOBAcon 0.326, 66.8 mphJosh Bell: dial 10.56, xwOBAcon 0.387, 71.6 mphLuis Rengifo: dial 10.55, xwOBAcon 0.340, 68.2 mphMax Muncy: dial 10.54, xwOBAcon 0.388, 69.2 mphJosh Rojas: dial 10.51, xwOBAcon 0.288, 66.3 mphJurickson Profar: dial 10.48, xwOBAcon 0.313, 69.2 mphJulio Rodríguez: dial 10.47, xwOBAcon 0.414, 75 mphJac Caglianone: dial 10.44, xwOBAcon 0.382, 75.9 mphJo Adell: dial 10.44, xwOBAcon 0.472, 75.5 mphTyrone Taylor: dial 10.43, xwOBAcon 0.352, 69.1 mphYanquiel Fernández: dial 10.41, xwOBAcon 0.319, 73.3 mphMichael Harris: dial 10.41, xwOBAcon 0.380, 73 mphJake Burger: dial 10.41, xwOBAcon 0.411, 73.3 mphDarell Hernaiz: dial 10.39, xwOBAcon 0.301, 66.2 mphMasyn Winn: dial 10.37, xwOBAcon 0.315, 69.6 mphKyle Stowers: dial 10.37, xwOBAcon 0.487, 73.2 mphSteven Kwan: dial 10.35, xwOBAcon 0.293, 62 mphChristian Walker: dial 10.35, xwOBAcon 0.396, 71.8 mphTyler Stephenson: dial 10.33, xwOBAcon 0.407, 68.1 mphJesús Sánchez: dial 10.29, xwOBAcon 0.382, 73.9 mphKyle Manzardo: dial 10.25, xwOBAcon 0.380, 68.8 mphGeorge Springer: dial 10.25, xwOBAcon 0.447, 71.4 mphCeddanne Rafaela: dial 10.13, xwOBAcon 0.346, 69.4 mphGabriel Arias: dial 10.1, xwOBAcon 0.403, 73.5 mphEdmundo Sosa: dial 10.08, xwOBAcon 0.342, 71.2 mphDaylen Lile: dial 10.08, xwOBAcon 0.378, 67.9 mphBrenton Doyle: dial 10.02, xwOBAcon 0.368, 69.1 mphRomy Gonzalez: dial 10.02, xwOBAcon 0.425, 72.7 mphElly De La Cruz: dial 10.01, xwOBAcon 0.402, 72.6 mphAlex Call: dial 9.98, xwOBAcon 0.330, 64.1 mphChristian Koss: dial 9.97, xwOBAcon 0.371, 68.2 mphLourdes Gurriel: dial 9.95, xwOBAcon 0.338, 68.9 mphTaylor Ward: dial 9.95, xwOBAcon 0.383, 67.6 mphGavin Sheets: dial 9.91, xwOBAcon 0.387, 73.3 mphChandler Simpson: dial 9.84, xwOBAcon 0.309, 62.4 mphDylan Crews: dial 9.78, xwOBAcon 0.346, 71.5 mphWyatt Langford: dial 9.76, xwOBAcon 0.420, 71.6 mphDaulton Varsho: dial 9.75, xwOBAcon 0.443, 74.2 mphNathan Lukes: dial 9.74, xwOBAcon 0.328, 66.6 mphBryce Teodosio: dial 9.72, xwOBAcon 0.285, 67 mphJackson Merrill: dial 9.65, xwOBAcon 0.411, 70.6 mphJosé Caballero: dial 9.63, xwOBAcon 0.350, 67.1 mphLars Nootbaar: dial 9.62, xwOBAcon 0.334, 71.6 mphWilly Adames: dial 9.59, xwOBAcon 0.385, 70.5 mphCedric Mullins: dial 9.59, xwOBAcon 0.322, 69.6 mphAndrés Giménez: dial 9.58, xwOBAcon 0.321, 67.9 mphJacob Young: dial 9.5, xwOBAcon 0.330, 66.7 mphNick Gonzales: dial 9.49, xwOBAcon 0.318, 68.8 mphJoc Pederson: dial 9.48, xwOBAcon 0.347, 71.9 mphJakob Marsee: dial 9.46, xwOBAcon 0.392, 69.1 mphTj Friedl: dial 9.45, xwOBAcon 0.300, 68.3 mphAngel Martínez: dial 9.4, xwOBAcon 0.293, 68.9 mphOswald Peraza: dial 9.38, xwOBAcon 0.318, 72.2 mphFrancisco Álvarez: dial 9.37, xwOBAcon 0.386, 72.2 mphTyler Soderstrom: dial 9.31, xwOBAcon 0.401, 72.3 mphJoey Ortiz: dial 9.25, xwOBAcon 0.296, 71.2 mphDominic Smith: dial 9.23, xwOBAcon 0.331, 65.6 mphAbraham Toro: dial 9.16, xwOBAcon 0.328, 68.3 mphDylan Moore: dial 9.12, xwOBAcon 0.346, 69.8 mphAustin Slater: dial 9.1, xwOBAcon 0.468, 67.7 mphCj Abrams: dial 9.09, xwOBAcon 0.346, 70.4 mphTommy Edman: dial 9.07, xwOBAcon 0.358, 69.1 mphTyler O'Neill: dial 9.07, xwOBAcon 0.427, 72.6 mphNico Hoerner: dial 9.06, xwOBAcon 0.318, 67 mphPaul Dejong: dial 9.06, xwOBAcon 0.365, 71.1 mphEric Wagaman: dial 9.01, xwOBAcon 0.366, 71.4 mphJake Mangum: dial 8.98, xwOBAcon 0.297, 65.9 mphAndrew Vaughn: dial 8.97, xwOBAcon 0.393, 69.2 mphDavid Hamilton: dial 8.97, xwOBAcon 0.304, 67.9 mphXavier Edwards: dial 8.97, xwOBAcon 0.307, 65.3 mphByron Buxton: dial 8.93, xwOBAcon 0.456, 73.3 mphFreddy Fermin: dial 8.93, xwOBAcon 0.314, 67.8 mphParker Meadows: dial 8.88, xwOBAcon 0.334, 68.1 mphMyles Straw: dial 8.81, xwOBAcon 0.321, 65.3 mphMatt Mclain: dial 8.8, xwOBAcon 0.357, 67.6 mphZach Neto: dial 8.75, xwOBAcon 0.440, 69.4 mphRonny Mauricio: dial 8.75, xwOBAcon 0.369, 72.5 mphAgustín Ramírez: dial 8.73, xwOBAcon 0.377, 73.4 mphTaylor Walls: dial 8.71, xwOBAcon 0.296, 67.3 mphSal Frelick: dial 8.71, xwOBAcon 0.303, 66.2 mphMichael Massey: dial 8.69, xwOBAcon 0.289, 69 mphSalvador Pérez: dial 8.65, xwOBAcon 0.422, 71.5 mphRob Refsnyder: dial 8.65, xwOBAcon 0.406, 71.5 mphAnthony Santander: dial 8.65, xwOBAcon 0.311, 70.9 mphMatt Thaiss: dial 8.62, xwOBAcon 0.301, 70.2 mphAlex Verdugo: dial 8.61, xwOBAcon 0.297, 65.4 mphSpencer Steer: dial 8.56, xwOBAcon 0.332, 69.4 mphJorge Polanco: dial 8.55, xwOBAcon 0.364, 69.2 mphTommy Pham: dial 8.55, xwOBAcon 0.353, 71.7 mphGabriel Moreno: dial 8.48, xwOBAcon 0.378, 69.4 mphKeibert Ruiz: dial 8.48, xwOBAcon 0.294, 64.9 mphPete Alonso: dial 8.44, xwOBAcon 0.458, 73.7 mphNick Allen: dial 8.44, xwOBAcon 0.279, 62.4 mphKyle Higashioka: dial 8.44, xwOBAcon 0.347, 68.7 mphJosh Lowe: dial 8.4, xwOBAcon 0.362, 70.7 mphDylan Carlson: dial 8.38, xwOBAcon 0.324, 66.9 mphJarren Duran: dial 8.37, xwOBAcon 0.379, 73.3 mphWenceel Pérez: dial 8.33, xwOBAcon 0.361, 69.4 mphJonathan India: dial 8.31, xwOBAcon 0.336, 69.7 mphElías Díaz: dial 8.29, xwOBAcon 0.318, 71.1 mphRyan Jeffers: dial 8.27, xwOBAcon 0.352, 70.6 mphDane Myers: dial 8.27, xwOBAcon 0.362, 69.2 mphCole Young: dial 8.19, xwOBAcon 0.311, 69.6 mphJustin Turner: dial 8.19, xwOBAcon 0.305, 64.5 mphWill Smith: dial 8.16, xwOBAcon 0.410, 67.7 mphAndrew Benintendi: dial 8.11, xwOBAcon 0.346, 66.8 mphPavin Smith: dial 8.11, xwOBAcon 0.401, 69.5 mphHunter Goodman: dial 8.1, xwOBAcon 0.406, 72.7 mphAmed Rosario: dial 8.03, xwOBAcon 0.347, 71.8 mphJavier Báez: dial 8.01, xwOBAcon 0.346, 72.5 mphNathaniel Lowe: dial 8, xwOBAcon 0.363, 71.1 mphJordan Westburg: dial 7.99, xwOBAcon 0.374, 68.9 mphMauricio Dubón: dial 7.99, xwOBAcon 0.281, 66.5 mphRonald Acuña: dial 7.96, xwOBAcon 0.478, 74.1 mphBrooks Baldwin: dial 7.93, xwOBAcon 0.388, 69.3 mphRowdy Tellez: dial 7.87, xwOBAcon 0.412, 72.9 mphLuis García: dial 7.85, xwOBAcon 0.384, 70.8 mphFrancisco Lindor: dial 7.83, xwOBAcon 0.368, 69.5 mphLuke Keaschall: dial 7.79, xwOBAcon 0.320, 63.8 mphCarlos Narváez: dial 7.78, xwOBAcon 0.343, 70.8 mphHenry Davis: dial 7.74, xwOBAcon 0.362, 72.2 mphJonathan Aranda: dial 7.74, xwOBAcon 0.469, 68.8 mphNolan Arenado: dial 7.65, xwOBAcon 0.295, 69.4 mphCorbin Carroll: dial 7.62, xwOBAcon 0.445, 73.1 mphWilmer Flores: dial 7.61, xwOBAcon 0.276, 63.7 mphCarlos Santana: dial 7.6, xwOBAcon 0.306, 69.5 mphKyle Isbel: dial 7.6, xwOBAcon 0.274, 69 mphNoelvi Marte: dial 7.59, xwOBAcon 0.364, 71.6 mphJacob Wilson: dial 7.58, xwOBAcon 0.295, 62.2 mphJonah Heim: dial 7.48, xwOBAcon 0.312, 67.4 mphManny Machado: dial 7.43, xwOBAcon 0.407, 72.8 mphAdam Frazier: dial 7.42, xwOBAcon 0.305, 64.4 mphMax Schuemann: dial 7.36, xwOBAcon 0.295, 66.9 mphRhys Hoskins: dial 7.34, xwOBAcon 0.356, 68.1 mphRandal Grichuk: dial 7.3, xwOBAcon 0.388, 72.4 mphAlejandro Kirk: dial 7.29, xwOBAcon 0.374, 71 mphTravis D'Arnaud: dial 7.24, xwOBAcon 0.342, 68.9 mphAdley Rutschman: dial 7.21, xwOBAcon 0.331, 68.2 mphChristian Vázquez: dial 7.17, xwOBAcon 0.260, 65.5 mphLenyn Sosa: dial 7.12, xwOBAcon 0.408, 71.3 mphLuisangel Acuña: dial 7.09, xwOBAcon 0.295, 68.4 mphNick Fortes: dial 7.04, xwOBAcon 0.292, 70.4 mphMaikel García: dial 7.02, xwOBAcon 0.344, 70.2 mphYohel Pozo: dial 7.02, xwOBAcon 0.303, 67.6 mphYainer Diaz: dial 7, xwOBAcon 0.372, 70.6 mphAlec Bohm: dial 6.95, xwOBAcon 0.354, 70.4 mphOtto Lopez: dial 6.86, xwOBAcon 0.353, 70 mphMatt Chapman: dial 6.85, xwOBAcon 0.384, 72.9 mphFernando Tatís: dial 6.76, xwOBAcon 0.399, 72 mphMitch Garver: dial 6.72, xwOBAcon 0.345, 70.2 mphAlek Thomas: dial 6.72, xwOBAcon 0.360, 69.3 mphAndrew Mccutchen: dial 6.67, xwOBAcon 0.376, 69.4 mphKetel Marte: dial 6.67, xwOBAcon 0.412, 73 mphKody Clemens: dial 6.6, xwOBAcon 0.405, 70.8 mphPaul Goldschmidt: dial 6.59, xwOBAcon 0.381, 71.4 mphJackson Chourio: dial 6.58, xwOBAcon 0.365, 72 mphRafael Devers: dial 6.58, xwOBAcon 0.439, 70.2 mphAustin Hedges: dial 6.56, xwOBAcon 0.262, 69.6 mphJazz Chisholm: dial 6.48, xwOBAcon 0.431, 72.5 mphLuis Torrens: dial 6.46, xwOBAcon 0.393, 69.3 mphMark Vientos: dial 6.44, xwOBAcon 0.378, 69.3 mphDansby Swanson: dial 6.44, xwOBAcon 0.441, 69.2 mphWilliam Contreras: dial 6.43, xwOBAcon 0.353, 71.3 mphJeremiah Jackson: dial 6.41, xwOBAcon 0.376, 69.9 mphKerry Carpenter: dial 6.4, xwOBAcon 0.414, 70.2 mphHeriberto Hernandez: dial 6.21, xwOBAcon 0.397, 71.1 mphAlex Bregman: dial 6.21, xwOBAcon 0.344, 69.5 mphMike Yastrzemski: dial 6.2, xwOBAcon 0.359, 69.8 mphJackson Holliday: dial 6.1, xwOBAcon 0.353, 68.9 mphPete Crow-Armstrong: dial 6.06, xwOBAcon 0.403, 71 mphRoyce Lewis: dial 6.02, xwOBAcon 0.344, 71.8 mphAnthony Volpe: dial 5.96, xwOBAcon 0.369, 70.7 mphLuis Matos: dial 5.93, xwOBAcon 0.295, 70.2 mphGeraldo Perdomo: dial 5.91, xwOBAcon 0.351, 66.6 mphAustin Hays: dial 5.85, xwOBAcon 0.365, 69.9 mphDominic Canzone: dial 5.82, xwOBAcon 0.454, 71.5 mphChristian Moore: dial 5.74, xwOBAcon 0.361, 70.4 mphKyle Schwarber: dial 5.69, xwOBAcon 0.520, 74.4 mphMiguel Vargas: dial 5.67, xwOBAcon 0.342, 68.6 mphBobby Witt: dial 5.66, xwOBAcon 0.409, 72.8 mphChristopher Morel: dial 5.58, xwOBAcon 0.431, 73.6 mphLuis Arráez: dial 5.56, xwOBAcon 0.284, 61.3 mphGleyber Torres: dial 5.56, xwOBAcon 0.368, 68.4 mphEdgar Quero: dial 5.51, xwOBAcon 0.309, 66.1 mphBryson Stott: dial 5.2, xwOBAcon 0.328, 68 mphBrooks Lee: dial 5.13, xwOBAcon 0.304, 67.6 mphMatt Shaw: dial 5.06, xwOBAcon 0.340, 67.6 mphMiguel Andújar: dial 5.03, xwOBAcon 0.323, 70.5 mphCaleb Durbin: dial 4.89, xwOBAcon 0.298, 65.7 mphMarcus Semien: dial 4.78, xwOBAcon 0.336, 66.5 mphJosé Ramírez: dial 4.78, xwOBAcon 0.353, 69.2 mphShea Langeliers: dial 4.75, xwOBAcon 0.375, 72.6 mphDavis Schneider: dial 4.74, xwOBAcon 0.356, 69.7 mphHa-Seong Kim: dial 4.71, xwOBAcon 0.327, 69.1 mphTrea Turner: dial 4.68, xwOBAcon 0.344, 69.6 mphRamón Urías: dial 4.64, xwOBAcon 0.340, 69 mphJavier Sanoja: dial 4.51, xwOBAcon 0.286, 66.8 mphYandy Díaz: dial 4.34, xwOBAcon 0.368, 72.1 mphKe'Bryan Hayes: dial 4.28, xwOBAcon 0.316, 69.9 mphRobert Hassell: dial 4.2, xwOBAcon 0.359, 67.1 mphErnie Clement: dial 4.18, xwOBAcon 0.294, 65.7 mphRandy Arozarena: dial 4.12, xwOBAcon 0.385, 70.3 mphJunior Caminero: dial 3.91, xwOBAcon 0.399, 76.8 mphJosé Altuve: dial 3.68, xwOBAcon 0.313, 67.9 mphJohn Rave: dial 3.68, xwOBAcon 0.344, 71.5 mphIsaac Paredes: dial 3.65, xwOBAcon 0.315, 67.4 mphOrlando Arcia: dial 3.53, xwOBAcon 0.275, 68.3 mphOzzie Albies: dial 3.48, xwOBAcon 0.307, 67.1 mphDanny Jansen: dial 3.47, xwOBAcon 0.322, 66.8 mphTrent Grisham: dial 3.34, xwOBAcon 0.415, 69.4 mphDavid Fry: dial 3.28, xwOBAcon 0.277, 68.7 mphAdolis García: dial 3.12, xwOBAcon 0.376, 70.5 mphSantiago Espinal: dial 2.91, xwOBAcon 0.258, 66.8 mphChase Meidroth: dial 2.61, xwOBAcon 0.302, 65.7 mphJose Trevino: dial 1.98, xwOBAcon 0.283, 67.3 mphLuis Urías: dial 1.75, xwOBAcon 0.289, 67.2 mphAlec Burleson: dial 0.87, xwOBAcon 0.375, 70.6 mphJuan Soto: dial 0.3, xwOBAcon 0.481, 71 mphJake Cronenworthdial 20.1 · 68.9 mphJuan Sotodial 0.3 · 71.0 mphbat speed (mph)6179
There's a faint upward drift (r=0.21) — but it's the company the dial keeps, not the dial. The darker (faster-bat) dots drift up; control for bat speed + average swing shape and the dial's own effect is indistinguishable from zero. Soto (top-left): no dial, best contact in the pool.

Each dot is a hitter: how adjustable his dial is (left to right) against the quality of his contact (bottom to top), shaded by bat speed. There is a faint upward drift (r = 0.21) — but the color gives it away. The dots that drift up are the darker, faster-bat ones; the dial just keeps company with bat speed. Soto sits top-left: almost no dial, the best contact in the pool. The next two sections show what happens when you account for the company it keeps.

In numbers: a hitter’s bat speed alone explains 47% of the variation in contact quality across the league. Layer in his average attack angle and his “ideal” rate and you climb to 57%. Now add the dial — how much he adjusts — and the model improves by 0.2 percentage points. Its standardized effect is +0.003 with a confidence interval that runs from negative to positive: statistically, you cannot distinguish it from doing nothing. Both agents, one interpretability-first and one a gradient-boosted machine that was free to find any nonlinear interaction it liked, landed in the same place. The dial does not buy power.

3. The payoff that isn’t: contact

Here’s the steelman, and it’s a good one. Maybe the dial was never about quality of contact — maybe it’s about making contact at all. The whole point of matching your swing plane to a pitch at the top or bottom of the zone is to not miss it. And whiffs really are concentrated at the edges: hitters miss on roughly 79% of competitive swings down at the shins and 47% up at the letters, versus just 14% on a pitch in the heart. If the dial earns its keep anywhere, it’s there.

So Round 2 of the study locked onto whiffs, and specifically on the extremes and on two-strike counts where contact matters most. The answer was not “no effect.” It was slightly worse than that.

Whiffs live at the edges — and that's where the dial hurtsWhere whiffs live0%25%50%75%100%79%Bottomthird14%Heart47%TopthirdExtra whiff rate per +1 SD of dial0+2%+4%+6%no effect+5.1%Bottom0Heart+1.5%Top
Left: whiff rate is U-shaped in pitch height, so the extremes are where matching your plane should matter most. Right: the more-adjustable hitters' EXTRA whiff rate (per SD of dial) is largest at exactly those extremes — the wrong direction for the swing-plane story. Both agents agree on the extreme-vs-heart gap (+0.037 / +0.036).

More-adjustable hitters whiff more, not less — and the gap is widest in the bottom third of the zone, exactly where a matched swing plane is supposed to rescue contact. The effect is small (a couple percentage points of whiff rate per standard deviation of dial), but both methods agree on its sign and size, and it points the wrong way for the swing-plane story.

This is the cleanest convergence in the study. Claude’s mixed-effects model and Codex’s gradient-boosted classifier — built on different filters, different estimators, validated by hitter so no one can memorize a name — put the extreme-zone whiff penalty at +0.037 and +0.036 respectively. The same number, twice, from two machines that share no code. The most adjustable hitters tend to be aggressive, faster-bat, lower-contact swingers; the dial rides along with a whiff-prone profile rather than curing one. (Two-strike counts: somewhere between no effect and mildly negative — never the contact insurance the theory predicts.)

4. “Ideal attack angle” is mostly bat speed

Which brings us to the metric actually being sold. “Ideal attack angle rate” — the share of a hitter’s swings that land in the 5–20° window — is now printed on leaderboards and pitched as a swing target. And on its face it correlates with production. The question is whether it’s telling you anything that a radar gun pointed at the bat wouldn’t.

“Ideal attack angle” is mostly bat speed-0.004-0.0020.0000.0020.0040.006assoc. with xwOBAcon (std.)0.0062ideal-AA ratealone0.0007CI crosses 0afterbat speed88%share of hitter contact-qualityvariance explained (R²)0.469bat speed0.572+0.103+ avg shape0.574+0.002+ the dial
Ideal-AA rate's apparent payoff (left) loses ~88% once you account for bat speed (right), leaving a sliver whose confidence interval includes zero. Both agents land here to the third decimal.

On its own, ideal-AA rate has a small positive association with contact quality (left). Account for bat speed — just bat speed — and about 88% of that association evaporates (right), leaving a sliver you can’t distinguish from zero. Both agents, to the third decimal.

To be careful about what this does and doesn’t say: ideal-AA rate is not random noise, and we’re not claiming a hitter should ignore his swing. We’re claiming something narrower and, for anyone selling the metric, more damning — that once you know how hard a hitter swings, his ideal-AA rate carries no independent signal about how well he hits. It is, to a first approximation, bat speed in different clothing.

5. Why we trust this: two methods, made to fight

A single model that found “the dial does nothing” would be easy to wave off as a modeling choice. So we didn’t run one model; we ran two, with opposite biases, and made them cross-examine each other’s work across two rounds. The cross-examination earned its keep immediately.

In Round 1 the two agents appeared to disagree on one secondary test — whether the most-adjustable hitters out-hit the least on raw contact quality. One said yes, one said no. Rather than split the difference, the review traced the gap to its cause: the machine-learning agent had accidentally let ~31,000 swing-and-miss results (worth zero) leak into an outcome that was supposed to be balls-in-play only. Rebuilt clean, on the agreed definition, both agents produced the same positive-but-trivial raw gap — a gap that then vanishes the moment you account for bat speed. The disagreement was a bug, not a finding, and a single-pipeline study would have shipped it.

QuestionClaude (mixed-effects)Codex (gradient boosting)Verdict
Do hitters have a measurable dial?slope −10°/zonesame pattern, r = 0.99 on whoYes — converge
Is it reliable?split-half 0.94split-half 0.93Yes — converge
Does it add power (xwOBAcon)?+0.003, CI spans 0no out-of-sample liftNo — converge
Does it save whiffs?+0.037 extreme (adverse)+0.036 extreme (adverse)No — converge
Is ideal-AA rate > bat speed?88% gone after bat speed88% gone after bat speedNo — converge

When two methods that share no assumptions and no code agree five times out of five — including on the size of an effect to the third decimal — the finding isn’t hiding in a modeling choice. It’s in the data.

6. The leaderboard, and the Soto problem

Here are the hitters who turn the dial the hardest, and the ones who barely turn it at all. Read the right-hand columns: the most-adjustable hitters are good, average, and bad in roughly equal measure, and so are the least. The dial sorts hitters cleanly — it just doesn’t sort them by how well they hit.

Most adjustable (2025)DialBat speedxwOBAcon
Jake Cronenworth20.168.9.326
Yoán Moncada19.670.9.374
Trevor Larnach19.570.3.348
Bo Bichette18.667.1.368
Michael Toglia18.071.2.407
Least adjustable (2025)DialBat speedxwOBAcon
Juan Soto0.371.0.481
Alec Burleson0.970.6.375
Luis Urías1.867.2.289
Adolis García3.170.5.376
David Fry3.368.7.277

Juan Soto is the cleanest illustration in the dataset. He has almost no dial — very nearly the same swing shape whether the pitch is at his shins or his shoulders — and the highest “ideal attack angle” rate in the qualified pool, and the best contact quality in it. He doesn’t adjust the shape of his swing to the pitch. He just has a great one, and trusts it. (Fair caveat: he’s the least-adjustable qualified hitter in 2025 and fourth-least in 2026 — the title is “among tracked, qualified hitters,” not a law of physics. The point survives the caveat.)

What this means for tonight’s game

When you hear that a hitter has “fixed his swing” or “gotten his attack angle into the ideal range,” the data says: be skeptical that it’s the thing helping him. The ability to bend your swing to the pitch is real, measurable, and remarkably consistent — it’s just not what separates good hitters from bad ones. That’s bat speed, and the quality of the one swing they own. The most adjustable swing in the league belongs to a solid regular; the least belongs to Juan Soto.

None of this closes the book on swing shape. We measured the vertical dial; the horizontal one — staying through the ball versus pulling off it — is a separate question we’ll take up next. And everything here is measured on the swings hitters chose to take, so we’re describing what the dial travels with, not what changing it would cause. But the specific, sellable promise — turn your dial, find the ideal window, hit better — doesn’t survive contact with two independent looks at half a million swings.

Methodology

How we built and stress-tested this

Data. Statcast bat-tracking, all tracked competitive swings (bat speed present, bunts and checked swings removed). 2025 full season is the primary corpus — 329,580 competitive swings from 383 hitters with 300+ swings; 2026-to-date (through June 15) is out-of-sample confirmation — 141,168 swings, 362 hitters. Pitch height is normalized by each pitch’s strike zone (sz_top/sz_bot). The unit of analysis is the batter; Statcast’s player_name is the pitcher and is ignored.

The dial. For each hitter we estimate the slope of attack angle on normalized pitch height — the “canonical” per-hitter slope — and, in the interpretability lane, a partially-pooled random-slope mixed model. The two agents’ per-hitter slopes correlate at r = 0.99, so “adaptability” means the same thing in both analyses.

Two divergent methods. Agent A (Claude): mixed-effects models (random slopes; logistic for whiffs), splines for the dial’s shape, split-half / Spearman-Brown reliability, nested models with hitter-resample bootstrap confidence intervals. Agent B (Codex): gradient-boosted trees (LightGBM) with GroupKFold by batter so no hitter appears in both train and validation, SHAP plus permutation checks for interactions, grouped-bootstrap intervals. Neither read the other’s work until it was filed; each then reviewed the other as a hostile peer, across two rounds.

Pre-registered kill gates. Reliability (clears easily), incremental value over bat speed + mean attack angle + ideal-AA rate (fails — CI spans zero), tercile effect size, the ideal-AA-rate myth-buster, and outcome-definition robustness (whiff / total swing value / xwOBAcon run side by side, the fix for a Round-1 contamination bug). Conclusions are unchanged across bat-speed floors of 10/30/50 mph.

Limitations. Everything is associational and conditioned on swings the hitter chose to take, so the dial mixes physical adjustability with pitch selection; we make no causal claim. One outcome — contact quality on balls in play only — shows a faint positive association with the dial that does not survive as predictive skill and is swamped by the whiff result; we treat it as a footnote, not a finding. Sixteen months of bat tracking is still a young dataset, and the horizontal dial is untouched here.