How IceChaser calculates NHL playoff probabilities
Version 2.0 · Calibrated over 3 seasons (2022–25) · Brier Score: 0.061
IceChaser estimates NHL playoff probabilities using Elo-rated Monte Carlo simulation. Every remaining regular-season game is simulated 100,000 times using win probabilities derived from each team's Elo rating. The fraction of simulations in which a team qualifies for the playoffs is their playoff probability.
All data comes from the NHL public API (api-web.nhle.com) in real time:
Each team carries an Elo rating tracking their strength over the season. Ratings start at 1500 and update after every game.
| Parameter | Value | Meaning |
|---|---|---|
| K-factor | 10 | How much a single game moves ratings. Low = stable, high = reactive. |
| Home bonus | 100 | Elo points added to home team before computing win probability. |
| OT discount | 0.50 | OT/SO wins move ratings at 50% of a regulation win. |
| Initial rating | 1500 | All teams start here at season open. |
expected = 1 / (1 + 10^((opponent_elo - team_elo - home_bonus) / 400)) k = K_FACTOR × (OT_DISCOUNT if overtime else 1.0) new_elo = old_elo + k × (actual_result - expected)
P(home wins) = 1 / (1 + 10^((away_elo - home_elo - 100) / 400)) # Clipped to [0.25, 0.75] to prevent extreme probabilities.
Each game has a 24% probability of going to overtime (NHL historical average). If OT occurs, the winner gets 2 points and the loser gets 1 point. The OT winner is determined by coin flip — no significant home advantage in OT empirically.
| Outcome | Home pts | Away pts |
|---|---|---|
| Home wins regulation | 2 | 0 |
| Away wins regulation | 0 | 2 |
| Home wins OT/SO | 2 | 1 |
| Away wins OT/SO | 1 | 2 |
After simulating all remaining games, playoff qualification follows the official NHL format:
One 100,000-simulation pass produces everything:
There is no separate base sim, no Rust binary, no redundant computation. One pass, all outputs.
| Component | Time |
|---|---|
| NHL API fetch | ~2s |
| Elo rating update | ~1s |
| 100k vectorized sim + scenarios + What If | ~30–45s |
| Tomorrow's scenarios | ~15s |
| Total end-to-end | < 60 seconds |
Tested against 3 historical seasons at 5 checkpoints each (30, 20, 15, 10, 5 games remaining). Brier Score: 0.061 (0.0 = perfect, 0.25 = random coin flip).
| Checkpoint | Brier (all) | Brier (bubble 10–90%) |
|---|---|---|
| ~5 games left | 0.035 | 0.145 |
| ~10 games left | 0.037 | 0.139 |
| ~15 games left | 0.053 | 0.171 |
| ~20 games left | 0.078 | 0.210 |
| ~30 games left | 0.113 | 0.230 |
| Model | Basis | Calibrated | Brier |
|---|---|---|---|
| IceChaser v2 | Elo (K=10, HB=100) | ✅ 3 seasons | 0.061 |
| IceChaser v1 | Points pace ratio | ❌ | 0.063 |
| Random baseline | 50/50 | N/A | 0.250 |