Home-grown expected goals (xG)
Our own expected-goals model, built from public NHL play-by-play. It gives every shot its chance of becoming a goal.
What the model does
Every shot gets a chance of becoming a goal. The model looks at three things. The first is where the shot came from: its location, distance and angle to the net. The second is the play that set it up: a rush, a rebound or a settled look in the zone. The third is the game situation: the strength state, the score and whether the net was empty. The model learns all of this from hundreds of thousands of past shots and how they turned out. Every one of them comes from the public NHL play-by-play feed. No private tracking data is used.
How well it scores shots
We are re-checking the current model against the goals actually scored in 2025-26, a season it never saw in training. Until that check is done, this page explains how the model is built and prints no score for it.
One model for every strength state
Our model learns from every strength state at once. It knows whether a shot came on the power play or at 5-on-5. So two shots from the same spot can still be valued differently. Learning from every state gives the model far more shots to learn from. It also keeps it steady on rare states like 5-on-3. The cost is that the power play never gets a model of its own. That matters most on the man advantage, where shots look the most different.
Rebounds, rush chances and everything else: calibrated separately each season
A model can be right about a season as a whole and still misprice one kind of shot. So after the model rates every shot, we check three kinds of shot against what actually happened. They are rebounds, rush chances and everything else. Each kind gets its own adjustment for the season. The goal is that each kind's share of the season's expected goals matches its share of the actual goals. The adjustment is gentlest on the surest chances. A near-certain chance barely moves, so no shot can go past certainty. The adjustment moves each shot's value within its own kind. It does not re-rank shots of the same kind against each other.
For a finished season, the adjustment is fitted once on its regular-season shots. Then it stays fixed. It also leaves the season's total expected goals where they were. It moves value between the three kinds, not into or out of the season. For the season in progress, the adjustment is refitted every week on the games played so far. It starts from no adjustment at all and moves only as the evidence grows. So the early weeks move it only a little. GAR and WAR use the adjusted values, including the finishing part of GAR. So do goalie saves above expected and goalie WAR. The finishing figures on the player card use them too: goals above expected, the finishing factor and career finishing. Some figures do not use them yet. These include the defensive suppression map, the Shot-Control Index and the defenseman shot profile. The shot maps and danger bands use the week-by-week adjustment described next.
Shot maps and danger bands: adjusted week by week from 2025-26
From 2025-26 on, the shot maps and the danger bands use a second adjustment. This one only ever looks backward. Each week, it reads the goals and expected goals from the weeks already played that season. Those set one season-wide factor. They also set a factor for each kind of shot. The factors are then applied to the next week's shots. Nothing from the week itself or any later week is used. So a week's values do not change once it is over. Every factor starts with no adjustment and moves only as goals pile up. So the opening weeks barely move. Seasons before 2025-26 are shown as the model rates them, without this adjustment. In older seasons the model's ratings miss the goals actually scored for some kinds of shot. That stays visible in those seasons' maps and bands.
Counts on this page are read from the published data through 2026-27. A figure from a one-time study says when it was measured.