MLB Playoff Odds Monte Carlo Simulator
Pricing
from $5.00 / 1,000 team projections
MLB Playoff Odds Monte Carlo Simulator
MLB baseball betting odds model. Monte Carlo replays every remaining game on the real schedule for fair division, wild card, playoff and top-seed probabilities for all 30 teams, plus value bets vs sportsbook odds. Keyless ESPN data, no account needed.
Pricing
from $5.00 / 1,000 team projections
Rating
0.0
(0)
Developer
ELIO LIBERATORE
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
2
Monthly active users
a day ago
Last modified
Categories
Share
Plays out the rest of the Major League Baseball regular season thousands of times and returns, for every one of the 30 teams, the fair probability of winning its division, taking a wild card, reaching the postseason at all, and finishing with the best record in its league. If you supply bookmaker implied probabilities, it also reports the gap between the model and the market.
Standings and the remaining schedule come from the public ESPN API. No account, no API key, no configuration.
What makes it different
Almost every baseball tool on Apify Store copies numbers out of a website. This one computes something that is not published anywhere: a full distribution of season outcomes built from the actual games each team still has to play.
Three design choices matter.
It simulates the real schedule, not an average one. MLB schedules are unbalanced. A team fighting for a wild card while facing six games against the best team in its division has a harder path than its record suggests. Every remaining fixture is loaded individually, with the correct home and away side, and played out.
It leans on run differential, not just the record. Runs scored and runs allowed predict future wins better than the win-loss column does, because one-run wins and blowout losses carry the same weight in the standings but not in reality. Strength is estimated from Pythagorean expectation blended with the raw record, and you control the mix.
It admits it does not know how good the teams are. A partial season is a noisy sample. The model regresses every team towards .500 by a configurable amount, and then, in each simulated season, redraws each team's true talent from a distribution around that estimate. Without that second step the output is wildly overconfident: the better team wins nearly every simulated race and a 60 percent favourite comes out looking like a 95 percent certainty.
How it works
- Pull the current standings, split by league and division, including runs scored and runs allowed.
- Convert each team's record into a strength rating on a log-odds scale: blend Pythagorean win percentage with actual win percentage, regress the result towards .500 in proportion to how much season is left, then take the log-odds.
- Load every team's remaining fixtures and deduplicate them into one list of games.
- For each simulated season, redraw each team's rating with Gaussian noise, then play every remaining game. A home team's win probability is the logistic of the rating gap plus a home field term.
- At the end of each simulated season, award the three division titles in each league to the best record in each division, then the three wild cards to the best remaining records, and record who got the top seed.
- Average across all simulations to get probabilities and projected win totals.
Sanity check
On a mid-August slate the output lands close to the well-known public playoff-odds models for the clear contenders and clear also-rans, and diverges by ten to twenty points on a handful of teams whose run differential disagrees with their record. That divergence is the point: it is where the model thinks the standings are lying.
Input
Everything is optional. Run it with an empty input and it projects the current season.
| Field | Type | Default | What it does |
|---|---|---|---|
iterations | integer | 10000 | Seasons to simulate. 10000 gives probabilities stable to about half a point. |
season | integer | current | Set a past year to project that season from where it stood. Useful for backtesting. |
regressionGames | integer | 70 | How hard to pull a partial season towards .500. Equivalent to adding this many .500 games. |
pythagoreanWeight | number | 0.6 | Share of the strength estimate that comes from run differential rather than the record. |
homeFieldAdvantage | number | 0.16 | Home edge in log-odds. 0.16 is roughly a 54 percent home win rate between equals. |
strengthUncertainty | number | 0.1 | Spread of the per-season talent redraw. Set to 0 to see how overconfident the model becomes. |
edgeThreshold | number | 0.05 | How far the model must beat the market before a team is flagged as value. |
marketProbabilities | array | [] | Bookmaker implied probabilities to compare against. |
Market entries look like this:
[{ "team": "New York Yankees", "market": "playoff", "impliedProbability": 0.98 },{ "team": "Houston Astros", "market": "division", "impliedProbability": 0.45 }]
Team names are matched loosely, so "yankees" and "New York Yankees" both work. market accepts playoff or division.
Output
One row per team, sorted by playoff probability. Three ready-made views are included in the dataset: a playoff overview, a market edge table, and the records and run differential the model was built from.
| Field | Meaning |
|---|---|
league, division, team, abbreviation | Where the team sits |
gamesPlayed, wins, losses, gamesRemaining | Current record |
runsScored, runsAllowed, runDifferential | Scoring profile |
actualWinPct | Wins divided by games played |
pythagoreanWinPct | Win percentage implied by run differential |
trueTalentWinPct | The blended, regressed estimate the simulation actually uses |
projectedWins, projectedLosses | Mean final record across all simulations |
fairDivisionProbability | Chance of winning the division |
fairWildCardProbability | Chance of taking one of the three wild cards |
fairPlayoffProbability | Chance of reaching the postseason by either route |
fairTopSeedProbability | Chance of the best record among the division winners in its league |
marketPlayoffProbability, marketDivisionProbability | What you supplied, if anything |
playoffEdge, divisionEdge | Model probability minus market probability |
hasValue | True when the larger edge clears your threshold |
simulations | Iterations actually run |
Running it once a day
Playoff races move every night. Schedule the Actor to run each morning and you get a fresh table before the day's games. A full 30-team run with 10000 iterations finishes in about three seconds, so a daily schedule costs very little.
Pricing
Pay per result. One result is one team, so a full-league run produces 30 results. There is no subscription and no minimum.
Limitations and honest caveats
It knows records, not rosters. The model has no idea who is on the injured list, who was traded at the deadline, or who is starting tomorrow. A team that just lost its best two starting pitchers still looks as strong as its run differential says it is. On a fast-moving roster this is the model's biggest blind spot.
Tiebreakers are simplified. Real MLB tiebreakers use head-to-head records and other criteria. Ties in a simulated season are broken at random, which is fine for probabilities across thousands of runs but means no single simulated season should be read as a forecast of the actual tiebreak.
Postseason series are not simulated. The output stops at who qualifies and who gets the top seed. It says nothing about who wins the World Series.
It depends on ESPN. If ESPN changes or delays its feed, results change or the run fails. Standings are also as fresh as ESPN makes them, which is usually within hours of the last game.
Probabilities are not predictions. A 30 percent chance happens three times in ten. The value of this tool is comparing its number with a price, not treating it as a forecast.
On betting. If you use this to inform wagers, treat the output as one noisy opinion among many, and never stake money you cannot afford to lose. No model, including this one, turns a losing bet into a winning one.