← Jack Quinn

PennantBench: LLMs beat a projection system at predicting MLB player value, but not the front offices

2026-09

Three glowing line-drawn stick figures on a black background: a pitcher on the left with a dotted trajectory line, a batter in the middle holding out a bat, and a crouching fielder on the right.

I gave frontier models the stat lines MLB clubs had before the 2026 season and scored their forecasts against what actually happened. Sonnet 5.5 and Opus 5.5 beat the Marcels, a standard projection system, by about 8%. All of that edge came from predicting playing time, and none of it from projecting talent. Then I replayed 811 real keep-or-release decisions, and nothing beat the clubs.

These are the results so far from PennantBench, a project I’ve been working on to see whether LLMs can forecast players and make roster decisions better than the usual baselines.

At a glance

Better forecasts, no better decisions.

Forecast error against the Marcels, and roster decisions against the clubs.

Forecasting 2026 player value−8% errorSonnet 5.5 against the Marcels, −0.78 runs per player [−1.00, −0.57], and all of it from predicting playing time.
811 keep-or-release decisions≈ the clubsNo rule beat the clubs. Only keeping everyone was clearly worse, by $207M.

The setup

Every policy in PennantBench sees only what was public on a real decision date, and it’s scored against the real 2026 season.

I started with a simulated league, but the early pilots gave small, noisy differences in wins across four simulated worlds. Real outcomes avoid that. The 2026 season happened once, the same way for every policy, so when two forecasts differ, the difference isn’t game noise.

The models get information through 2025 and are scored on 2026. That season ended after their training data, and when I probed them for 2026 knowledge, they didn’t have any. The players are the 983 who had at least 100 plate appearances or 100 batters faced in 2025, and the models see them as anonymized stat lines.

Here’s what that looks like. Each request has 40 players, and the model answers with one tool call. This is one player from one request, trimmed:

System: You are an MLB front-office analyst. It is the 2025-26
offseason: you know results only through the end of the 2025
regular season. […]

User: Forecast the 2026 season for each anonymized MLB hitter
below. […] Each forecast is scored by absolute error, so give
your median expectation and account for injury, role, aging and
roster risk. […]

H003164 | age 26
  2023: PA 44, […] wOBA 0.356
  2024: PA 259, […] wOBA 0.355
  2025: PA 452, AB 388, H 110, […] HR 19, BB 43, […] wOBA 0.367

Sonnet 5.5 (medium), submit_hitter_forecasts:
{"id": "H003164", "pa": 480, "woba": 0.348}

The Marcels projected 452 plate appearances and a .358 wOBA for this player. Sonnet’s two samples both said 480 PA, at .348 and .347. The player actually got 717 PA at .330. Here Sonnet beat the Marcels on both, by 28 PA and by 10 points of wOBA. Across all 983 players, only the playing-time half of that held up.

The baseline is the Marcels, a projection system that takes a weighted average of a player’s last three seasons, regresses it toward the league average and adjusts for age. I also built an “easy hybrid” that uses Marcel rates plus last season’s playing time. Everything is scored in rar-v1, a simple runs-above-replacement number built from wOBA for hitters and FIP for pitchers.1 It isn’t WAR, and I’ll come back to what it leaves out.

Figure 01

What each policy could see, and when.

Every policy sees only what was public on its decision date. The gap between November and February is where the clubs make their winter moves.

  1. End of the 2025 season

    The last stats any model sees. Stat lines cover 2023 to 2025.

    Findings 1 and 2
  2. November 1, 2025

    The November information set: stat lines plus position, injured-list history and Triple-A lines, with no roster status. Also the decision date for the keep-or-release replay.

    Findings 3 and 4
  3. November to February

    Clubs decide options, tender or non-tender arbitration players, release players and sign free agents.

    The decisions replayed in Finding 4
  4. February 15, 2026

    The February information set: the same context brought up to that day, plus who is on a 40-man roster.

    Findings 2 and 3
  5. 2026 regular season

    What actually happened. Every forecast and decision is scored against it.

    Every finding

Finding 4 repeats the November 1 cutoff for the 2023-24 and 2024-25 offseasons, scored on 2024 and 2025.

I froze each study’s protocol before any model saw a prompt. Where I worked something out afterwards, I’ll say so. Every comparison is paired: the same players, scored against the same season, so each interval is on the difference itself, from 2,000 bootstrap resamples of players (or of decisions, in Finding 4). The whole thing cost about $13 of API spend, plus some subscription quota for the DeepSeek runs.

Finding 1: LLMs beat the Marcels, all through playing time

Sonnet 5.5 and Opus 5.5 cut player-value error by about 8% against the Marcels and about 4% against the easy hybrid. The result held up when I reran it on fresh prompts.

Model Error vs Marcels (runs/player) Error vs hybrid (runs/player)
Sonnet 5.5 high −0.78 [−1.00, −0.57] −0.41 [−0.62, −0.20]
Opus 5.5 medium −0.77 [−0.98, −0.55] −0.40 [−0.61, −0.20]
Sonnet 5.5 medium −0.74 [−0.96, −0.51] −0.37 [−0.58, −0.16]
GPT-6 Luna −0.48 [−0.72, −0.23] −0.11 [−0.34, +0.14]
DeepSeek V4.1 Flash −0.36 [−0.59, −0.14] +0.01 [−0.22, +0.23]
Haiku 5.5 +0.42 [+0.22, +0.63] +0.79

Negative means less error than the baseline. The Marcels’ error is 9.77 runs per player. The Sonnet and Opus rows come from the replication run, and the Luna, DeepSeek and Haiku rows from the first run. The 95% intervals come from resampling players.

Figure 02

Frontier models beat the Marcels. Small ones don't.

Change in player-value error against the Marcels, in runs per player. Left of zero means less error than the Marcels.

−1.00−0.500.00+0.50MarcelsEasy hybridSonnet 5.5 high: −0.78 runs/player [−1.00, −0.57]Sonnet 5.5 high−0.78Opus 5.5 medium: −0.77 runs/player [−0.98, −0.55]Opus 5.5 medium−0.77Sonnet 5.5 medium: −0.74 runs/player [−0.96, −0.51]Sonnet 5.5 medium−0.74GPT-6 Luna: −0.48 runs/player [−0.72, −0.23]GPT-6 Luna−0.48DeepSeek V4.1 Flash: −0.36 runs/player [−0.59, −0.14]DeepSeek V4.1 Flash−0.36Haiku 5.5: +0.42 runs/player [+0.22, +0.63]Haiku 5.5+0.42← less errormore error →

Lines are 95% intervals from a player bootstrap. The Marcels' error is 9.77 runs per player, so −0.78 is about 8%. The easy hybrid line is Marcel rates plus last season's playing time.

Splitting the error into rates and playing time shows where the gain comes from. No model beat the Marcels at projecting rates (wOBA for hitters, FIP for pitchers), over the full season or in August and September. The frontier models were better at guessing who would actually be on the field: they cut playing-time error by about 32 plate appearances per hitter and 4 to 5 innings per pitcher.

Figure 03

The whole edge is playing time.

Each model's hitter error minus the Marcels' error. Left of zero means less error than the Marcels. The frontier models guess playing time much better and rates no better at all.

Playing time: plate appearances per hitter−40−200+20Sonnet 5.5 high: −33 [−40, −26]Sonnet 5.5 high−33Opus 5.5 medium: −33 [−41, −25]Opus 5.5 medium−33Sonnet 5.5 medium: −32 [−40, −25]Sonnet 5.5 medium−32GPT-6 Luna: −27 [−34, −21]GPT-6 Luna−27DeepSeek V4.1 Flash: −25 [−31, −19]DeepSeek V4.1 Flash−25Haiku 5.5: +10 [+3, +17]Haiku 5.5+10Rate: wOBA, in thousandths−4−20+2+4Sonnet 5.5 high: 0.0 [−1.3, +1.3]Sonnet 5.5 high0.0Opus 5.5 medium: +0.2 [−0.9, +1.4]Opus 5.5 medium+0.2Sonnet 5.5 medium: +0.2 [−1.2, +1.4]Sonnet 5.5 medium+0.2GPT-6 Luna: +1.0 [−0.3, +2.3]GPT-6 Luna+1.0DeepSeek V4.1 Flash: +0.9 [−0.3, +2.1]DeepSeek V4.1 Flash+0.9Haiku 5.5: −0.1 [−1.0, +0.8]Haiku 5.5−0.1← less error than the Marcels

Hitters only. Pitchers show the same split: the frontier models cut innings error by about 4 to 5 per pitcher, and their FIP error stayed within about ±0.03 of the Marcels'. Lines are 95% intervals from a player bootstrap.

The gain also levels off. Sonnet at high effort2 was only −0.04 runs better than Sonnet at medium [−0.09, 0.00], and Opus was −0.03 better [−0.15, +0.09]. My guess is that three seasons of stat lines are the limit here, and a bigger model can’t get more out of them.

I don’t think it’s memory either. Sonnet at medium effort could name only 5% of a random sample of players from their stat lines, and it gained as much as Opus, which could name every star I tested.

Smaller models didn’t help. Haiku was worse than the Marcels, and DeepSeek and Luna only matched the easy hybrid.

Finding 2: names make forecasts worse

Next I gave Sonnet 5.5 more to work with, and in a separate test told it who each player was. I planned both comparisons before any model output.

The extra context helped a lot. Adding injured-list history, Triple-A stat lines, 40-man roster status3 and position cut error by −0.40 runs per player [−0.56, −0.24], which moves the edge over the Marcels from about 8% to about 12% (−1.14 runs per player). Adding names to those same records made the forecasts worse, by +0.28 runs [+0.07, +0.49].

I worked out where that came from after the fact, so treat this part as a hypothesis. Names made the model more optimistic about well-known players:

Figure 04

The name makes the model more optimistic, most of all about stars.

How far forecasts ran above actual 2026 value, on average, with the same records shown anonymously and with names. Players are ranked by their Marcel projection.

+0+2+4+6+8+10Top 100: +6.0 runs anonymous, +9.3 namedTop 100+6.0+9.3101 to 300: +3.7 runs anonymous, +6.3 named101 to 300+3.7+6.3Remaining 683: +0.7 runs anonymous, +1.2 namedRemaining 683+0.7+1.2over-forecast, runs per player →

Sonnet 5.5 at medium effort, given injured-list history, Triple-A lines, 40-man status and position in both arms. This breakdown wasn't planned in advance.

For the top 100 hitters, the named model predicted 608 plate appearances and a .350 wOBA. The anonymous model predicted 592 and .346. They actually finished at 564 and .336.

It shows up player by player too. Of the 134 hitters the Marcels projected for at least 500 plate appearances, the name raised the forecast’s value for 96. These are the five it raised the most, each shown as plate appearances and wOBA:

Hitter Anonymous Named Actual 2026 Value error, anonymous → named (runs)
Gunnar Henderson 655 / .348 660 / .363 702 / .312 19.8 → 28.7
Mookie Betts 590 / .329 630 / .342 528 / .336 0.0 → 8.6
Trea Turner 580 / .336 630 / .346 700 / .297 17.8 → 26.1
William Contreras 620 / .335 650 / .346 640 / .330 2.5 → 10.2
James Wood 655 / .345 670 / .356 623 / .382 17.2 → 10.1

The name made four of the five forecasts worse, by 7.7 to 8.9 runs each. The exception is James Wood, who outhit even the named forecast. Each figure is the average of the model’s two samples, and each prompt showed a player either anonymously or by name.

The name pulls the forecast toward the player’s reputation and away from the evidence in the stat line. So if you’re using an LLM to evaluate players, give it de-identified records with as much information as you can. I’ve only tested this on Sonnet 5.5 at medium effort, though, and the reputation explanation still needs to be replicated.

Finding 3: the context gain was mostly the clubs’ own roster moves

Most of the gain from extra context came from one field, and that field already records what front offices decided over the winter.

I ran DeepSeek V4.1 Flash at low effort with three information sets: stat lines only, what was known on November 1, 2025, and what was known on February 15, 2026. The February context beat the easy hybrid by −0.57 runs [−0.83, −0.33]. The November context didn’t: −0.10 [−0.32, +0.11].

When I broke that down afterwards, 86% of the gap between the two came from the 159 players who weren’t on any 40-man roster on February 15. Their error fell from 5.63 runs to 3.15. For the other 824 players, it moved by only −0.08.

February roster status reflects non-tenders, releases and signings. For those 159 players, the model was mostly reading an answer key the front offices had already written.

Figure 05

Most of the February gain comes from 159 players who were off every 40-man roster.

Forecast error removed by giving DeepSeek what was known on February 15 instead of November 1, split by whether the player was on any 40-man roster on February 15.

86%14%0≈460 runs of error removed
159 players · not on a 40-man roster394 runs5.63 → 3.15 runs per player
824 players · everyone else66 runs−0.08 runs per player

DeepSeek V4.1 Flash at low effort. Totals are the per-player change times the number of players, so they're approximate. This breakdown wasn't planned in advance.

I only did this breakdown for DeepSeek. The extra context in Finding 2 used the same roster field, so part of Sonnet’s gain probably came from the same place, but I haven’t measured that.

Finding 4: nothing beat the front offices on keep-or-release decisions

Then I checked whether better forecasts lead to better decisions. I replayed 811 real club options and arbitration tenders across three offseasons and compared each rule’s keep-or-release calls with what the clubs actually did.

Figure 06

No rule beat the clubs' keep-or-release calls.

Surplus each rule would have earned on 811 real club options and arbitration tenders, minus what the clubs actually earned. Right of zero means the rule did better than the clubs.

Rulevs clubs, $MRight when itdisagreedClubs−2000+200Marcel rule: +56M [−76, +199] vs the clubs, right 40% of the time it disagreedMarcel rule+56 [−76, +199]40%DeepSeek valuation (2025 and 2026 only): +55M [−84, +194] vs the clubs, right 52% of the time it disagreedDeepSeek valuation2025 and 2026 only+55 [−84, +194]52%stat-v1 regression: +32M [−125, +182] vs the clubs, right 50% of the time it disagreedstat-v1 regression+32 [−125, +182]50%Easy hybrid: −21M [−195, +142] vs the clubs, right 51% of the time it disagreedEasy hybrid−21 [−195, +142]51%DeepSeek deciding directly (2025 and 2026 only): −44M [−186, +96] vs the clubs, right 48% of the time it disagreedDeepSeek deciding directly2025 and 2026 only−44 [−186, +96]48%Keep everyone: −207M [−379, −29] vs the clubs, right 30% of the time it disagreedKeep everyone−207 [−379, −29]30%

Lines are 95% intervals. Surplus is valued at $0.75M per run; the clubs' decisions totaled $3,446M.

No rule measurably beat the clubs. Every interval but one spans zero, and the best point estimates are under 2% of total surplus. The exception is keeping everyone, which would have cost $207M, so the clubs’ cuts carried real information.

The replay also couldn’t have caught a small edge. The clubs’ decisions earned $3,446M of surplus in total, and the intervals are about ±$150M wide, so a rule would have had to beat the clubs by more than 4% of everything they earned before this replay could tell it apart from luck. More offseasons will narrow the intervals.

A plain regression also out-forecast the LLM. stat-v1 is a ridge regression on the November 1 information, and it beat the Marcels by −0.87 runs per player and the easy hybrid by −0.52. DeepSeek, given the same information, did worse than it by +0.36 [+0.03, +0.73]. The closest any rule came to the clubs was stat-v1 on the 90 club options, at +$50M [−2, +112].

The clubs also had medicals, Statcast and scouting reports that none of these rules saw, and as Finding 3 showed, the LLMs’ best context was partly the clubs’ own decisions.

I left out DeepSeek’s 2024 results because it knew how 2024 turned out. Sonnet and Opus were only scored on the 2026 decisions, as a descriptive comparison: −$3M and −$21M against the clubs, both with wide intervals.

Caveats

People who know baseball analytics will look for these.

Where this leaves things

LLMs help with forecasting, mostly because they’re better at guessing who will play. I haven’t found evidence that they make better decisions than the people who make them for a living, and some of what looked like the models’ judgment was the clubs’ judgment showing up in the data.

Next, I want to replicate all of this on the 2027 season, check whether an LLM adds anything on top of the stat-v1 regression, and run Sonnet and Opus on the full three-offseason replay.

If you have a forecasting rule or a baseline you think would do better than stat-v1, or than the clubs, send it to me. I’d like to run outside policies against the same 811 decisions in the 2027 round.

Footnotes

  1. wOBA (weighted on-base average) credits each way of reaching base by how many runs it’s worth, on roughly the same scale as on-base percentage. FIP (fielding independent pitching) estimates a pitcher’s run prevention from strikeouts, walks, hit batters and home runs alone, on the ERA scale. ↩

  2. The effort level (low, medium or high) sets how much reasoning a model does before it answers. Unless I say otherwise, models ran at medium. ↩

  3. A club’s 40-man roster is everyone it controls who can be called up to the majors. A player on no 40-man roster in February has usually been released or non-tendered, or signed a minor-league deal. ↩