The math and logic behind MLB playoff probability simulations
BaseChaser runs 100,000 independent Monte Carlo simulations every time new data is fetched. Each simulation plays out the remainder of the season game-by-game, applying win probabilities derived from team strength ratings. At the end of each simulated season, the playoff field is determined and recorded.
After all 100,000 simulations complete, the playoff probability for any team is simply the fraction of simulations in which that team earned a playoff berth โ e.g., a team makes the playoffs in 67,400 of 100,000 sims โ 67.4% playoff odds.
Every update runs fresh simulations from scratch. No historical trails or momentum are baked in โ each simulation is an independent roll of the dice given current standings and remaining schedule.
Each team's win probability for any given game is derived from a blended Elo rating that combines two sources of signal:
Computed from actual MLB game results this season. After each completed game, the winning team's Elo goes up and the losing team goes down. The K-factor (volatility) is set to 2, meaning individual games cause modest Elo swings โ a team's rating reflects sustained performance, not hot streaks.
FanGraphs bWAR is converted into an Elo-equivalent using a linear mapping:
โ ๏ธ Early season: Game Elo is compressed near 1500 for all teams (minimal signal from 20-30 games). WAR prior carries the most weight early and fades as the season progresses.
As the season progresses, the model shifts weight from last year's WAR toward this year's performance:
blended = (1 โ games_played/162) ร 2025_prior + (games_played/162) ร 2026_YTD
At 22 games (13.6% through): ~86% 2025 WAR / ~14% 2026 YTD. By August, game results dominate.
Raw YTD WAR is used as-is โ it is NOT projected to a full-season pace, which avoids impossible projections for teams with extreme early-season numbers.
For each simulated game, home win probability is:
P(home wins) = 1 / (1 + 10^(โelo_diff / 400))
where elo_diff = home_elo โ away_elo + 15 (home field advantage = +15 Elo points). Win probability is clipped to a 30%โ70% range to prevent degenerate scenarios.
MLB playoff rules are fully modeled:
BaseChaser computes several advanced scenario types from the same 100k pool:
For each team, the most favorable and unfavorable outcomes for today's games are forced, then the remaining schedule is simulated normally. The range between best and worst case reflects how much tonight's games can shift a team's odds.
Each matchup is analyzed conditionally: what happens to every team's odds if Team A wins at home vs. if Team A loses on the road? These deltas are shown on the game cards and drive the "stakes" narrative.
The simulation results are grouped by final record. For each team, every unique win-loss outcome that occurred 10+ times across 100k sims is shown with its associated playoff probability and how often it occurred. Rows are capped at 20 and scrollable.
Beyond just making/missing playoffs, BaseChaser computes the probability of landing in each seed 1โ12 per league, including the draft lottery implications for non-playoff teams.
| Data | Source |
|---|---|
| Standings & Scores | MLB Stats API (statsapi.mlb.com) |
| Remaining Schedule | MLB Stats API date-range endpoint |
| Elo Ratings | Computed from completed game results |
| WAR Prior | pybaseball library (FanGraphs bWAR) |
| Team Logos | Wikipedia via upload.wikimedia.org |
No model is perfect. BaseChaser's strengths and weaknesses:
Q: Why does my team show 0% when they have a good record?
A: Early season, game Elo is too compressed to separate teams well. If your team's WAR prior says they're better than their record, trust the model to catch up as real games accumulate.
Q: Why is a team at 95% in April?
A: After the WAR prior fix, teams can only hit 90%+ if both their record AND their WAR prior are exceptional. In the early season sample, no team has reached that threshold. If you're seeing 90%+, it's because their actual game record is dominant (15+ wins at a .700+ pace).
Q: How often does BaseChaser update?
A: Every 20 minutes via automated cron. Each update runs fresh 100k simulations.
Q: Can I see yesterday's odds?
A: Yes โ the Odds Movement chart shows daily locked snapshots going back to April 4.