How Accurate Has the Contract Predictor Been This Offseason?

Comparing contracts signed during 2026 NHL free agency to the ones predicted in the PuckTheory Contract Predictor tool.

Last updated:


The PuckTheory contract predictor was last trained on a PuckPedia export dated April 6, 2026. All contracts signed during free agency are deals that the model never saw during training. This is a look at how the model actually did against those signings, broken down by different categories: by term length, by salary tier, and separately for skaters and goalies. All contracts signed during June 30th and July 14th will be included, with some exceptions that will be defined shortly.

A Note on the Data

Contracts analyzed here were compiled by hand from public trackers (PuckPedia, ESPN, etc.) rather than pulled from a fresh export. It's a useful reminder that a hand-compiled dataset like this one may have some errors or inconsistencies, although the data has been validated multiple times. Predictions made are actually by percentage of cap, which is then applied to the salary cap of whatever season the contract begins. AAVs are given to be more easily interpreted (AAV = cap% * Salary Cap). Only contracts signed between June 30th and July 14th are included. Of 220 non-entry-level contracts gathered, 2 offer sheets and 5 bonus-heavy deals were set aside entirely (see methodology below) and 134 of the remaining belonged to players with predictions in the contract prediction tool (120 skaters, 14 goalies); the other 79 were league-minimum two-way tenders for depth/AHL players who didn't have enough NHL data to be included in the contract predictions. The full comparison table is at the bottom of this article, and every column is sortable.

The Short Version
  • The model lands within $1M of actual AAV on 79.2% of skater contracts and 78.6% of goalie contracts.
  • At the tighter $0.5M threshold, that drops to 66.7% of skaters and 50% of goalies.
  • Overall, predicted AAV correlates with actual signed AAV at R² = 0.868 for skaters and R² = 0.829 for goalies across the full sample.
  • It's most accurate on short deals (1-2 years) and league-minimum-adjacent depth pieces. It gets worse as term and dollar value climb.
  • The length model's top pick matches the actual term signed 43.3% of the time for skaters, but lands within one year of the actual term 80.8% of the time.
  • Offer sheets and bonus-heavy 35+ deals are excluded, and extensions are scored against the model's extension-specific prediction rather than its standard one.

How This Was Measured

Within the contract prediction tool, every player has a predicted cap hit for each different term length that they can sign. For every contract actually signed, I pulled that player's precomputed per-term prediction for the signed term and compared it to the actual AAV they signed for. "Within $0.5M" and "within $1M" are the two thresholds used throughout.

Three adjustments keep the comparison honest rather than flattering the model:

  • Extensions are scored against the tool's extension-specific prediction, projected one season forward and priced against the $113.5M 2027-28 cap, not the $104M 2026-27 cap, since that's the season the deal actually kicks in.
  • Offer sheets are excluded. Their price is set to be painful enough to force a decision, not indicative of the market.
  • Bonus-heavy 35+ deals (5 contracts are excluded). The reported AAV is deliberately structured lower than the deal's total value, which the model has no way to anticipate.

Skaters: Accuracy by Term Length

% of contracts where the model's predicted AAV landed within $0.5M / $1M of the actual signed AAV, broken out by contract term. n shown per bar.

TermnWithin $0.5MWithin $1MMean abs. errorMean % error
1 yr 55 74.5% 83.6% $0.46M 29.6%
2 yr 34 76.5% 88.2% $0.48M 22.3%
3 yr 11 54.5% 81.8% $0.75M 22.5%
4 yr 6 50% 50% $0.92M 17.6%
5 yr 6 50% 50% $0.83M 15.7%
6 yr 3 33.3% 66.7% $1.36M 15.3%
7 yr 2 0% 50% $1.25M 12.1%
8 yr 3 0% 33.3% $1.07M 15%

Two things to note. First, the 1-2 year buckets carry most of the sample (89 of 120 contracts) because most of July 1 is depth and bridge signings, and that's where the model is sharpest. 88.2% of two-year deals land within $1M. This is likely because shorter term deals typically carry a smaller AAV (around $850K-$2M), and a $1M error could mean a ~50-100% margin of error, so it is expected that the model would be within $1M quite consistently within this term bucket. Second, the 4-8 year range is the roughest patch, and it's a small-sample problem as much as a model problem: none of those buckets clear a handful of contracts. The 6-year bucket is dragged down almost entirely by Bowen Byram's extension miss (see below). The other two 6-year deals in the sample both land within $1M. The 8-year bucket is a different story: all three are true extensions (Demidov, Foerster, Luostarinen), and each misses by a modest but consistent $0.7-1.4M, enough that only one of the three clears the $1M bar. Don't read much into any bucket this small either direction.

The takeaway on term length: The model has a better time predicting the AAV on shorter term deals. They're easier because they're dominated by depth/replacement-level players whose value is low and narrow-banded to begin with. The multi-year, true free-agent-market deals are where the market and the model disagree the most.

Skaters: Accuracy by Salary Tier

% of contracts within $0.5M / $1M of actual AAV, broken out by actual signed AAV tier.

TiernWithin $0.5MWithin $1MMean abs. errorMean % error
Under $2M 65 90.8% 95.4% $0.27M 26.2%
$2M-$5M 35 40% 68.6% $0.82M 25.6%
$5M-$8M 13 38.5% 46.2% $1.11M 19.3%
$8M+ 7 28.6% 42.9% $1.39M 13.7%

This is the clearest pattern in the whole dataset. Under $2M, the model is excellent (95.4% within $1M), because there isn't much room for disagreement when replacement-level players are being paid replacement-level money. The $2M-$5M tier is where the model has a harder time: it's the salary range where free agency turns into a bidding war. A serviceable middle-six forward or middle-pairing defenseman with an okay contract year gets bid to $4-5M by three or four teams competing for the same depth, well above what their underlying production alone would justify. At the very top ($8M+), error is worse again, but the mean percent error is actually the lowest. Contracts in this range may be inflated due to post-trade signings where players have higher leverage (e.g. Bowen Byram).

Goalies

% within $0.5M / $1M of actual AAV, by term length. 14 goalie contracts matched to a precomputed prediction.

TermnWithin $0.5MWithin $1MMean abs. errorMean % error
1 yr 7 57.1% 85.7% $0.56M 39.7%
2 yr 4 50% 75% $0.58M 35.1%
3 yr 2 50% 100% $0.61M 10.3%
5 yr 1 0% 0% $1.30M 23.6%

Overall, 78.6% of goalie contracts land within $1M of their prediction, which is still a solid showing given the goalie model trains on a much smaller dataset (296 contracts) than the skater model (~2,990). By salary tier: under $2M, 66.7% within $1M; $2M-$5M, 100% within $1M (small sample); $5M-$8M, 66.7%.

The one 5-year deal in the sample is Dan Vladar's extension with Philadelphia, 5 years at $5.5M AAV against a model prediction of $6.8M, a $1.3M miss. Vladar signed his deal while still under contract through 2026-27, which makes it an extension rather than a UFA signing.

Accuracy by Player Age

Age buckets here use the player's age as of October 1 of the season the contract actually begins, 2026-27 for a standard signing, 2027-28 for a true extension, matching the age convention the model itself is trained on.

AgenWithin $0.5MWithin $1MMean abs. errorMean % error
24 and under 14 71.4% 78.6% $0.45M 11.8%
25-27 32 71.9% 84.4% $0.60M 24.3%
28-32 52 65.4% 80.8% $0.55M 21.3%
33+ 22 59.1% 68.2% $0.74M 40.8%

Skaters get steadily harder to predict with age. The dollar-error and hit-rate numbers drift down only gradually through age 32, and even more in the 33+ bucket. The within-$1M rate drops to 68.2%, and mean absolute error jumps to $0.74M. That tracks with the discount cases discussed throughout this article. Older players are exactly where personal decisions (discounts to keep playing, one-year "prove it" deals, teams betting on name recognition over projected production) stray furthest from what a stats-only model would predict.

AgenWithin $0.5MWithin $1MMean abs. errorMean % error
24 and under 2 100% 100% $0.14M 12.8%
25-27 5 40% 100% $0.61M 20.2%
28-32 3 33.3% 33.3% $0.84M 43.3%
33+ 4 50% 75% $0.73M 51.6%

Goalie age buckets are too thin to read much into individually. The 24-and-under bucket is just two contracts. The broad shape still aligns with the skater data: accuracy is best in the goalie's physical prime and gets noisier at the tail end of a career, but with 14 goalie contracts total split four ways, none of these buckets should be treated as a real verdict on its own.

The Length Model

Separately from AAV, the tool predicts a probability distribution over contract term (1-8 years) and highlights the highest-probability term. Checking that against actual signed term:

Skaters (n=120)Goalies (n=14)
Top pick matches actual term43.3%50%
Actual term in model's top 273.3%78.6%
Actual term within 1 year of top pick80.8%78.6%
Mean rank of actual term2.221.71

A 43.3% top-1 hit rate sounds unimpressive on its own, but it needs context: with 8 possible terms, random guessing would land around 12.5%, so the model is roughly 3-4x better than random chance at picking the exact year. The "within 1 year" number is the more useful one in practice. The model's pick is either exactly right or off by a single year the vast majority of the time, which is close enough to be useful for estimating how long a player may sign. This lines up with the intent of the model's design: getting an idea of which range of terms a player may sign for, as a lot goes into negotiations that can affect term which are not visible within the data.

Where the Model Missed Worst, and Why

Ten largest skater prediction errors, in millions. Positive = model predicted more than actual; negative = model predicted less.

Sorting by absolute error and looking at each individual miss allows us to see circumstance that may cause the model to miss. Nearly every one of these large misses falls into one of three scenarios, none of which the model was built to handle:

1. Leverage situations: trades and arbitration. Bowen Byram's 6-year, $12.5M extension in Chicago is the largest miss left in the dataset (model said $9.31M). Byram was acquired by a team that needed to either lock him up or risk losing him for nothing, which is a strong negotiating position for Byram and his agent. It's a softer version of the offer-sheet dynamic that I excluded. Pavel Dorofeyev's 7-year, $11M deal with the Rangers is the same story from the other side: he was traded for a package including two first-round picks, and a team that just paid draft capital for a player is not going to then lowball him on term or dollars. Now let's take a look at Braden Schneider's 1-year, $5.5M settlement with the Rangers (model said $3.0M). He filed for arbitration, and once an independent arbitrator is about to set the number using recent deals as precedent, a team settling to avoid that hearing tends to land closer to what the market's higher comparables than what a model would predict.

2. Pure July 1 bidding wars. Colton Sissons, Jamie Oleksiak, Jacob Trouba, Andrei Kuzmenko, Oliver Bjorkstrand, and Trevor van Riemsdyk are all considered mid-tier UFAs who signed for noticeably more than their production profile implied. This is the same effect visible in the $2M-$5M salary-tier numbers above: open-market competition on the single day when every team needs the same handful of depth pieces inflates prices past what any single team would pay in isolation.

3. Below-market "prove it" deals. Jaden Schwartz's 3-year, $3.25M deal with Colorado (model said $5.5M) looks like a veteran discount where Schwartz wants to chase another Cup.

What This Says About the Model

Even with some shortcomings, the model still succeeds overall at its main goal, to price production. It was never going to see a player's private decision to take a discount to keep playing for a specific team, or a bidding war between four teams competing for the same free agent on the same afternoon. These are the limitations that we need to accept with models like these: team fit, personal negotiating dynamics, and trade/leverage situations are explicitly out of scope.

What the numbers do confirm: the model's accuracy is not uniform, but we do have a solid idea of where it's strong and where it can improve. It is excellent on replacement-level and short-term deals, solid on the length call within a year, and weakest where the signings are affected by outside circumstances.

The Full Data

Every matched contract behind the numbers above. Click any column header to sort by it (click again to flip direction). "Diff" is predicted minus actual. Positive means the model predicted more than the player actually got, negative means the model predicted less. Offer sheets and unmatched depth/two-way tenders are not included since they weren't scored.

Skaters (120)

Player Team Term Type Actual AAV Predicted AAV Diff (Pred - Actual)
Bowen Byram CHI 6yr Extension $12.50M $9.31M -$3.19M
Braden Schneider NYR 1yr RFA $5.50M $3.00M -$2.50M
Colton Sissons TOR 2yr UFA $4.25M $1.75M -$2.50M
Jamie Oleksiak VAN 2yr UFA $5.00M $2.58M -$2.42M
Jaden Schwartz COL 3yr UFA $3.25M $5.50M +$2.25M
Jacob Trouba SJS 4yr UFA $8.25M $6.03M -$2.22M
Yegor Chinakhov PIT 3yr UFA $6.25M $4.06M -$2.19M
Andrei Kuzmenko PIT 1yr UFA $5.00M $2.84M -$2.16M
Oliver Bjorkstrand NYR 1yr UFA $4.50M $2.40M -$2.10M
Pavel Dorofeyev NYR 7yr UFA $11.00M $9.04M -$1.96M
Roman Schmidt MIN 1yr RFA $0.85M $2.78M +$1.93M
Trevor van Riemsdyk PIT 2yr UFA $4.00M $2.21M -$1.79M
Ryan Shea EDM 5yr UFA $4.00M $5.52M +$1.52M
Andrew Peeke UTA 1yr UFA $1.00M $2.46M +$1.46M
Ivan Demidov MTL 8yr Extension $9.13M $10.56M +$1.44M
Luke Schenn VAN 1yr UFA $2.25M $0.85M -$1.40M
Ilya Mikheyev TBL 4yr UFA $3.85M $5.24M +$1.39M
Ian Cole CHI 1yr UFA $4.00M $2.63M -$1.37M
Kasperi Kapanen EDM 1yr UFA $2.60M $1.34M -$1.26M
Pavel Mintyukov ANA 5yr RFA $7.20M $5.95M -$1.25M
Simon Nemec CGY 5yr RFA $7.25M $6.00M -$1.25M
Hunter Skinner NSH 1yr UFA $0.85M $2.07M +$1.22M
A.J. Greer ANA 4yr UFA $4.25M $3.06M -$1.19M
Brandon Duhaime TOR 2yr UFA $2.60M $1.53M -$1.07M
Tyson Foerster PHI 8yr Extension $7.10M $8.14M +$1.04M
Ross Johnston STL 3yr UFA $2.00M $1.05M -$0.95M
Kevin Stenlund UTA 1yr UFA $2.75M $1.87M -$0.88M
Matias Maccelli NYI 1yr UFA $2.25M $3.13M +$0.88M
Cole Smith CHI 3yr UFA $3.00M $2.20M -$0.80M
Noel Acciari PHI 2yr UFA $2.80M $2.03M -$0.77M
Maxim Shabanov MIN 1yr UFA $1.60M $0.85M -$0.75M
Eetu Luostarinen FLA 8yr Extension $5.00M $5.72M +$0.72M
Teddy Blueger TOR 2yr UFA $2.50M $3.21M +$0.71M
Joe Veleno NYR 1yr UFA $1.20M $1.89M +$0.69M
Nicholas Robertson PIT 2yr RFA $3.25M $2.57M -$0.68M
Jeremy Lauzon VGK 6yr Extension $4.00M $4.64M +$0.64M
Nick Foligno MIN 1yr UFA $0.90M $1.52M +$0.62M
Alexander Kerfoot NSH 2yr UFA $3.50M $2.90M -$0.60M
Rasmus Andersson VGK 7yr Extension $8.50M $9.04M +$0.54M
Olen Zellweger BUF 3yr RFA $3.00M $3.51M +$0.51M
Cole Schwindt FLA 2yr RFA $0.88M $1.36M +$0.49M
Marc Gatcomb VGK 2yr UFA $0.88M $1.36M +$0.48M
Zach Aston-Reese PHI 2yr UFA $0.88M $1.35M +$0.48M
John Beecher FLA 1yr UFA $0.85M $1.30M +$0.45M
Jordan Harris BOS 1yr UFA $0.85M $1.29M +$0.44M
Justin Holl WSH 1yr UFA $0.90M $1.34M +$0.44M
Declan Carlile PIT 2yr UFA $1.50M $1.07M -$0.43M
Mackie Samoskevich SEA 3yr RFA $3.85M $3.42M -$0.43M
Paul Cotter VAN 1yr UFA $2.15M $1.73M -$0.42M
Carl Grundstrom PHI 1yr UFA $1.00M $1.41M +$0.41M
Jagger Joshua MIN 2yr UFA $1.75M $2.16M +$0.41M
Spencer Stastney EDM 1yr RFA $1.52M $1.12M -$0.40M
Erik Gudbranson CBJ 1yr UFA $1.75M $2.15M +$0.40M
Zach Bogosian MIN 1yr UFA $1.25M $0.85M -$0.40M
Jeff Malott ANA 3yr UFA $1.85M $1.46M -$0.39M
Jack Roslovic TOR 2yr UFA $4.00M $4.38M +$0.38M
Jeffrey Viel TBL 5yr UFA $2.50M $2.88M +$0.38M
Mario Ferraro WPG 3yr RFA $4.00M $4.37M +$0.37M
Nico Hischier NJD 5yr Extension $11.70M $12.06M +$0.36M
Justin Barron NSH 1yr RFA $1.57M $1.22M -$0.35M
Ryan Lomberg CBJ 2yr UFA $1.30M $1.62M +$0.32M
Emil Andrae TOR 2yr RFA $1.55M $1.87M +$0.32M
Marc Del Gaizo NYR 2yr UFA $0.88M $1.16M +$0.29M
David Gustafsson PIT 1yr UFA $0.85M $1.13M +$0.28M
Mathieu Joseph EDM 1yr UFA $1.00M $1.28M +$0.28M
Boone Jenner WSH 4yr UFA $5.75M $6.02M +$0.27M
Nick Jensen ANA 2yr UFA $2.25M $2.51M +$0.26M
Victor Olofsson VGK 1yr UFA $1.64M $1.39M -$0.25M
Max Jones EDM 1yr UFA $0.85M $1.10M +$0.25M
Mavrik Bourque NSH 6yr RFA $5.50M $5.75M +$0.25M
Hendrix Lapierre PIT 2yr RFA $1.30M $1.55M +$0.25M
Nick Cousins OTT 2yr UFA $1.59M $1.81M +$0.22M
Peyton Krebs BUF 4yr RFA $4.50M $4.28M -$0.22M
Vincent Desharnais WSH 4yr UFA $4.20M $3.98M -$0.22M
Curtis Douglas SEA 2yr UFA $1.25M $1.04M -$0.21M
Mason Marchment SJS 5yr UFA $6.75M $6.54M -$0.21M
Erik Haula LAK 2yr UFA $3.60M $3.41M -$0.19M
Arseny Gritsyuk NJD 3yr Extension $3.25M $3.07M -$0.18M
Brett Leason SJS 1yr UFA $0.85M $1.03M +$0.18M
Viktor Arvidsson DET 2yr UFA $5.00M $5.16M +$0.16M
Scott Laughton LAK 3yr UFA $3.50M $3.65M +$0.15M
Scott Perunovich LAK 1yr UFA $0.85M $0.99M +$0.14M
Arttu Hyry DAL 2yr UFA $0.90M $1.04M +$0.14M
Colton Dach EDM 2yr RFA $1.20M $1.07M -$0.13M
Vinnie Hinostroza COL 2yr UFA $0.88M $1.01M +$0.13M
Conor Sheary BUF 1yr UFA $0.85M $0.98M +$0.13M
Jonas Rondbjerg VGK 1yr UFA $0.85M $0.97M +$0.12M
Alex Barre-Boulet SJS 2yr UFA $0.88M $1.00M +$0.12M
Connor Clifton BOS 2yr UFA $2.25M $2.13M -$0.12M
Brendan Gaunce BOS 2yr UFA $0.88M $0.99M +$0.11M
Alexander Petrovic FLA 2yr UFA $0.88M $0.98M +$0.11M
Jonatan Berggren STL 1yr UFA $2.00M $1.90M -$0.10M
Bobby Brink MIN 1yr UFA $2.75M $2.85M +$0.10M
Vladislav Kolyachonok NJD 1yr UFA $0.85M $0.94M +$0.09M
Mitchell Chaffee NYI 1yr UFA $0.85M $0.94M +$0.09M
Matthew Kessel NYI 1yr UFA $0.85M $0.93M +$0.08M
Andreas Englund CGY 1yr UFA $0.90M $0.98M +$0.08M
Jacob Bryson DET 1yr UFA $0.85M $0.92M +$0.07M
Joel Kiviranta DAL 1yr UFA $1.00M $1.06M +$0.06M
Henry Thrun WPG 1yr RFA $0.85M $0.90M +$0.05M
Dennis Gilbert BUF 1yr UFA $0.85M $0.90M +$0.05M
Daemon Hunt MIN 1yr UFA $0.90M $0.85M -$0.05M
Noah Juulsen COL 2yr UFA $1.10M $1.14M +$0.04M
Akil Thomas VAN 1yr UFA $0.85M $0.89M +$0.04M
Dennis Cholowski NYR 2yr UFA $0.88M $0.91M +$0.03M
Colton White CBJ 2yr UFA $0.88M $0.91M +$0.03M
Vinni Lettieri TOR 1yr UFA $0.85M $0.88M +$0.03M
Oskar Sundqvist STL 1yr UFA $0.85M $0.88M +$0.03M
Jacob Quillan TOR 1yr RFA $0.85M $0.87M +$0.02M
John Carlson TBL 2yr UFA $8.50M $8.52M +$0.02M
Jonny Brodzinski WSH 1yr UFA $0.85M $0.87M +$0.02M
Donovan Sebrango FLA 1yr UFA $0.85M $0.86M +$0.01M
Anders Lee UTA 3yr UFA $5.40M $5.41M +$0.01M
Josh Dunne WSH 1yr UFA $0.85M $0.85M +$0.00M
Justin Kirkland MIN 1yr UFA $0.85M $0.85M +$0.00M
Noah Gregor WPG 1yr UFA $0.85M $0.85M +$0.00M
Ben Jones CGY 1yr UFA $0.85M $0.85M +$0.00M
Jansen Harkins TBL 1yr UFA $0.85M $0.85M +$0.00M
Kyle Burroughs DAL 1yr UFA $0.85M $0.85M +$0.00M
Brett Berard MTL 1yr RFA $0.85M $0.85M +$0.00M

Goalies (14)

Player Team Term Type Actual AAV Predicted AAV Diff (Pred - Actual)
David Rittich NJD 1yr UFA $1.00M $2.59M +$1.59M
Dan Vladar PHI 5yr Extension $5.50M $6.80M +$1.30M
Eric Comrie SJS 2yr UFA $1.15M $2.37M +$1.22M
Stuart Skinner WPG 2yr UFA $3.75M $4.71M +$0.96M
Daniil Tarasov DET 1yr UFA $2.00M $2.91M +$0.91M
Jakub Dobes MTL 3yr Extension $5.36M $6.10M +$0.74M
Frederik Andersen EDM 1yr UFA $2.80M $2.08M -$0.72M
Sergei Bobrovsky TOR 3yr UFA $7.00M $6.53M -$0.47M
Arturs Silovs PIT 1yr UFA $2.80M $3.09M +$0.29M
Leevi Merilainen OTT 1yr RFA $1.10M $0.85M -$0.25M
Calvin Pickard MIN 1yr UFA $1.00M $0.85M -$0.15M
Samuel Ersson OTT 2yr UFA $2.20M $2.07M -$0.13M
Joel Blomqvist PIT 2yr UFA $0.88M $0.85M -$0.03M
Vitek Vanecek NYI 1yr UFA $1.00M $1.00M -$0.00M
PuckTheory Tool

Try the Contract Predictor

The same model behind this analysis is available as an interactive tool. Browse all active NHL skater and goaltender contracts and predict market-rate contract values.

Open the Tool →

Data sources: Model training data supplied by PuckPedia (through April 6, 2026). Post-cutoff signings compiled from PuckPedia, ESPN, and NHL.com. Analysis based on PuckTheory contract predictor v1.1.0.