Hockey Analytics Methodology

How Hockey Alchemy builds its hockey analytics models. Technical documentation of GAR, RAPM, xG, Game Score, and goalie evaluation methodology.

Contents

  1. Expected Goals (xG)
  2. Regularized Adjusted Plus-Minus (RAPM)
  3. Goals Above Replacement (GAR)
  4. Wins Above Replacement (WAR)
  5. Game Score
  6. Goalie Evaluation
  7. Contract & Market Value
  8. Data Sources
  9. Validation

1. Expected Goals (xG)

TL;DR: xG estimates the probability (0-1) that each shot becomes a goal based on distance, angle, shot type, and game context. Hockey Alchemy uses four situation-specific XGBoost models (even strength, power play, shorthanded, plus an empty-net formula) trained on 16 seasons and 1.6M shots — 0.199 even-strength log loss (0.200 across all situations) with near-perfect calibration.

Expected goals estimates the probability that each unblocked shot attempt results in a goal. Rather than treating all shots equally, xG accounts for the context of each shot to measure true scoring chance quality.

Features

The unified model reads 53 features per shot (the situation-specific models use 44-47 of them), falling into six groups:

Deliberately excluded: score state. We tested leading and trailing features and found they inflate xG on desperation shots by leaking the scoreboard into the shot's grade — an xG model should score the chance, not peek at the score.

Calculation

Rather than a hand-tuned formula, each shot's probability is produced by an XGBoost gradient-boosting classifier that learns nonlinear interactions across the feature set, so rebounds, rush chances and danger zones are signals the model weighs from data rather than fixed multipliers. Empty-net shots use a dedicated formula rather than the ML model, and blocked shots are assigned 0.0 xG.

Usage

Cumulative xG (xGF for a team, xGA against) measures total expected scoring. Comparing actual goals to xG reveals finishing luck (positive) or goaltending impact (negative). xG is also the foundation for RAPM target metrics and feeds into the GAR framework.

How our xG model works Why the model splits the ice into zones

2. Regularized Adjusted Plus-Minus (RAPM)

TL;DR: RAPM uses ridge regression on every 5v5 stint to isolate each player's individual impact on goal rates, controlling for teammates, opponents, score state, and zone starts. Multi-season daisy-chain priors (decay 0.6-0.7) stabilise estimates.

Traditional plus-minus conflates a player's impact with the quality of their teammates and opponents. RAPM separates them by regressing on-ice rates against every player on the ice, so each player's coefficient is what remains once the rest of the shift is accounted for.

Controls include teammates, opponents, score state, zone starts, back-to-back games and venue. Ridge regularisation shrinks noisy low-minute estimates toward the mean rather than letting them dominate.

Hockey Alchemy uses daisy-chain RAPM: each season's coefficients are informed by the previous season's as Bayesian priors, decayed 0.6 for offence and 0.7 for defence. The chain spans all 19 regular seasons of available NHL data (2007-08 to 2025-26), producing stable year-over-year estimates.

Full RAPM definition

3. Goals Above Replacement (GAR)

TL;DR: GAR = EVO + EVD + PPO + SHD + Finishing + Penalties. It measures total player value in goals above a replacement-level player. Read it as a percentile within its season: the top decile of qualified regulars is the usual bar for “elite”, and a quarter to a third finish below zero.

GAR is our comprehensive single-number player value metric. It measures a player's total contribution in goals relative to a replacement-level player — a freely available minor-leaguer or waiver-wire pickup.

Components

Replacement level

Replacement level represents the performance of a freely available player, estimated from the bottom tier of NHL regulars and AHL call-ups. Each component carries its own baseline, and the league total is calibrated so that the sum across all players matches the leaguewide margin above replacement.

Full GAR definition What's actually inside a GAR number GAR leaderboard

4. Wins Above Replacement (WAR)

TL;DR: WAR converts GAR into wins by dividing by the marginal goals per marginal win in the NHL — roughly 5.6, varying year to year with the scoring environment.

WAR translates GAR into wins, making player value directly comparable to team standings. The conversion factor is derived from the relationship between team goal differential and standings points across NHL seasons, and shifts slightly year to year with the scoring environment.

Because WAR is GAR divided by a single constant, it reads on the same percentile scale: the median qualified regular is around half a win above replacement, and the top decile is where “elite” begins.

Full WAR definition How good is our WAR model?

5. Game Score

TL;DR: Game Score combines box-score contributions (goals, primary and secondary assists, shots, blocks) with on-ice performance (xGF, GF, xGA, GA) using position-specific weights. Typical single-game range is -2 to +5.

Game Score provides a single-number summary of a player's performance in a single game, combining individual box-score contributions with on-ice impact. It is based on Dom Luszczyszyn's formula.

Forwards and defencemen use different weights for the on-ice component to account for positional differences. Typical single-game range is -2 to +5, with exceptional performances above that.

Full Game Score definition

6. Goalie Evaluation

TL;DR: Goalie GAR is based on shot-level GSAx (Goals Saved Above Expected). Each shot's xG is compared to the actual result; cumulative GSAx is adjusted by a replacement-level offset to produce GAR on the same scale as skaters.

Goalie performance is evaluated using shot-level expected Goals Saved Above Average (xGSAA), which accounts for the quality of shots faced rather than treating all saves equally.

For each shot a goalie faces, the xG model computes the probability of that shot becoming a goal. The actual result — save or goal against — is compared to that expectation, and the difference accumulates across the season.

Goalie GAR converts xGSAA to goals above replacement by applying a replacement-level offset (the gap between average and replacement goaltending) and a scaling weight, placing goalie value on the same scale as skater GAR.

Full GSAx definition

7. Contract & Market Value

TL;DR: We price a player by projecting their future GAR, converting it to a fair-market salary at the current market rate for a win, and comparing that to their actual cap hit. Surplus, a letter grade, and a positive-value probability follow.

A contract is valuable when a player produces more than they are paid. We put a number on that by pricing each player's on-ice value in salary-cap dollars and comparing it to what the team actually pays.

Projected value (the input)

We start from a projection of each player's future seasons, using a dedicated skater projection model and a separate goalie model. Future production, not just last season's number, is what a contract pays for.

The market rate for a win

We calibrate how much a win costs on the open market from recent unrestricted free-agent signings (age 27+), regressing each deal's cap-hit share against the player's track record of GAR at signing. The rate is expressed as a share of the salary cap and refreshed to the most recent signing seasons, so it tracks the current market rather than a historical average. Goalies are calibrated separately, since they carry a starter-floor salary that skater rates do not.

Surplus, grade, and probability

Surplus is projected fair AAV minus actual cap hit, summed over the remaining term. A letter grade and a positive-value probability are derived from that comparison.

Full surplus-value definition

8. Data Sources

TL;DR: All data comes from publicly available sources.

9. Validation

TL;DR: On the most recent full season (2024-25), team-aggregated GAR explains actual standings points with a descriptive R² of 0.876. Year-over-year, our RAPM Total GAR repeats at Pearson r = 0.770, ahead of the public GAR models we benchmark against (Evolving Hockey 0.474, HockeyStats 0.624).

We validate on three dimensions: explanatory validity (how well team-aggregated GAR explains standings within the same season), repeatability (how stable a player's value is year-over-year), and cross-model agreement (how our rankings compare to other public models).

Standings R² (explanatory validity)

The most rigorous quality metric for a player-value model is whether the sum of individual GAR on each team's roster explains actual standings points. On 2024-25, team-aggregated GAR fits standings at a descriptive R² of 0.876 on the RAPM track, against a measured ceiling (goal differential vs points) of 0.879 for a roster-sum model.

“Standings R²” is not one number: pooled and mean-of-season fits differ, as do the RAPM and counting tracks. We state the protocol next to the figure because the spread between defensible definitions is wider than the gap between us and any competitor.

Year-over-year repeatability

A skill-driven model should produce stable ratings year-over-year; a model dominated by luck would shuffle players between seasons. Measured as the Pearson correlation of a player's RAPM Total GAR from one season to the next, on the identical set of players present in every model:

Where we lose

Summed to a team, our value forecasts next season's standings worse than simply reusing last season's table. We publish that result rather than omitting it.

The full four-test validation Which components repeat, and which don't

Frequently Asked Questions

How does Hockey Alchemy calculate Goals Above Replacement (GAR)?

GAR measures a player's total contribution in goals relative to a replacement-level player. It sums components across game situations: even-strength offence (EVO), even-strength defence (EVD via RAPM), power-play offence (PPO), shorthanded defence (SHD), finishing, penalties taken and penalties drawn. Each component compares a player's on-ice rates to a replacement-level baseline, scaled by ice time. Daisy-chain RAPM coefficients — chained across all 19 regular seasons of available data (2007-08 to 2025-26) with Bayesian priors decayed by 0.6 for offence and 0.7 for defence — provide the defensive and adjusted offensive components.

What is RAPM and how is it used in hockey analytics?

Regularized Adjusted Plus-Minus (RAPM) uses ridge regression to isolate each player's individual impact on team goal or expected-goal rates. It controls for teammates, opponents, score state, zone starts, back-to-back games and venue. Hockey Alchemy uses daisy-chain RAPM, where each season's coefficients are informed by the previous season's as Bayesian priors with decay (0.6 for offence, 0.7 for defence). The chain spans all 19 regular seasons of available NHL data, producing stable year-over-year estimates.

How does the Hockey Alchemy expected goals (xG) model work?

Hockey Alchemy uses four situation-specific XGBoost models (even strength, power play, shorthanded) plus a dedicated empty-net formula, trained on 16 seasons and 1.6M unblocked shots. Each shot is scored from 53 features including distance, angle, shot type, rebound and rush context, game strength state, power-play timing and the prior-event sequence. Rebounds and rush chances are features the model learns from, not fixed multipliers.

How is Game Score calculated in hockey?

Game Score combines individual box-score contributions (goals, primary assists, secondary assists, shots, blocks) with on-ice performance (xGF, GF, xGA, GA) using position-specific weights. It is based on Dom Luszczyszyn's formula and provides a single-number summary of a player's impact in a given game. Typical range is -2 to +5.

How does Hockey Alchemy calculate goalie GAR?

Goalie GAR is based on shot-level expected Goals Saved Above Average (xGSAA). For each shot faced, the model computes xG and compares expected against actual goals allowed. The cumulative xGSAA is adjusted by a replacement-level offset and a scaling weight to convert to GAR units, reflecting total goalie value above a replacement-level goaltender.

What is Wins Above Replacement (WAR) in hockey?

WAR converts GAR into wins by dividing by the number of marginal goals per marginal win in the NHL — roughly 5.6, varying year to year with the scoring environment. This allows comparing player value in the same units as team standings. An elite skater typically contributes 2.5-4 WAR per season.