Paper
Methodology

Win probability before a game

Before a game, I give each team a chance of winning it, from how its shots have gone so far (my own xG), its goaltending, home ice and back-to-backs.

Hockey's close to a coin flip, so even a good model calls a lot of games nearly even: when I replayed past seasons, the favourite won about 60% of the time. That test has two catches, below. Its real test is this season's games.

The model

It only reads games played before that day. For each team:

  • how many good chances it makes and gives up at 5v5 (xG for and against per 60 minutes);
  • its power play and penalty kill, and how many power plays it draws and gives away;
  • its goaltending (goals allowed against the xG it faced, all its goalies together) and its finishing;
  • home ice, worth about 6% more expected goals for the home team;
  • back-to-backs: a team on its second night in a row, against a rested team, is rated about 22% worse in the ratio of the two teams' expected goals.

Recent games count more. Each team starts the season from last season's ratings, pulled toward the average, so two games in, a team is still mostly what it was. From all that I get each team's expected goals, then the chance of every score after 60 minutes, then overtime and a shootout.

The nitty-gritty

Each rating is a multiple of the league's rate so far. A game's weight halves after 30 of the team's games. Last season's ratings count as a few games of play (100 minutes at 5v5). A new team starts at the average. Goaltending is goals allowed per xG against with both goalies in, all the team's goalies together, since NHL.com doesn't say who starts. Finishing is goals per xG for.

A team's expected goals in regulation: its 5v5 attack against the other's defence over the even-strength minutes, its power play against the other's kill over its expected power-play minutes, and short-handed chances at the league's rate. Then its finishing, the other team's goaltending, home ice (e0.06) and the back-to-back (the ratio of the two teams' expected goals moved by e0.2, half each way).

Regulation goals are two Poisson counts. Independent goals tie too seldom, so I raise the tie by ×1.34 to the league's rate. A tie goes to 3-on-3 overtime, where the first goal wins: each team's chance is in proportion to its expected goals, and 67% of overtimes end with a goal, as in past seasons. Then a shootout, which I treat as a coin flip.

Backtest

To test it, I replayed every season from 2020-21 to 2026-27 (so far), predicting each game from only the games before it, with settings chosen on earlier seasons only: about 7,700 games. The favourite won 60% of the time, in the same range as public pre-game models, since hockey is close to a coin flip. It beat the plain alternatives: the standings, the same model on goals instead of xG, and a coin flip.

Two catches. The xG model underneath was fit on all those seasons, so the test is a little kind to it. And I added the back-to-back adjustment after seeing these results, so its real test is this season.

Log loss scores the chances themselves (lower is better; a coin flip scores 0.693), and so does the Brier score. Accuracy is how often the favourite won.

PredictionLog lossBrierAccuracy
This model0.66050.234259.6%
The same model on goals, not xG0.66540.236459.5%
Standings: points percentage so far0.67190.239658.0%
Coin flip0.69320.250053.8%
The nitty-gritty

Game by game, it beats the standings by 0.0114 in log loss (95% range 0.0080 to 0.0148) and the same model on goals by 0.0049 (0.0034 to 0.0065): shots say more about the next game than goals do. The back-to-back adjustment alone is worth +0.0025 (+0.0009 to +0.0041) a game.

I also tried a standard logistic regression on the same team ratings, without back-to-backs. Mine comes out +0.0019 (−0.0003 to +0.0040) ahead, but most or all of that is the back-to-back adjustment the logistic one didn't have. Like for like, they're about even. I kept mine because it also gives the chance of overtime and a shootout.

PredictionLog lossBrierAccuracy
Logistic regression on the same ratings0.66230.235059.9%
Home side, at earlier seasons' home win rate0.69040.248653.8%
Home side, at that season's own rate0.68980.248353.8%

The log loss by season:

SeasonGamesModelStandingsHome side
2020-218680.66260.67310.6909
2021-221,3120.64530.65940.6905
2022-231,3120.65680.66420.6923
2023-241,3120.65860.67080.6899
2024-251,3120.66140.67500.6870
2025-261,3120.68390.68880.6927
2026-272850.63730.67440.6858

About the first catch: the xG model learned what a shot is worth, league-wide, not who won, and each season's overall scoring level comes from the goals so far rather than from xG. So the test is fair between teams, but flatters the model by an amount I haven't measured.

Calibration

If it gives a team 70%, teams like that should win about 70% of the time. Mostly they do. It's a little too cautious with big home favourites: home teams it gave 65% or more won 73% of the time, against the 71% it expected.

Most games are close: the median favourite is 58%, and 22% of games have a favourite of 65% or more.

The nitty-gritty

Games grouped by the home team's predicted chance, against how often it won (groups of 30 games or more):

PredictedGamesAverage predictedHome won
20%–25%3323.2%27.3%
25%–30%11328.1%35.4%
30%–35%28032.5%29.6%
35%–40%50737.7%37.5%
40%–45%86442.7%42.7%
45%–50%1,12847.6%48.9%
50%–55%1,35452.5%50.7%
55%–60%1,21957.4%57.1%
60%–65%96662.4%63.6%
65%–70%63167.3%69.1%
70%–75%40672.3%75.4%
75%–80%15577.0%80.7%
80%–85%4681.8%82.6%

32% of games are within 45–55%. The groups at the edges are small, so they bounce around more than the middle ones.

When in the season

xG helps most early in the season, before the standings have sorted themselves out. By about 40 games the standings catch up, and the gap closes.

The nitty-gritty

How much better than a coin flip each prediction is (its log loss below the coin's, as a share), by the two teams' game number:

Team's gameGamesxG modelOn goalsStandings
1-101,1424.6%3.8%1.3%
11-201,0703.6%2.6%1.3%
21-401,9124.8%4.0%2.3%
41-601,8493.4%3.0%3.2%
61+1,7406.8%6.1%6.0%

Its lead over the same model on goals is +0.0061 (+0.0004 to +0.0117), +0.0070 (+0.0016 to +0.0124), +0.0058 (+0.0029 to +0.0087) a game in the first 10, 11-20 and 21-40 games, and +0.0028 (+0.0003 to +0.0053) and +0.0042 (+0.0017 to +0.0067) after. Over the standings it is large through 40 games and gone after (+0.0012 (−0.0049 to +0.0073), +0.0052 (−0.0006 to +0.0111)).

What else I tried

I also tried knowing the starting goalie, strength of schedule, missing players and different amounts of memory. Only back-to-backs helped. I first tried three rest factors together (back-to-backs, road back-to-backs, days off) and they fell just short. Back-to-backs alone did help, but I picked them after seeing that result, so treat it as unproven until this season's games are in.

The nitty-gritty

Each idea was tested the same way, chosen on earlier seasons and scored on later ones, against the model as it was before back-to-backs: the change in log loss a game (positive is better) with its 95% range. I use one only if the whole range is above zero.

TriedChange (95% range)Used
Shorter memory (half-life 10 games)+0.0000 (−0.0012 to +0.0013)No
Longest memory (no decay)+0.0002 (−0.0000 to +0.0004)No
Nothing carried over from last season−0.0013 (−0.0027 to +0.0002)No
Last season's weight fading with games played−0.0001 (−0.0005 to +0.0004)No
Ratings adjusted for the opponents faced+0.0002 (−0.0004 to +0.0009)No
The goalie who started, known in hindsight+0.0009 (−0.0006 to +0.0024)No
The expected starter (recent starts, back-to-backs)+0.0004 (−0.0007 to +0.0015)No
Rest: back-to-backs, on the road, days off+0.0023 (−0.0002 to +0.0048)No
Back-to-backs alone (picked after the line above)+0.0026 (+0.0002 to +0.0050)Yes
Top-six skaters missing, known in hindsight+0.0001 (−0.0011 to +0.0013)No
  • How far back to look barely matters for xG: anything from 20 games to the whole season scores the same. A model on goals needs the long view (a 10-game half-life costs it −0.0023 (−0.0037 to −0.0010)). Starting each season from last season's ratings helps: a fresh start costs the xG model −0.0013 (−0.0027 to +0.0002) and the goals model −0.0050 (−0.0078 to −0.0023).
  • Strength of schedule: rating each team against the opponents it faced changed nothing overall, early in the season included.
  • The goalie: even knowing who started, after the fact, is worth little, since a team's goaltending is already in it and one goalie's saves above expected are noisy. NHL.com doesn't name a probable starter before a game, so I use the team's goalies together.
  • Lineups: in the 20% of games where a team was missing one of its previous game's six most-used skaters, the model did no worse (log loss 0.6595 against 0.6638), and knowing who was missing, in hindsight, added nearly nothing.

Back-to-backs

When only the home team was on the second night of a back-to-back, it won 44% of the time. When only the visitors were, the home team won 61%.

The nitty-gritty

How often the home team won, and its chance from the model before the adjustment (Before) and with it (Now):

Who is on a back-to-backGamesHome wonBeforeNow
The home team, visitors rested39943.9%53.6%45.4%
The visitors, home team rested1,13761.0%53.2%59.9%
Neither5,74653.0%53.7%52.8%
Both43154.3%52.9%52.2%