How accurate are our MLB win odds and projections
Plain words first, tables second. We show what the model got right and wrong, and we say so when a number is not good enough to rely on.The short version
Win chances come from a team-strength model that is level with the closing market in our 2025 backtest (0.6783 vs 0.6758, gap not significant). It does not beat the market.
2026 (out of sample). Replayed from information available before each game, not a live lock.
Over 2429 games our win chance scored a log loss of 0.683 (lower is better; a coin flip scores 0.693, the home-win rate 0.692). That is better than both a coin flip and always using the home-win rate.
The side we favored won 55.5% of games (1349 of 2429).
Tier earned: Clear favourite (60%+) (2025: 573 games, 64.2% claimed, 63.2% won; 2026: 499 games, 63.4% claimed, 61.3% won). Higher buckets (65%+, 70%+) have not earned a label yet.
How we score ourselves
A game projection is only worth reading if we show how earlier ones scored. We print every table, including the bad ones.
No peeking. Every input is what was known before first pitch: lineups as posted (the starting nine), the announced starter, bullpen availability from the games before that day, profiles from the three prior seasons plus the season to date, models trained on earlier seasons only.
Fitting. Win chances are fitted on one season and applied unchanged to the next. 2025 is scored cross-fit (fitted on one half of the season by calendar week, scored on the other half); 2026 uses the 2025 fit and nothing from 2026.
Which seasons. 2025 is the development year (design choices were tuned on 2025); 2026 is the untouched out-of-sample year.
Log loss scores each game by how much probability we gave the side that won, then averages. Lower is better. Calling every game 50-50 scores 0.693.
Calibration asks whether "60%" really means about 60%: games we gave a bucket of probability, and how often the home side won.
Average miss is how far a projected stat is from the real one in a typical game.
How our win chance is built
Win chances come from a team-strength model (regressed run differential, starter quality, lineup quality, home field). They do not come from the 1,000-game simulation, whose own win probability carried no information beyond the home-field rate in this backtest.
The 1,000-game simulation's own win probability is not what we publish: on the 810 games it was scored on (2025 (cross-fit)) it scored a log loss of 0.6823 against 0.6911 for always picking the home side.
| Input | Weight |
|---|---|
| Team strength: this season's run differential blended with last season's | 0.592 |
| Lineup quality: the posted batting order | 0.073 |
| Starter quality: the announced starting pitcher | 0.387 |
Home field is built into the fit. Fitted on 2025 (2430 games) and applied unchanged to later games.
Win chancelog loss, lower is better
| Set | Games | Home won | Coin flip | Home rate | Our win chance [95%] | Closing market | Ours, same games | Favorite won |
|---|---|---|---|---|---|---|---|---|
| 2026 (out of sample) | 2429 | 52.9% | 0.6931 | 0.6919 | 0.6827 [0.6766, 0.6889] | none | 55.5% | |
| 2025 (cross-fit) | 2430 | 54.3% | 0.6931 | 0.6895 | 0.6786 [0.6721, 0.6857] | 0.6758 (n 2268) | 0.6783 | 56.3% |
Calibration: 2026 (out of sample)
| Home win chance bucket | Games | We said | Home won |
|---|---|---|---|
| 0.30 to 0.40 | 38 | 37.7% | 31.6% |
| 0.40 to 0.45 | 162 | 43.0% | 35.8% |
| 0.45 to 0.50 | 403 | 47.8% | 49.4% |
| 0.50 to 0.55 | 691 | 52.6% | 52.0% |
| 0.55 to 0.60 | 674 | 57.4% | 55.8% |
| 0.60 to 0.70 | 447 | 63.2% | 60.6% |
| 0.70 to 1.00 | 14 | 73.0% | 64.3% |
Calibration: 2025 (cross-fit)
| Home win chance bucket | Games | We said | Home won |
|---|---|---|---|
| 0.00 to 0.30 | 1 | 28.9% | 0.0% |
| 0.30 to 0.40 | 67 | 37.2% | 34.3% |
| 0.40 to 0.45 | 158 | 42.9% | 45.6% |
| 0.45 to 0.50 | 388 | 47.8% | 48.2% |
| 0.50 to 0.55 | 660 | 52.6% | 52.9% |
| 0.55 to 0.60 | 651 | 57.2% | 57.0% |
| 0.60 to 0.70 | 454 | 63.5% | 60.8% |
| 0.70 to 1.00 | 51 | 72.5% | 80.4% |
Run totals
Run totals aren't accurate enough to publish yet.
The rule: published only if our calibrated total has a lower mean absolute error than the naive park baseline in every out-of-sample set. Until it passes, no page shows a projected score or a run total.
Avg miss is how far a projected game total is from the real one in a typical game. The park baseline is the league average for the ballpark, season to date.
| Set | Games | Ours avg miss | Ours bias | Ours corr. | Park baseline avg miss | Park baseline bias | Park baseline corr. | League baseline avg miss | Ours minus park baseline [95%] | Closing market total | Ours, same games |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 2025 cross-fit | 810 | 3.708 | -0.01 | 0.070 | 3.649 | -0.26 | 0.119 | 3.670 | +0.059 [+0.006, +0.117] | 3.619 (n 763, bias -0.63, corr 0.133) | 3.729 |
| 2026 out-of-sample | 810 | 3.785 | +0.83 | 0.027 | 3.577 | -0.01 | 0.135 | 3.600 | +0.208 [+0.130, +0.283] | none |
| Set | Our total against the market total | Games | Went over the market total | Our total minus market, avg | Actual minus market, avg |
|---|---|---|---|---|---|
| 2025 cross-fit | ours 1.5+ runs ABOVE market | 116 | 51.4% | +1.96 | +1.00 |
| 2025 cross-fit | ours 0.5 to 1.5 above | 316 | 49.3% | +0.96 | +0.74 |
| 2025 cross-fit | within 0.5 of market | 258 | 48.0% | +0.06 | +0.49 |
| 2025 cross-fit | ours 0.5 to 1.5 below | 56 | 50.0% | -0.87 | +0.25 |
| 2025 cross-fit | ours 1.5+ runs BELOW market | 17 | 46.7% | -2.05 | -0.32 |
Confidence tiers: earned or not
Tier earned: Clear favourite (60%+) (2025: 573 games, 64.2% claimed, 63.2% won; 2026: 499 games, 63.4% claimed, 61.3% won). Higher buckets (65%+, 70%+) have not earned a label yet. A game carries the tier label only when its favorite reaches that bucket.
The test, printed so you can check it: at least 80 games in the bucket in every set; claimed probability inside the 95% interval of the realised win rate, in every evaluation set; lower 95% bound of realised win rate >= 0.55.
| Candidate tier | Result | Evidence |
|---|---|---|
| Favorite 60% or more | Earned | 2025 cross-fit: 573 games, said 64.2%, won 63.2% (95% range 59.2% to 67.0%) 2026 out-of-sample: 499 games, said 63.4%, won 61.3% (95% range 57.0% to 65.5%) |
| Favorite 65% or more | Not earned | 2025 cross-fit: 190 games, said 68.6%, won 76.3% (95% range 69.8% to 81.8%) 2026 out-of-sample: 123 games, said 67.7%, won 68.3% (95% range 59.6% to 75.9%) |
| Favorite 70% or more | Not earned | 2025 cross-fit: 52 games, said 72.5%, won 80.8% (95% range 68.1% to 89.2%) 2026 out-of-sample: 14 games, said 73.0%, won 64.3% (95% range 38.8% to 83.7%) |
| Favorite chance | Games | We said | Favorite won | 95% range |
|---|---|---|---|---|
| 0.50 to 0.55 | 1094 | 52.4% | 51.5% | 48.5% to 54.4% |
| 0.55 to 0.60 | 836 | 57.3% | 57.4% | 54.0% to 60.7% |
| 0.60 to 0.65 | 376 | 62.0% | 59.0% | 54.0% to 63.9% |
| 0.65 to 0.70 | 109 | 67.0% | 68.8% | 59.6% to 76.7% |
| 0.70 to 0.75 | 12 | 72.3% | 58.3% | 32.0% to 80.7% |
| 0.75 to 1.00 | 2 | 76.9% | 100.0% | 34.2% to 100.0% |
| 0.60 to 1.00 | 499 | 63.4% | 61.3% | 57.0% to 65.5% |
| 0.65 to 1.00 | 123 | 67.7% | 68.3% | 59.6% to 75.9% |
| 0.70 to 1.00 | 14 | 73.0% | 64.3% | 38.8% to 83.7% |
| Favorite chance | Games | We said | Favorite won | 95% range |
|---|---|---|---|---|
| 0.50 to 0.55 | 1048 | 52.4% | 52.5% | 49.5% to 55.5% |
| 0.55 to 0.60 | 809 | 57.2% | 56.5% | 53.1% to 59.9% |
| 0.60 to 0.65 | 383 | 62.1% | 56.7% | 51.7% to 61.5% |
| 0.65 to 0.70 | 138 | 67.1% | 74.6% | 66.8% to 81.2% |
| 0.70 to 0.75 | 45 | 71.9% | 77.8% | 63.7% to 87.5% |
| 0.75 to 1.00 | 7 | 76.8% | 100.0% | 64.6% to 100.0% |
| 0.60 to 1.00 | 573 | 64.2% | 63.2% | 59.2% to 67.0% |
| 0.65 to 1.00 | 190 | 68.6% | 76.3% | 69.8% to 81.8% |
| 0.70 to 1.00 | 52 | 72.5% | 80.8% | 68.1% to 89.2% |
Current season
No regular-season game was locked before first pitch this season, so there is no live ledger yet.
The live ledger starts with the 2027 season. Until then the 2026 replay above is the honest record: it uses only information available before each game, but it was not a live lock.
Player-line simulation: input adjustments
Before each simulation every hitter's input rates are rescaled: home runs x0.4, walks x1.5, strikeouts x0.8, singles x1.06. The same factors apply to every player, so differences between players are untouched.
Measured on a sample of 2025 games: without the adjustment the simulation produced 1.87 times the real number of home runs and 0.61 times the walks; with it, 1.10 and 1.02.
Batter lines: 2026 (out of sample)
Player lines are about level with a simple season-rate baseline (a hitter's own season rates): better on 4 of 8 stats, worse on 4. What they are good for is coherent lineups and playing time, not beating a hitter's own rates.
| Stat | Player games | Actual avg | Our avg | Bias | Our avg miss | Season-rate baseline avg miss | Corr. |
|---|---|---|---|---|---|---|---|
| Plate appearances | 14580 | 4.015 | 4.061 | +0.047 | 0.567 | 0.577 | 0.441 |
| Hits | 14580 | 0.861 | 0.898 | +0.037 | 0.677 | 0.683 | 0.134 |
| Home runs | 14580 | 0.123 | 0.144 | +0.021 | 0.231 | 0.215 | 0.101 |
| Runs | 14580 | 0.469 | 0.512 | +0.043 | 0.588 | 0.577 | 0.110 |
| RBI | 14580 | 0.446 | 0.495 | +0.050 | 0.646 | 0.629 | 0.087 |
| Walks | 14580 | 0.364 | 0.379 | +0.016 | 0.495 | 0.483 | 0.173 |
| Strikeouts | 14580 | 0.892 | 0.905 | +0.013 | 0.675 | 0.682 | 0.217 |
| Stolen bases | 14580 | 0.073 | 0.076 | +0.003 | 0.132 | 0.136 | 0.220 |
| Event | We said (avg) | Happened | Log loss | Brier |
|---|---|---|---|---|
| At least one hit | 57.2% | 60.1% | 0.669 | 0.238 |
| At least one home run | 13.3% | 11.5% | 0.353 | 0.101 |
| At least one walk | 32.4% | 30.3% | 0.604 | 0.207 |
Batter lines: 2025 (cross-fit)
Player lines are about level with a simple season-rate baseline (a hitter's own season rates): better on 5 of 8 stats, worse on 3. What they are good for is coherent lineups and playing time, not beating a hitter's own rates.
| Stat | Player games | Actual avg | Our avg | Bias | Our avg miss | Season-rate baseline avg miss | Corr. |
|---|---|---|---|---|---|---|---|
| Plate appearances | 14580 | 4.030 | 4.029 | -0.001 | 0.548 | 0.559 | 0.443 |
| Hits | 14580 | 0.892 | 0.892 | -0.001 | 0.683 | 0.689 | 0.133 |
| Home runs | 14580 | 0.130 | 0.130 | 0.000 | 0.226 | 0.219 | 0.113 |
| Runs | 14580 | 0.478 | 0.477 | -0.001 | 0.584 | 0.583 | 0.144 |
| RBI | 14580 | 0.462 | 0.462 | 0.000 | 0.638 | 0.633 | 0.102 |
| Walks | 14580 | 0.334 | 0.334 | 0.000 | 0.459 | 0.460 | 0.190 |
| Strikeouts | 14580 | 0.891 | 0.890 | -0.001 | 0.666 | 0.675 | 0.206 |
| Stolen bases | 14580 | 0.074 | 0.074 | 0.000 | 0.131 | 0.136 | 0.198 |
| Event | We said (avg) | Happened | Log loss | Brier |
|---|---|---|---|---|
| At least one hit | 57.1% | 61.5% | 0.665 | 0.236 |
| At least one home run | 12.1% | 12.0% | 0.362 | 0.105 |
| At least one walk | 29.1% | 28.4% | 0.584 | 0.198 |
Starting pitcher lines: 2026 (out of sample)
| Stat | Starts | Actual avg | Our avg | Bias | Our avg miss | Before rescaling avg miss | Corr. |
|---|---|---|---|---|---|---|---|
| Outs recorded | 1620 | 15.05 | 15.31 | +0.25 | 2.99 | 3.67 | 0.530 |
| Strikeouts | 1620 | 4.78 | 4.90 | +0.12 | 1.82 | 1.87 | 0.411 |
| Earned runs | 1620 | 2.41 | 2.61 | +0.20 | 1.61 | 1.57 | 0.150 |
| Hits allowed | 1620 | 4.67 | 4.88 | +0.21 | 1.76 | 1.91 | 0.274 |
| Walks | 1620 | 1.85 | 1.94 | +0.09 | 1.06 | 1.06 | 0.192 |
| Home runs allowed | 1620 | 0.71 | 0.82 | +0.11 | 0.71 | 0.71 | 0.109 |
| Pitches | 1620 | 83.73 | 85.18 | +1.45 | 10.32 | 15.27 | 0.651 |
Starting pitcher lines: 2025 (cross-fit)
| Stat | Starts | Actual avg | Our avg | Bias | Our avg miss | Before rescaling avg miss | Corr. |
|---|---|---|---|---|---|---|---|
| Outs recorded | 1620 | 15.56 | 15.54 | -0.02 | 2.85 | 3.38 | 0.361 |
| Strikeouts | 1620 | 4.86 | 4.85 | -0.01 | 1.92 | 1.93 | 0.341 |
| Earned runs | 1620 | 2.47 | 2.47 | 0.00 | 1.60 | 1.57 | 0.120 |
| Hits allowed | 1620 | 4.92 | 4.92 | 0.00 | 1.75 | 1.91 | 0.190 |
| Walks | 1620 | 1.73 | 1.73 | 0.00 | 1.05 | 1.06 | 0.154 |
| Home runs allowed | 1620 | 0.75 | 0.75 | 0.00 | 0.71 | 0.72 | 0.091 |
| Pitches | 1620 | 85.39 | 85.32 | -0.07 | 9.66 | 13.41 | 0.492 |
Bullpen availability: 2026 (out of sample)
| Set | Reliever games | Pitched | We said (avg) | Log loss | Relievers per team game, ours / actual | Pen outs per team game, ours / actual | Marked unavailable: n, pitched | Marked available: n, pitched |
|---|---|---|---|---|---|---|---|---|
| 2026 (out of sample) | 13643 | 37.3% | 0.598 | 3.14 / 3.08 | 11.1 / 11.5 | 2336, 5.0% | 4707, 53.5% |
| Chance he appears | Arms | We said | Appeared |
|---|---|---|---|
| 0.00 to 0.05 | 148 | 2.1% | 2.7% |
| 0.05 to 0.15 | 1092 | 10.9% | 2.8% |
| 0.15 to 0.30 | 3627 | 23.5% | 22.4% |
| 0.30 to 0.45 | 4336 | 37.4% | 40.8% |
| 0.45 to 0.60 | 3207 | 51.4% | 51.3% |
| 0.60 to 0.80 | 1140 | 66.8% | 58.8% |
| 0.80 to 1.00 | 93 | 84.2% | 63.4% |
Bullpen availability: 2025 (cross-fit)
| Set | Reliever games | Pitched | We said (avg) | Log loss | Relievers per team game, ours / actual | Pen outs per team game, ours / actual | Marked unavailable: n, pitched | Marked available: n, pitched |
|---|---|---|---|---|---|---|---|---|
| 2025 (cross-fit) | 13708 | 36.5% | 0.600 | 3.09 / 3.09 | 10.9 / 11.0 | 2225, 5.6% | 5022, 52.5% |
| Chance he appears | Arms | We said | Appeared |
|---|---|---|---|
| 0.00 to 0.05 | 144 | 2.5% | 1.4% |
| 0.05 to 0.15 | 1134 | 11.0% | 3.4% |
| 0.15 to 0.30 | 3798 | 23.6% | 24.0% |
| 0.30 to 0.45 | 4447 | 37.5% | 40.8% |
| 0.45 to 0.60 | 3128 | 51.3% | 52.6% |
| 0.60 to 0.80 | 1001 | 66.6% | 57.6% |
| 0.80 to 1.00 | 56 | 84.2% | 39.3% |
Substitution check: 2026 (out of sample)
| Set | Team games with a substitute bat, ours / actual | Substitute PA per team game, ours / actual | Avg miss of bench PA | Starter PA per team game, ours / actual |
|---|---|---|---|---|
| 2026 (out of sample) | 69.8% / 67.5% | 1.62 / 1.65 | 1.33 | 36.55 / 36.13 |
Substitution check: 2025 (cross-fit)
| Set | Team games with a substitute bat, ours / actual | Substitute PA per team game, ours / actual | Avg miss of bench PA | Starter PA per team game, ours / actual |
|---|---|---|---|---|
| 2025 (cross-fit) | 64.3% / 63.9% | 1.40 / 1.45 | 1.24 | 36.26 / 36.27 |
Ablations: what each input is worth
| Arm | Games | Batter H avg miss | SP outs avg miss | Relievers per game, ours (actual) | Reliever appearance log loss |
|---|---|---|---|---|---|
| 2025 (cross-fit) (as shipped) 2025 | 2430 | 0.683 | 2.85 | 3.09 (3.09) | 0.5999 |
| 2025 ablation: scorecard-recipe inputs (same games) 2025 | 810 | 0.687 | 2.85 | 3.69 (3.09) | 6.4552 |
| 2026 ablation: scorecard-recipe inputs (same games) 2026 | 810 | 0.683 | 2.97 | 3.71 (3.08) | 6.4394 |
Supporting model checks
| Model | Rows | Check | Detail |
|---|---|---|---|
| Bullpen availability pen-2025 | 41129 | log loss 0.573 vs 0.658 using only the league rate | relievers per team game: ours 3.07, actual 3.11 |
| Bullpen availability pen-2026 | 40912 | log loss 0.566 vs 0.655 using only the league rate | relievers per team game: ours 3.02, actual 3.06 |
| Starter workload sp-2025 | 4860 | pitch-count avg miss 9.51 vs 10.23 from his last five starts | bias +1.36 pitches |
| Starter workload sp-2026 | 4858 | pitch-count avg miss 10.29 vs 10.85 from his last five starts | bias +1.84 pitches |
| Substitutions ph-2025 | 43740 | log loss 0.328 vs 0.346 using only the league rate | substitute PA per team game: ours 1.43, actual 1.42 |
| Substitutions ph-2026 | 43722 | log loss 0.353 vs 0.381 using only the league rate | substitute PA per team game: ours 1.63, actual 1.71 |