The Game Blog

Matching the Monkey

There are several public models for measuring NHL player value, each built differently. We ran a tournament to compare them: each metric predicted player performance for the following season, and each metric also judged everyone's predictions, our own included.

Sean Lee · Pacific Coast Labs · September 2026

In brief

The tournament

Anyone who uses public value metrics eventually has to choose one, but the models differ enough in how they are built that the choice is hard to make by inspection. Prediction offers a test: whatever a metric aims to capture, more of it should persist into next season than noise does. A tournament of predictions turns the choice into an empirical question, and we entered our own model alongside the rest.

There are five model contestants: Evolving-Hockey's WAR, HockeyStats' WAR, MoneyPuck's game score, Hockey Alchemy's WAR, and our pWAR. Hockey Alchemy is the most recent addition, having published a validation of their own in August; they were added in September under the same protocol as everyone else.

The tournament protocol: per-82 rates, 30-game minimums, walk-forward throughout (no prediction touches information from after the season it was made in), and strict common samples of 528 to 532 skaters per transition, so that every number describes exactly the same players. Each metric predicts next season, and each metric also serves as a judge: how well did each entrant predict the next-season values?

The baseline

The tournament's baseline is Tom Tango's Marcel projection, named after the monkey from Friends because it is designed, in its author's words, to use "as little intelligence as possible": weight the player's last three seasons 5/4/3, regress toward the positional mean, adjust for age.

The baseline's role can be easy to misread. A raw season of WAR is a measurement, not a forecast, and none of these metrics is published as one. But raw numbers are used as forecasts constantly, in trade arguments, contract debates, and preseason previews. So, rather than grade raw measurements on a job they were not built for, the tournament gives every metric the same minimal projection: a Marcel built from that metric's own history. Each entrant is projected in the identical way, and so the comparison becomes metric against metric on equal footing.

Why Marcel, and not something stronger? The baseline's job is to be neutral: standard published weights, no modeling opinions of its own, identical treatment for every entrant. Anything stronger would carry modeling choices of its own, and whoever made those choices would, in effect, be tuning the test. Marcel is the one projection nobody in the field built, which is what makes it fair to use on everybody.

Results

Three season transitions, 2022-23 through 2025-26. Mean Spearman rank correlation with next season. Each row is a predictor, and each column is a judge.

predictoroursEHHSMPHArow mean
ours+0.795+0.435+0.533+0.770+0.719+0.650
ours-marcel+0.828+0.445+0.542+0.796+0.754+0.673
EH+0.467+0.410+0.477+0.511+0.478+0.469
EH-marcel+0.561+0.478+0.536+0.602+0.561+0.548
HS+0.546+0.427+0.545+0.583+0.553+0.531
HS-marcel+0.627+0.480+0.590+0.661+0.627+0.597
MP+0.754+0.464+0.565+0.810+0.723+0.663
MP-marcel+0.779+0.461+0.564+0.820+0.742+0.673
HA+0.709+0.430+0.542+0.740+0.727+0.630
HA-marcel+0.758+0.444+0.553+0.771+0.768+0.659

ours = pWAR (this lab). EH = Evolving-Hockey WAR. HS = HockeyStats WAR. MP = MoneyPuck game score. HA = Hockey Alchemy WAR. Each -marcel row is the same Marcel recipe applied to that metric's own history.

Three observations, all computable from the table.

The monkey result. On its own scoreboard, every raw metric is out-predicted by the Marcel built from its own history: Evolving-Hockey +0.410 against +0.478, HockeyStats +0.545 against +0.590, MoneyPuck +0.810 against +0.820, Hockey Alchemy +0.727 against +0.768, and ours +0.795 against +0.828. A metric built to describe a season keeps variance that a forecast would smooth away. The tournament just puts a number on that tradeoff, for every metric under one protocol, ours included.

The top of the table. Our projection and MoneyPuck's Marcel share the best row mean at +0.673, with Hockey Alchemy's Marcel close behind at +0.659. On the other entrants' scoreboards alone, the same three sit within 0.005 of one another. The tournament code prints each transition separately for anyone who wants a finer grain.

Self-persistence. The single highest cell in the grid is our own values predicting themselves, at +0.828. Self-persistence alone does not prove much: a metric can agree with its own future by measuring something stable, whether or not that something is value. What matters is the pair. On the other entrants' scoreboards our projection sits with the best in the tournament, and on our own, no rival comes close. The margin between what our history predicts and what the best rival can reconstruct is +0.049, the largest in the field; the rest range from +0.025 down to -0.002. A model that predicts the field while holding signal the field cannot reconstruct is measuring something of its own.

Our entry

pWAR is a state-value model. It divides play into 150 game states from the puck-carrier's point of view, and play-by-play history sets each state's value: how strongly the next goal favors the side with the puck. Every event moves the game between states, and the change in value is credited to the players who caused it. A season of pWAR is the sum of a player's credited events, with shooting priced by expected goals, and the projection on top is the same Marcel recipe used for every entrant above.

The property we consider the most important is attribution. Every pWAR rating decomposes into named events with stated values. Among the entrants at the top of the table, ours is the only one that can answer why a player rates where he does, event by event.

A full account of the model will follow in a separate post.

The leak

pWAR was originally built as a general-purpose player valuation for our simulation engine, and for that purpose it was fit on all five seasons at once. The first time the tournament ran, one pooled component came along with the predictor. The results looked slightly too strong, which flagged an immediate check, and the classic look-ahead leak was there. After discovery, the predictor was rebuilt fully walk-forward.

We include the episode because the lesson generalizes. From the outside, a tuned retrospective model and an honest one produce the same kind of table. We are confident the numbers above are clean, and the public code lets anyone rerun the table. But confidence is not a protocol. The only evaluation nobody can tune, ours included, is one graded on games that have not happened yet.

The freeze

Our 2026-27 projections freeze in a public, timestamped commit before opening night on Friday, September 25, with the scoring rules pre-registered. In April 2027 the same code reruns the table on the season that actually happened, and the results will be published here whatever they say.

The code and our per-season values publish alongside the freeze. Entrants are bring-your-own-data: one command reproduces the table above, and any metric can join before the season starts. The full protocol ships with the code. We encourage you to rerun it, rather than take our word for it.

This tournament exists because the field publishes: every entrant above made their work public enough to be tested, and that is the only reason a shared table is possible.