Skip to content

Guide

How to read OddPuck

What the figures on this site are, where they come from, and how the model was tested against the betting market.

Where the figures come from

OddPuck is a personal research site, not a betting service. It shows what its models expect and how those expectations have scored, and it never recommends a bet.

Model figures are computed overnight from five NHL seasons of play-by-play, 2021-22 to 2025-26, and stored, so a page shows the latest results rather than working anything out while you wait, and no model figure changes during a game. While games are on, only their scores and game stats change — shots on goal, the scoring summaries and each player’s line, fetched every two minutes — and the next morning’s box score of record replaces them. Most are recomputed every night; the two research studies change only when a study is run again, and cap hits when new contracts are entered. The one exception is the draft game, which scores the roster you build in your browser as you build it — a contest score, not a projection.

The per-game rates on the projections board, the club rosters and each player’s percentile profile also count the current season: they span every season since 2021-22, and a game joins them the morning after it is played. So do the shots-on-goal and assists projections the sheet posts before a game: their models come from the five seasons, and each skater’s recent form is read from the last ten games played before that day, this season’s included.

Projections are graded by walk-forward backtest: each forecast is made only from games played before the date it forecasts, then checked against what players went on to do.

Three terms to know first

xG
Expected goals: the model’s chance that each shot attempt scores, added up.
xG-Elo
A team rating built on xG margin, not results. Every club starts from 1500 and is pulled back toward it between seasons; “rated #” is a club’s rank on it.
Win chance
A team’s chance of winning a game, as the model projects it from xG-Elo before puck drop, adjusted when a club is playing the second night of a back-to-back. Win chance is the model’s projection, not a betting recommendation. Its accuracy is modest, and wherever the site shows a win chance, it shows the model’s measured accuracy with it.

Abbreviations in the tables

Table headers mark these with a dotted underline; tapping, clicking or hovering over one shows the same definition.

GP
Games played
Att
Unblocked attempts — open-play shots that reached the net or missed it. Not the box score's shots on goal.
xGA
Expected goals against — what the model gave the attempts this goalie faced
Exp G
Expected goals at league-average finishing: the model’s expected goals on these attempts, scaled so the whole league’s expected total equals the goals it actually scored that season
G vs avg
Goals above what a league-average finisher would score from the same attempts. Across the league these add to zero each season.
vs avg / att
Goals above a league-average finisher per unblocked attempt, whatever the volume
Exp GA
Expected goals against at league-average goaltending: the model’s expected goals on the attempts faced, scaled so the league’s goalies together match the goals they actually allowed that season
Saved vs avg
Goals saved beyond what a league-average goalie would have allowed on the same attempts. Across the league these add to zero each season.
Saved / 100
Goals saved beyond a league-average goalie per 100 unblocked attempts faced
G vs model
Goals minus the model’s expected goals on the same attempts, season to date. Not measured against the league average, so the league’s figures need not add to zero.
vs model / att
Goals minus the model’s expected goals per unblocked attempt, season to date
Saved vs model
The model’s expected goals on the attempts faced minus the goals allowed, season to date. Not measured against a league-average goalie, so the league’s figures need not add to zero.
vs model / 100
Goals saved beyond the model’s expected goals per 100 unblocked attempts faced, season to date
SOG
Shots on goal
PPP
Power-play points — points recorded while this skater's side had the man advantage
P/GP
Points per game played
P/60
Points per sixty minutes of ice time
TOI
Time on ice, minutes and seconds
SV%
Save percentage — total saves over total shots faced
GAA
Goals against average
SA
Shots against
SV
Saves
GA
Goals against
GS
Games started
SO
Shutouts
Pts
Points — goals plus assists
Sample
Real games the recency-weighted rate rests on
Team games
The club's scheduled games in the window. Totals assume the player plays every one: injuries, scratches and trades are not modelled.

How the market benchmark was measured

The shots-on-goal projections — a full distribution of shots on goal for each skater with a posted line — were tested against the betting market on a season the model was never fitted to.

They were measured against the Pinnacle closing line, which they do not beat — shots-on-goal ROI −0.0709 [−0.0932, −0.0467] per unit over 7,171 bets in a 2025-26 backtest of 512 games, and the model's disagreement with the market carries no signal a paired test can separate from betting the other side instead. That is the measured result, reported rather than buried.

A held-out season. The model was fitted on the four seasons before 2025-26, and 2025-26 was used only to score it, so the season it was tested on could not shape it.

Closing lines only. Each bet is priced at the line the book closed with, not an earlier one. The close is the market’s best-informed price, and beating an early line can mean nothing more than being early.

A paired test. The model’s side of each bet is compared with the other side of the same bet, on the same games at the same prices, and it is that difference that is tested, resampled game by game. Two results set side by side cannot say whether one beat the other, because they share every game.

A related study, of how well the closing line itself is priced, needs no model at all: How well priced is the closing line?