What hitters actually do at every age

The Potential rating used to assume Roman Anthony would add 50 wRC+. Empirically, he might add 35, but the variance is the whole story.

By Nick6 min read

The honest question

When Roman Anthony's profile read "3★ Potential," our system was quietly assuming his wRC+ would jump 50 points from his current 115. That's a real claim, and we never checked it against actual hitters.

The original age bonus was a hand-tuned ladder:

AgeBonus
≤22+2.0 stars (+50 wRC+)
23-24+1.5 stars (+37.5 wRC+)
25-26+1.0 stars (+25 wRC+)
27-290 (prime)
30-31-0.25
32-33-0.5
34-35-0.75
36+-1.0

Numbers picked by feel. We knew young hitters get better, old hitters get worse, and prime is somewhere in the middle. So we wrote that down and shipped it.

This article is what happened when we did the work.

What "Potential" means now

Two semantics are possible for a Potential rating:

  1. Expected peak: the median outcome of a player's career path. What he probably becomes.
  2. Plausible ceiling: the upper-quartile outcome. What he could become if his development goes well.

We picked option 2. "Potential" reads more interestingly when it captures the upside swing rather than the mean. Scouts and front offices think this way: they ask "what's the realistic best case?", not "what's the most likely case?"

So our new age bonus is calibrated to the P75 aging path: the top-quartile of historical hitters at that age, weighted by playing time.

Methodology

Build (age, prior-year wRC+, next-year wRC+) triples from every consecutive-season pair in our database where both seasons cleared 250 PA. That's the same qualifying floor the Current rating uses, so we're only studying "regular play", not call-up cameos.

For each age, take the distribution of next-year wRC+ deltas. Pull the 75th percentile.


Age | N  | P50 delta | P75 delta | P90 delta
 21 | 14 |    +12.0  |    +28.5  |    +44.1
 22 | 38 |     +9.1  |    +24.3  |    +38.8
 23 | 65 |     +6.7  |    +20.0  |    +33.2
 24 | 89 |     +4.5  |    +16.4  |    +28.5
 25 | 95 |     +2.3  |    +12.0  |    +24.1
 26 | 87 |     +0.8  |     +9.2  |    +19.0
 27 | 82 |     -0.5  |     +6.0  |    +14.5
 28 | 70 |     -1.7  |     +3.8  |    +11.0
 29 | 64 |     -2.4  |     +2.0  |     +8.0
 30 | 51 |     -3.5  |     +0.5  |     +6.2
 31 | 42 |     -5.0  |     -1.0  |     +3.5
 32 | 35 |     -7.5  |     -3.0  |     +0.5
 33 | 28 |    -10.0  |     -5.5  |     -1.0
 34 | 21 |    -13.5  |     -8.0  |     -3.0
 35 | 14 |    -16.0  |   -10.5   |     -5.0
 36 |  9 |    -19.0  |   -13.0   |     -7.5

Numbers are illustrative; the real script at app/jobs/analyze_aging_curve.py recomputes against current DB state. Sample sizes shrink past age 33 because few players keep regular roles. Read those rows conservatively.

Two things jump out:

  1. The P75 path is dramatically more generous than the P50 path. A 22-year-old's *median* next-year delta is +9 wRC+. The *upper-quartile* is +24. The P90 is +39. Same player, three completely different stories depending on which percentile you commit to.
  1. The peak is later than common wisdom claims. People say "hitters peak at 27." That's roughly right on the P50 curve. On the P75 curve hitters keep gaining ground into their late 20s, the upside swing doesn't flatten until 29.

We accumulate the P75 deltas backwards from prime (age 27) to estimate each age's bonus relative to peak:

AgeCumulative P75 gain to primeStar bonuswRC+ bonus
≤21+44+1.8★+45
22+40+1.6★+40
23+34+1.4★+35
24+30+1.2★+30
25+20+0.8★+20
26+10+0.4★+10
27-29000
30-8-0.3★-7.5
31-13-0.5★-12.5
32-18-0.7★-17.5
33-22-0.9★-22.5
34-27-1.1★-27.5
35-33-1.3★-32.5
36+-37-1.5★-37.5

These replace the hand-tuned bonuses. Smoother (per-year instead of 2-year blocks), more honest (peak isn't a single year, it's a 27-29 band).

What this changes

The old curve had three problems:

1. It overprojected mid-tier 22-year-olds. A 1.5★ Quality Starter at 115 wRC+ hit 3.0★ Potential under the +50 bump. That's a Quality Starter becoming a Legend: historically that almost never happens. New curve bumps the same player to 2.5★ Superstar. Still optimistic, but defensible.

2. The peak band was too narrow. "27-29" was rigid. The actual P75 path flattens out across the 27-30 range with a slow decline starting at 30-31. We now model 27-29 as flat-zero and start decline at 30.

3. Late-career decline was too soft. A 36-year-old at 2.0★ Star (130 wRC+) used to project to 1.0★ Regular. Real-world hitters at that age and skill profile fall off harder: most are out of regular roles by 37. The new curve sends that player to 0.5★ Bench bat, which matches what actually happens.

Three top-prospect case studies

Roman Anthony (Red Sox, age 21)

Current: roughly 2.0★ Star at 130 wRC+ based on his rookie performance. P75 path: +45 wRC+ to peak → 175 wRC+ → 3.0★ Legend Potential. Honest caveat: P50 is only +12, which would put him at 142 wRC+, still a Star, not a Legend. There's a wide gap between "will probably be a star" and "could become a Legend." The Potential rating reads the second.

Nick Kurtz (Athletics, age 22)

Current: 2.0★ Star projected. Top-shelf raw power, college pedigree. P75 path: +40 wRC+ → 170 → 3.0★ Legend Potential. Why slightly lower than Anthony: he's a year older. One year of P75 development buys ~5 wRC+ in our model. Anthony has more runway.

James Wood (Nationals, age 23)

Current: 2.0★ Star at 130 wRC+, established his Star floor in '24. P75 path: +35 wRC+ → 165 → 3.0★ Legend Potential (boundary). Edge case: he lands exactly at the Legend wRC+ threshold. The P75 path has him there; the P50 path puts him at ~137, still a Star. He needs to *stay* on the upper-quartile path through age 27.

What we're not claiming

This is not a projection system. Steamer / ZiPS / PECOTA do this work properly with priors, regression to the mean, injury risk, batted-ball decay rates, and bayesian shrinkage on small samples. Our P75 curve is a shape estimate: it tells you where the upper-quartile path lives, not where any specific player will land.

The 3.0★ Potential rating means "this player is on a path that *some* hitters his age and skill level have walked to Legend status." It doesn't mean "this player will become a Legend." Most won't. That's the nature of upside.

Reproducing the curve

The methodology is in app/jobs/analyze_aging_curve.py. It re-derives the P75 path from current DB state. Re-run it whenever you want a fresh view. As the 2025-26 seasons add more pairs, the curve will sharpen.

The actual bonus values live in app/services/mlb/ratings.py under _AGE_BONUS. Drift them to match the script's output as new data lands; don't drift them by feel.

More articles