Contact Point Methodology
Methods and sources for "Where Home Runs Come From." The study is MLB-03 in the Pascal research repository. It measures what happens when hitters meet the ball further in front of, or deeper than, their own usual contact point, using the 2025 and 2026 MLB regular seasons.
- Data and information boundary
- The contact point
- Taking the pitch out of it
- Five groups of batted balls
- The view from above the plate
- Ten-game stretches
- Next-game forecasts
- Registered in advance
- Three hitters (examples)
- Checks
- Where each number comes from
- Figures
- Replication bundle
- Limitations
Data and information boundary
The data covers the 2025 and 2026 MLB regular seasons, pitch by pitch, from Baseball Savant's Statcast search, one request per date. The 2025 season runs from March 18 through September 28 and the 2026 season from March 25 through September 27. Each file is stored once and identified by its SHA-256 fingerprint, with a retrieval receipt. Postseason games are not used.
| Season | Role | Games | Pitches | Tracked swings | Batted balls |
|---|---|---|---|---|---|
| 2025 | Test season, examined only after the tests were written down | 2,430 | 712,528 | 328,553 (97.3% of swings) | 119,013 |
| 2026 | Explored first, so reported only as a replication | 2,424 | 715,450 | 329,019 (97.3% of swings) | 118,880 |
A tracked swing is any swing with a recorded contact point, excluding bunts. A batted ball is a tracked swing put in play with a measured exit velocity.
The contact point
Statcast records, for each swing, the distance in inches between the hitter's center of mass (the midpoint between his hips) and the point where bat met ball, measured toward the pitcher. For a miss, it is where the bat passed closest to the ball. Larger values mean contact further in front. The field is intercept_ball_minus_batter_pos_y_inches in Savant's CSV documentation.
As a check that we read the field the way Savant does, we recomputed each 2025 hitter's average and compared it with Savant's published Batting Stance leaderboard. For 99.6 percent of 542 hitter-and-side combinations, our average was within half an inch of Savant's, and the typical difference was 0.04 inches.
Taking the pitch out of it
Where contact happens depends on the pitch. For each season and batting side, we fit a straight-line model of contact point that gives every hitter his own baseline and adjusts for the pitch: how far inside or outside and how high it crossed the plate (with squared terms and their combination), its speed (allowed to work differently for breaking balls and offspeed pitches), its type, whether the pitcher threw from the same side, the balls in the count, and whether there were two strikes.
Under this model, the pitch explains 46.5 percent (left-handed hitters) and 45.0 percent (right-handed hitters) of a hitter's swing-to-swing movement in 2025, and almost exactly the same in 2026. Each extra mile per hour moves contact about 0.46 to 0.48 inches deeper. The adjusted contact point is what remains after the pitch's share is removed, and every hitter is then compared with his own season average of it.
Five groups of batted balls
We sorted 2025 batted balls into five equal groups by adjusted contact point relative to the hitter's own average, using the same cut points for every hitter. Each rate below compares a hitter's batted balls only with his own others, then adds back the league average, so differences between hitters do not drive the pattern.
| Group (inches vs. his norm) | Hits per 100 | Singles | Doubles and triples | Home runs | Total bases per batted ball |
|---|---|---|---|---|---|
| Deepest (-9.5) | 32.8 | 26.2 | 5.4 | 1.2 | .422 |
| Second (-3.2) | 32.6 | 23.3 | 6.3 | 2.9 | .480 |
| Middle (+0.3) | 31.5 | 20.6 | 6.5 | 4.3 | .515 |
| Fourth (+3.7) | 31.3 | 18.1 | 7.1 | 6.0 | .570 |
| Most in front (+9.2) | 31.3 | 15.2 | 8.0 | 8.1 | .643 |
The 2026 season matches within about 1 per 100 in every cell. Out-front swings also missed more often: about 2.5 more misses per 100 swings (likely range 2.1 to 2.9) for each 8.2 inches further in front, which is one standard deviation of contact point across all swings. Across batted balls alone, one standard deviation is 6.7 inches.
The view from above the plate
Figure 2 uses actual contact points, before any pitch adjustment. Depth is the Statcast contact point minus the hitter's average depth in the batter's box from Savant's leaderboard, which gives inches in front of the plate's front edge. Left and right is where the pitch crossed the plate, with left-handed hitters flipped so every hitter stands on the left. Squares are 3 by 3 inches and are shown only when they hold at least 150 batted balls. One 2025 batted ball was dropped because its hitter was missing from the leaderboard.
Ten-game stretches
We split each hitter's season into consecutive 10-game stretches, keeping stretches with at least 2 at-bats, 1 batted ball and 3 tracked swings per game, and hitters with at least 3 such stretches. For each stretch we compared the hitter's average adjusted contact point with his results, again only against his own other stretches. The link is a correlation, which runs from -1 to +1, where 0 means no relationship.
| 2025, 4,290 stretches | Link with contact point | Likely range |
|---|---|---|
| Batting average | -0.03 | -0.06 to 0.00 |
| Isolated power (extra bases per at-bat) | +0.10 | +0.07 to +0.13 |
| Home runs per plate appearance | +0.11 | +0.08 to +0.14 |
Contact point also persists. After accounting for recent results, a hitter's last 10 games of contact point are linked with his next game's at about 0.24, and with the game 15 games later at about 0.16.
Next-game forecasts
For each hitter's game, we built forecasts using only his earlier games that season: his season-to-date and recent batting average, expected batting average, exit velocity, hard-hit rate, isolated power, home-run rate and plate appearances per game. Season-to-date rates were pulled toward league averages computed from earlier dates only. A second version added his recent contact point, how much it varied, and how far it sat from his norm. Each month from May to September, both versions were trained on earlier months and scored on that month, on 33,580 hitter-games in 2025.
We scored the forecasts with log loss, which penalizes confident wrong forecasts most, so lower is better. Adding contact point made all three forecasts slightly worse: log loss rose by 0.0006 for at least 1 hit, 0.0004 for at least 2 total bases, and 0.0008 for at least 1 home run, and each likely range sat above zero. In the 2026 late-season holdout, contact point made no measurable difference. No betting prices were used.
Registered in advance
The question, data, tests, pass marks and wording rules were written down and fingerprinted with a SHA-256 hash before any 2025 league data was requested. The preregistration's SHA-256 is 3b8f087bef2ca132af384dd8feac5c0642ae8c15bbe722df94f2329f6c1b6f7a, frozen at 17:00 UTC on October 15, 2026; the 2025 data was requested from 17:01 to 17:29 UTC that day. Because we had already explored 2026, 2025 is the test season. The seven main tests used a Holm correction, a standard way of raising the bar when several tests are run at once, and each also had to clear a minimum size that would matter.
| Test (2025) | Result | Verdict |
|---|---|---|
| Fewer hits per batted ball out front | Most in front minus middle: -0.1 per 100 (likely range -0.95 to +0.65) | Failed (needed at least 1.0 fewer) |
| More home runs per batted ball out front | +3.8 per 100 (likely range +3.3 to +4.2) | Passed |
| Batting average over 10-game stretches | -0.03 (likely range -0.06 to 0.00) | Failed |
| Isolated power over 10-game stretches | +0.10 (likely range +0.07 to +0.13) | Passed |
| Next-game forecast, at least 1 hit | Slightly worse with contact point | Failed |
| Next-game forecast, at least 2 total bases | Slightly worse | Failed |
| Next-game forecast, at least 1 home run | Slightly worse | Failed |
Ten implementation choices that the preregistration left open were written down before any result was seen. One of them came from a test that caught a small leak: an early version pulled rates toward full-season league averages, which include later games. It was fixed to use only earlier dates before any result was viewed. The 2026 exploration that came first is published in the bundle and labeled as exploratory.
Three hitters (examples)
Ty France, Cal Raleigh and Shohei Ohtani were chosen as examples after the main test, and the rules for measuring them were written down before their contact points were computed. The shift is the change in each hitter's average adjusted contact point relative to the league, with a likely range from rerunning on reshuffled samples of his own games. They carry no test, and three hitters cannot confirm or refute a league-wide pattern.
| Hitter | Home runs, 2025 to 2026 | Isolated power | Contact point shift (inches) | Within-season link with power |
|---|---|---|---|---|
| Ty France | 7 to 21 | .104 to .207 | +1.1 (+0.1 to +1.9) | +0.22 (-0.04 to +0.47) |
| Cal Raleigh | 60 to 23 | .342 to .188 | -1.4 (-2.2 to -0.6) | +0.24 (-0.03 to +0.49) |
| Shohei Ohtani | 55 to 30 | .340 to .237 | -2.2 (-2.9 to -1.5) | -0.17 (-0.39 to +0.11) |
Checks
- Inputs: every input file matched the fingerprint in its receipt, and tracked swings were 97.3 percent of all swings in both seasons.
- Same measure both years: the pitch model explained nearly the same share in each season.
- Leakage: a deliberately leaky input (same-game total bases) was rejected by the forecast code, and a test confirmed that changing a game's own data never changes the forecast for that game.
- Shuffle check: shuffling contact points within each hitter produced home-run and hit slopes near zero, and the real slopes fell well outside that range.
- Sensitivity: all seven main results kept their direction under seven alternative versions: the pitch model fit on the first ten weeks only, hard swings only, fastballs only, groups cut within each hitter, a richer pitch model, the two hitters studied earlier left out, and forecasts limited to games with at least 3 plate appearances.
- Repeatability: two runs in separate folders produced byte-identical results.
Where each number comes from
All paths are in research/mlb03/ in the private pascal-abs-research repository and are included in the replication bundle. The research claim ledger, CLAIM_LEDGER.md, maps each statement to its source, and the publishing ledger is content/pieces/contact-point-home-runs/ledger.md in the pascal-site repository.
| Article statement | Value | Source |
|---|---|---|
| Share of movement explained by the pitch | nearly half (45.0% to 46.5%) | output/run1/results.json (adjustment) |
| Contact depth per mile per hour | about half an inch | output/run1/results.json (adjustment) |
| Average contact vs. the plate | about 2 inches in front | output/figures_meta.json |
| Hits, singles, home runs by group | 32.8 to 31.3; 26 to 15; 1 to 8 per 100 | output/run1/results.json (H1, H2, secondary) |
| Total bases per batted ball | .422 to .643 | output/run1/results.json (secondary) |
| Misses | 2.5 more per 100 swings per 8 inches | output/run1/results.json (swing_whiff) |
| 10-game link with isolated power | about +0.10 | output/run1/results.json (H3) |
| Persistence of contact point | 0.24 next game, 0.16 at 15 games | output/run1/results.json (horizons) |
| Forecast tests | all three slightly worse | output/run1/results.json (H4) |
| Three hitters | as above | output/case_studies.json |
Figures
The three figures are generated by research/mlb03/figures.py from the outputs above, and no figure value is typed by hand. The files on this page match the research figure manifest (figures/FIGURES_MANIFEST.json) by SHA-256. Figure 1 shows the five groups, Figure 2 the view from above the plate, and Figure 3 the three hitters. Two renders of each figure were byte-identical.
Replication bundle
The research repository is private, so the material behind this page is published as a replication bundle (about 690 KB). It contains the charter, the frozen preregistration with its SHA-256, provenance, the validation plan, implementation notes, owner decisions, results and the claim ledger, the acquisition, analysis, example and figure code with its tests, the earlier 2026 exploration, the figures, and the aggregate outputs. MANIFEST.txt lists the SHA-256 of every file, and README.txt names the source commit. Raw Statcast files and row-level tables are not redistributed.
Limitations
Two seasons is a short record; every-swing bat tracking began in 2024, and 2024 was not used. The batted-ball results count only balls put in play. Earlier contact tends to mean more lift and more pull, so part of the link between contact point and power is mechanical, and nothing here shows which way cause runs. The pitch model gives every hitter the same adjustment for speed and location. The forecasts did not include the opposing pitcher, the park or the batting order, and no betting prices were tested. A small link between recent contact point and next-game home runs, about +0.02 in both seasons, did not survive the forecast test and is not a finding. In the research ledger, one number was corrected before publication: the miss rate is per 8.2 inches of contact point, not 6.7.