JuniorPuck logoJuniorPuck

Understanding Stats

Expected Goals in the CHL: What xG Is and What It Covers

xG measures the quality of a scoring chance, not just whether it went in. How JuniorPuck's model works, what it covers, and the data gap that means WHL shots are not included.

Going deeper6 min readUpdated May 11, 2026

A shot from the crease and a shot from the blue line are both shots. Treating them the same is how shot-volume stats mislead. Expected goals (xG) assigns each shot a probability of going in based on where it was taken. Aggregate xG over a game, and you have a far better read on who deserved to win than goals alone provide.

What xG measures

xG is a number between 0 and 1 assigned to each shot attempt, representing the historical probability of a shot from that location becoming a goal. A shot straight in front from the crease might carry a 0.25 xG, meaning shots from that spot become goals 25 percent of the time. A shot from the point might carry a 0.04 xG. Sum the xG values for all shots in a game, and you get expected goals for and against.

The key insight: teams that consistently generate high-xG shots are outplaying their opponents in the ways that lead to long-term success, even in games where the pucks are not going in.

How JuniorPuck's model works

JuniorPuck's xG model is a logistic regression trained on over 1.25 million shots from OHL and QMJHL play-by-play data. Each shot is described by two features: distance from the goal (in feet) and angle from the goal line (in degrees). The model outputs the probability of a goal given those two inputs.

The fitted equation is approximately: xG = sigmoid(−0.500 − 0.042 × distance − 0.012 × angle). This captures the two biggest drivers of shot quality: shots close to the net score more often than shots from distance, and shots in front of the net score more often than shots from sharp angles on the side.

By the numbers

Using only distance and angle, JuniorPuck's model correctly distinguishes high- from low-danger zones: crease shots average roughly 25% xG, slot shots around 15%, mid-range shots around 8%, and point shots around 4%.

The WHL data gap

The WHL's play-by-play feed does not include shot coordinates. OHL and QMJHL game data include the location (x, y position) of every shot attempt; the WHL provides shot outcomes (shot on goal, blocked, missed) without position data. Without coordinates, xG cannot be calculated.

This means xG per game in the Players, Teams, and Prospects pages is populated for OHL and QMJHL players and teams only. WHL entries show no xG data. It is not a model limitation; it is a data limitation from the league's official feed.

What the model does not capture

Distance and angle are the two biggest predictors of goal probability, but they are not the only ones. JuniorPuck's model does not account for shot type (wrist shot vs. slap shot vs. backhand), whether a screen was in front of the goalie, traffic in the crease, rebound location, or the identity of the goalie. A more complex model might include these inputs, but they require richer play-by-play data than CHL feeds currently provide.

Note

xG on JuniorPuck is a location-based model. It tells you the quality of the shooting opportunity, not the quality of the shooter or the difficulty for the goalie. For goalie evaluation, GSAA (which compares actual goals allowed to expected goals allowed) is the right tool.

Related reading