The Two Products
WAR vs Talent
Current season
HGB WAR
Current-season accounting. How much value did this player produce this year versus a replacement-level player? Single-season, no priors, and it counts every minute a player skated. Comparable to baseball WAR in concept — it tells you what happened, not how good the player is.
Opportunity-normalized
HGB Talent
How good the player is, with ice-time allocation normalized. Each situation is weighted by a fixed position-level share of ice time rather than the minutes a coach handed out, so power-play usage doesn't inflate the number. Multi-season history anchors it. A player can have strong Talent but a mediocre WAR (small sample this year), or the reverse.
Scored Components
What Goes Into WAR
EV Offense
Isolated on-ice expected goal share contribution at 5v5, via RAPM. Measures how much a player moves the needle offensively when they're on the ice, separated from their teammates' contributions.
EV Defense
Isolated on-ice expected goals against impact at 5v5, via RAPM. How much does this player's presence suppress opponent offense, independent of who they play with?
Individual Offense
Personal goals and primary assists production bonus, z-scored versus positional peers. Rewards players who drive personal counting stats above and beyond what RAPM already captures in shot volume.
PP Offense
Power play RAPM times PP TOI. How much offensive value a player generates on the man advantage, scaled by how much they're actually used there.
PK Defense
Penalty kill RAPM times PK TOI. Defensive impact on the kill, weighted by actual deployment.
Penalties
Drawn minus taken, with a flat value per opportunity of approximately 0.20 goals. Players who consistently draw power plays are adding value that doesn't show up in shot metrics.
Opp. Quality (QoC)
Average quality of opponents faced. Context only — not a WAR component. High QoC means a player faces tougher competition; low QoC means sheltered deployment.
Context · Not scored
Mate Quality (QoT)
Average quality of linemates. QoT and QoC appear on player cards to help interpret the scored components — they explain results, they don't add or subtract from the WAR score.
Context · Not scored
The Shot Model
Expected Goals
Expected goals (xG) is the engine under almost everything here. Every unblocked shot — on net or missed — gets a probability of becoming a goal, based on where it was taken, the angle, the shot type, whether it followed a rebound and how fast, whether it came off the rush, and what happened the moment before. Add those probabilities up and you get chance quality that doesn't care whether the puck actually went in.
HGB runs four separate xG models, not one: even strength, power play, penalty kill, and empty net. A power-play shot and a 5v5 shot are different problems, with different shot locations and different goalie behavior. Push them through a single model and it over-rates power-play chances and flattens the rest. Splitting them tightens the calibration: predicted goals now land within a few percent of actual goals in every situation, and within about a percent on special teams and empty net.
The models are gradient-boosted, trained on every unblocked shot since 2022 — the seasons after the NHL changed its shot tracking, so the location data is consistent. This is the same shot basis the public models use: unblocked attempts, missed shots included. xG feeds the even-strength and power-play numbers below and the goalie save model. Better xG, better everything downstream.
The Core Model
How RAPM Works
RAPM (Regularized Adjusted Plus-Minus) isolates individual player impact by controlling for teammates, opponents, zone starts, score state, and PP expiry. Every shift creates a set of equations where each player on the ice gets credit or blame for what happened, and ridge regression finds the player-level estimates that best explain the full dataset — while shrinking noisy estimates toward zero.
A player with a small sample gets pulled toward league average. A player with thousands of 5v5 minutes gets a more confident estimate. The model uses a two-perspective design: each shift generates one home-offensive row and one away-offensive row, keeping offensive and defensive signals separated so that a defenseman who suppresses shots doesn't accidentally look like an offensive contributor.
How Talent Is Built
Opportunity Normalization
WAR measures what a player produced; Talent estimates how good he is. One major difference is deployment. WAR credits every minute a player skated, so heavy power-play time gives a player more opportunity to accumulate WAR. Talent normalizes that: each situation (even strength, power play, penalty kill) is weighted by a fixed position-level share of ice time rather than the player's own minutes. Extra power-play minutes don't mechanically increase Talent; they provide more evidence about the player's per-60 performance.
Talent leans on history. Each component blends the current season with up to three prior seasons, weighted toward the recent ones (roughly 30 / 16 / 8 across the last three years) and adjusted for age. How far the current season pulls the estimate depends on sample size — the thresholds below mark where the current season and the prior carry equal weight.
Losing a role doesn't erase ability. A player dropped from the power play keeps his established power-play prior instead of collapsing to zero; the missing minutes lower his confidence rather than his score. Players with thin history (under 1,000 even-strength minutes across the last three seasons, or a player with no usable prior history) are flagged limited sample on the card.
Where current season and prior weigh equally
| Situation | 50/50 point |
|---|---|
| Even strength | ~300 minutes |
| Power play | ~200 minutes |
| Penalty kill | ~150 minutes |
Below the threshold, the prior carries more weight; above it, the current season does. Power play and penalty kill reach that balance on fewer minutes.
Reading the Card
Card Guide
Above average performance
Near average performance
Below average performance
Context metrics (QoC, QoT) — not good or bad, just deployment context