Thomas Mihaljevic
Project
← Research and projects

NHL Trade Market Efficiency Model

A net-present-value framework that prices players, draft picks, and prospects in a single currency, so that any historical trade can be re-priced using only what was known on the day it was made.

Type
Master's research project
Status
In progress
Tools
Stata, Python
The question

Do NHL front offices trade rationally?

The difficulty in answering that is that a trade exchanges assets of different kinds. A team might give up a forward under contract and receive a first-round pick and an unsigned prospect in return. Whether that was a good exchange is usually argued rather than measured, because a player, a pick, and a prospect have no common unit.

This project builds one. Every asset is expressed as projected surplus in dollars: the value of the production it is expected to deliver, minus what it costs against the salary cap, discounted over the relevant horizon. Once every asset carries a price in the same currency, each historical trade can be re-priced on the information available on the trade date and the model's verdict compared against what actually happened afterward. Persistent gaps between price paid and value received, concentrated in particular types of trade or particular asset classes, are evidence of systematic mispricing.

The general problem is not specific to hockey. It is how to price heterogeneous assets in a thin market where the same participants transact repeatedly and the terms of every deal are observable.

The model

The player valuation model takes any NHL contract at any valuation date and returns a present value in surplus dollars. It runs in five steps.

1. Measure current production

Each valuation starts from a weighted average of the seasons preceding the valuation date, so that a single unusual year does not set the price. Seasons below a minimum games-played threshold are screened out.

2. Denoise and mean-revert

A short sample over-trusts a hot or cold stretch, so the model builds a second, independent estimate of where a player of this type and age typically sits and pulls the baseline partway toward it. That estimate comes from a comparable-player search: every qualifying player-season is profiled on how his production is distributed across even-strength offence and defence, special teams and shooting, along with his usage, level, and recent trend. Candidates are weighted continuously by similarity rather than cut to a shortlist, and the rate at which weight decays with distance is estimated from the data rather than chosen.

Matching happens at a single age rather than across whole career trajectories. Profiling full careers would admit only players whose careers lasted long enough to profile, which would pull a struggling 22-year-old toward the level of the 22-year-olds who went on to long careers. Matching at one age keeps everyone who logged a qualifying season at that age, including players out of the league three years later.

The weight given to a player's own recent form versus the comparable norm is estimated by cross-validation, not set by hand.

3. Project forward on an aging curve

Future contract seasons are projected on an age-conditional pattern built from the same weighted comparables, so a player ages on the observed trajectories of players who resembled him at his age. The curve is built from within-player season-over-season changes rather than by differencing age groups, which would be contaminated by survivorship: if weaker players leave the league by 26, the average 26-year-old looks better than any individual 25-year-old actually became, purely through who dropped out.

Graded on held-out careers against the naive alternative of holding every player flat, the curve cuts average projection error by roughly 15 percent one year out and 18 percent six years out. The margin widens with distance, because "no change" degrades the further ahead you look.

4. Price end-of-contract rights

A contract expiring into unrestricted free agency is worth nothing further to the club. One expiring into restricted free agency is, because the club keeps exclusive negotiating rights at a price set by the collective agreement rather than by open-market bidding. The model walks the projection through those controlled years and prices each against the formula in force that season.

Each controlled year is then weighted by the observed probability that a club actually extends a qualifying offer to a player of that projected quality, estimated from 1,231 real qualify-or-walk decisions. An earlier version assumed clubs retain a player whenever the projected value exceeds the cost, which caught only 18 percent of the cases where clubs actually walked away. Calibrating to observed behaviour instead materially lowers terminal values for marginal players.

5. Discount to present value

Two factors discount future seasons: the probability that the player's career ends before the season arrives, estimated by quality tier and age band, and the growth of the salary cap, which erodes the relative value of a fixed future dollar.

The discount rate deliberately excludes any allowance for managerial short-termism. Building a general manager's impatience into the model's own discount rate would make it impossible for the back-test to detect managers over-discounting the future. The rate is built from fundamentals only, so any short-termism in the data has to surface as a result.

Goaltenders run a plainer version of the same chain and are priced on a separately fitted rate, because goaltender performance persists poorly from season to season and the skater rate does not transfer.

Data

Four sources, three of them assembled for this project.

  • Contracts and trades. A commercial contract database supplies the terms of every NHL contract, and its trade ledger covers 980 trades from 2018 through 2026, collapsing into 946 distinct trade events.
  • Player production. Wins above replacement, from the published model maintained by Patrick Bacon at hockeystats.com.
  • Trade-protection clauses. No-trade and no-movement status is absent from the contract database, so it was scraped from a public salary-cap reference: roughly 1,700 players and 15,261 contract-seasons, at a 97.7 percent hit rate on target players, cross-checked against a second independent source with 93.4 percent agreement and disagreements resolved by hand.
  • A self-built game-level database. Raw play-by-play and shift data for 11,870 games from 2017-18 through 2025-26, or 427,241 player-game observations, scraped from the NHL's public API.

The player model currently prices 2,909 contracts, reproduced independently on two machines.

Validation

The circularity problem

Every valuation in the model is built from one wins-above-replacement measure, and the market rate converting wins into dollars is fitted on that same measure. Checking the model against anything else derived from it would only demonstrate that it agrees with itself. A real check needs a measure of on-ice performance with none of the original model's inputs in it.

An independent benchmark

So I built one. Game Value is a game-level performance score constructed from raw league play-by-play using shot quality, on-ice events, and penalties, sharing no model and no data source with the WAR measure. It was written for a separate purpose, splitting a traded player's season across his two clubs, and serves here as an outside check. Aggregated to team-seasons, it explains 58.3 percent of the variance in real goal differential, having been fitted to nothing.

Scoring the model's production baseline against what players actually did that season, measured by Game Value, gives a correlation of 0.58 across roughly 6,000 player-seasons, holding between 0.55 and 0.61 in every one of nine seasons and landing in the same band across three variants of the benchmark. Both sides are measured in wins, so the dollar conversion never touches the outcome.

This is convergent validity rather than proof that the dollar value of a win is correct, and no threshold was set after the fact.

Status
  • Complete

    Player valuation model, covering 2,909 contracts

  • Complete

    Independent benchmark and circularity validation

  • In progress

    Draft-pick valuation: curve fitted with bootstrapped intervals, pricing of actual traded picks outstanding

  • Next

    Prospect valuation: league-to-NHL translation factors assembled, component not yet built

  • Next

    Retention and trade-clause pricing

  • Next

    Mid-season trade allocation, splitting a traded player's value around the trade date

  • Final

    The back-test: re-price every trade on information available at the time and compare against realized outcomes

Limitations

Three are worth stating plainly.

Selection. A trade happens only when two clubs agree, so observed trades are a selected sample and the trades that were never made cannot be observed. This is structural rather than fixable.

Structural parameters. No individual player's own future ever reaches his own valuation, but the comparable bank, the aging pattern, the market rate, and the retirement-risk table are each fitted on the full panel and applied backwards. What crosses the line is a population regularity rather than player-specific information, and it is documented as such.

Benchmark coverage. Agreement between the model and the independent benchmark is strong for forwards and weak for defencemen, a known limit of reading defensive play off shot and shift data.