PickALeague WAR: how we calculate it
WAR — wins above replacement — answers a simple question: how many wins did a player add to his team, compared with a player it could have called up from the AHL for next to nothing? Here is the calculation, step by step, with the 2025-26 numbers.
The data
Everything starts from two files the NHL publishes for every game: the play-by-play — every shot with its location, every goal, every penalty, the game state — and the shift charts — who was on the ice, to the second. For 2025-26: 1,312 games, 111,099 unblocked shot attempts and 452,448 even-strength stints.
The season has 8,086 regular-season goals, shootouts excluded — the official count. The model sets aside 508 empty-net goals, where expected goals mean nothing, and works on 7,578 goals. That set is used everywhere after.
1Expected goals (xG)
Not all shots are equal. The expected-goals model gives every unblocked attempt its probability of becoming a goal, using a logistic regression on: distance and angle to the net; shot type; rebounds (a same-team attempt in the previous 3 seconds); rush chances (an event in the neutral or defensive zone in the previous 4 seconds); and power play or short-handed play.
xG = 1 / (1 + e^-(b0 + b1·distance + b2·angle + … ))
Across the 111,099 eligible unblocked attempts, xG sums to 7,598 against 7,578 actual goals on those same attempts, overall and on rebounds, rush chances and the power play, with an ROC area under the curve of 0.742. These figures are in-sample: measured on the shots the model was trained on.
The real test is out of sample: train on half the games, predict the other half, both ways. The model then expects 7,592 goals against 7,578, with an AUC of 0.741 — almost nothing is lost, the model is not memorizing. The published model is trained on the full season.
2Even strength: offense and defense (RAPM)
Every game is split into stints during which the same players are on the ice. Each stint yields two observations, one per team on offense:
xG for / 60 = intercept
+ Σ offense(players of the attacking team)
+ Σ defense(players of the defending team)
+ home ice
+ game state (4v4, 3v3)Solving this for every player at once, weighted by stint length, is RAPM (regularized adjusted plus-minus). A ridge penalty λ pulls coefficients toward zero to tame players who are always together; λ is picked by five-fold cross-validation on games: λ = 48,000. The minimum is flat: any λ between 24,000 and 64,000 gives the same error within 0.01%, so the exact value matters little. Even strength is mostly 5v5, but also 4v4 and overtime 3v3, a far more open game. One variable per game state absorbs that pace, so a player used in overtime does not inherit 3v3 chances (relative to 5v5: 4v4 -0.05, 3v3 +1.49 xG per 60). Then to goals:
EV offense = offense coefficient × even-strength hours EV defense = − defense coefficient × even-strength hours
Season intercept: 2.39 xG per 60; home-ice effect 0.12.
3Power play and penalty kill
Same method on stints where one team has more skaters, with game-state variables separating 5v4 (the reference) from 5v3 and 4v3. λ = 16,000, intercept 6.77 xG per 60 at 5v4, +8.69 at 5v3, +2.24 at 4v3.
4Shooting
Shooting = goals scored − expected goals of his shots
5Penalties
A power-play minute yields 0.1273 goals for the team with the advantage, against 0.0427 for a team at even strength.
Value of a minute = 0.1273 − 0.0427 = 0.0846 goals Penalties = (minutes drawn − minutes taken) × 0.0846
An empirical value and a simplification: a power play ends at the first goal, and not all penalties are equal. Only minors and bench minors count; majors (often offsetting) and misconducts (no power play) are left out. The calculation keeps every decimal.
6Goalies
Goals saved above expected (GSAx) = expected goals against − goals allowed
7Replacement level
Inspired by hockeystats.com's approach, in simpler form — they set separate thresholds at even strength, on the power play and on the penalty kill; we use one threshold on total ice time: replacement players are forwards beyond 13th on their team, defensemen beyond 7th and goalies beyond 2nd in games played. Their output per hour (per shot faced for goalies) sets the replacement rate: forwards -0.188, defense -0.130 goals per hour; goalies -0.002 goals per shot.
Goals above replacement = goals above average − replacement rate × hours played
8From goals to wins
The Pythagorean formula links goals and wins: W% = GFx ÷ (GFx + GAx). Christopher Long estimated x = 2.022 on his own goal definition; since WAR drops empty-net goals, we re-estimate x on that same universe: over 524 team seasons from 2009-10 to 2025-26, the exponent that best predicts win percentage is x = 2.182 (mean error 3.55 percentage points, against 3.61 with 2.022). Around an average team scoring g goals per game, one more goal is worth x ÷ (4g) wins:
g = 7,578 goals ÷ 2,624 team games = 2.888 Goals per win = 4 × 2.888 ÷ 2.182 = 5.29 WAR = goals above replacement ÷ 5.29
Why 2.888 goals per game rather than the official 3.082? Because g counts the same goals as the rest of the model: no empty-net goals, which depend on score and clock more than on play. hockeystats.com likewise excludes empty-net and shootout goals.
A complete example
| Even-strength offense | +11.24 |
| Even-strength defense | -2.31 |
| Power play | +2.92 |
| Penalty kill | 0.00 |
| Shooting | +10.88 |
| Penalties | +1.35 |
| Goals above average | 24.08 |
| Average → replacement gap | +5.33 |
| Goals above replacement (GAR) | 29.41 |
| WAR = 29.41 ÷ 5.29 | 5.56 |
Each line is rounded to the hundredth and the totals are computed from those rounded values, so the arithmetic can be checked. The leaderboard keeps every decimal, hence a possible one-hundredth difference.
What WAR doesn't say
- It is an estimate with error bars: over one season, half a WAR between two players is noise.
- Ridge regression pulls coefficients toward zero: the best players are more likely under- than over-rated.
- Faceoffs, passing and play away from the puck only count through their effect on expected goals.
- Our numbers are not hockeystats.com's or Evolving-Hockey's: same idea, simpler model — no multi-season prior for RAPM, fewer xG features.
Sources
Method inspired by hockeystats.com and Evolving-Hockey. Data: NHL. Calculation: PickALeague, updated October 4, 2026.
