xJawn NHL expected goals

Today's games

Win probabilities from the Poisson matchup engine (matchup__6a856b2b) — team xG-rate ratings → expected goals → a score grid. Every number below was issued before puck drop and is scored honestly against the result. How it works & why it can lose to a logistic.

Slate

2026-01-15

MatchupFavoriteP(home win) exp. goalsElo
MTL @ BUF BUF 55% 3.22–2.95 60% final 5–3
PHI @ PIT PIT 65% 3.23–2.34 58% final 6–3
SJS @ WSH WSH 62% 3.37–2.64 70% final 2–3
VAN @ CBJ CBJ 71% 3.52–2.21 70% final 4–1
SEA @ BOS BOS 63% 3.01–2.24 65% final 4–2
WPG @ MIN MIN 63% 3.10–2.35 64% final 2–6
CGY @ CHI CGY 47% 2.54–2.71 49% final 1–3
DAL @ UTA UTA 56% 3.02–2.69 51% final 2–1
NYI @ EDM EDM 59% 3.13–2.61 62% final 0–1
TOR @ VGK VGK 65% 3.20–2.33 67% final 6–5

Click a matchup for its page — an upcoming game shows the predicted shot map and breakdown; a finished game opens on what happened, next to the pregame call. Every slate the engine has ever scored is browsable from the date selector. Or build any matchup in the lab — pick the teams, drag the rest sliders, and score it with the same engine.

Season accuracy tracker

Log-loss (lower is better) over 10 completed games this season, every prediction scored as it was issued. This is the public, unfalsifiable record — the append-only live file means we cannot re-grade a past call.

Enginelog-lossaccuracygames
Poisson (shipped) 0.632 70.0% 10
Logistic (challenger) 0.632 70.0% 10
Elo (baseline) 0.678 70.0% 10
Home-rate (floor) 0.680 60.0% 10

The shipped engine is Poisson. Its backtest twin, a plain Logistic regression on the same ratings, edges it on winner log-loss by ~0.003 — but only the generative Poisson produces the expected-goals score grid needed to price totals and puck lines, so it stays the headline. Both beat Elo and the home-rate floor. Full walk-forward methodology on the Model page.