Contract Projections

These projections are modeled using data that CapFriendly has graciously made available to us. In addition, we’ve used metrics available on our site along with biographical/draft information from the NHL. The final numbers that you see are the outputs of two separate models that work in tandem. The first model is built to predict the length of a given player’s future contract (term). A contract can be anywhere from 1 to 8 years in length. Our dataset does include contracts from the past that were longer than 8 years, but these have been adjusted to 8 years in the model for continuity. The second model is built to predict a given player’s salary cap % (a contract’s % of the cap ceiling excluding bonuses). Predicting this percentage allows us to control for the change in the NHL’s salary cap year over year. For our term model, we used Random Forest. For our cap % model, we used Cubist.

Both of these models use a weighting system that takes into account up to the prior 3 years a given player played in the NHL. If a player signs an in-season extension, we determine prior years based on whether they signed before or after February 15 within a given year. (Before: the prior year is the prior season. After: the current season stats are used). Each prior year is weighted as follows, where “n” represents “now”:


  • n-1: 11
  • n-2: 2
  • n-3: 1
  • (78.6%, 14.3%, 7.1%)

Cap %:

  • n-1: 6
  • n-2: 3
  • n-3: 2
  • (54.5%, 27.3%, 18.2%)

These weights were determined based on a lengthy cross-validation grid-search process (25 total sets of weights). In addition, other tests were performed on the 3 sets of weights that performed best in cross-validation for each model to determine the most robust system. If a player has less than 3 total seasons in the NHL, we weight differently. For two-year players, the n-1 and n-2 weights are used. For one-year players, we use only the season they played previously. A note: this model is designed with NHL players in mind. If a player does not have NHL data (i.e. they have not played in the NHL – ELC, KHL, etc.), then they are excluded from these projections.

The following features were included in both models to varying degrees:

  • Position, Age Tier, Contract Status (UFA/RFA), Signing Period, Signed with Prior Team (yes/no),
  • Years since Draft, Shooting Hand, Draft Round, Max Possible Contract (age),
  • TOI (All Situations), TOI %,
  • Goals, Primary Assists, Game Score (Dom L’s original formula),
  • iCF, iXG,
  • Giveaways, Takeaways,
  • 5v5 GF Differential, 5v5 CF Differential,
  • Term, iPEND2, iPENT2 (Cap % model only)

As mentioned, these two models work in tandem with one another – a given contract’s length (term) is included in the cap % model. This allows us to project the total contract value for any length between 1 and 8 years. Predicting term is a multiclass classification problem – there are 8 possible outcomes. This model assigns probabilities (between 0 and 1) for all 8 years, where the term with the highest probability becomes our “expected” term. The cap % model is built using the “known” term for a given contract, and we predict cap % for every player for every possible term (1-8 years). The cap % associated with the highest probability from the term model is chosen. The dollar amount displayed is based on the salary cap input by the user (we’ve set this to $84MM). The final value comes from multiplying a given player’s cap % by the total salary cap (a 10% player in an $84MM cap league = a $8.4MM total cap hit).

We’ve also added some new features this year that not only add flexibility overall, but also significantly improve each model’s respective performance: Signing Period (or the “Period” column) and “Signs With”. Signing period works like how it sounds: at what point in the year was a given contract signed? For this feature, we arrived at three “periods” within the year that a given contract can be signed – both of these features significantly contribute to both expected term and cap %. For display purposes, we’ve set this as “July”, but the other periods are available for you to look at via the “Signing Period” dropdown.

  • Period 1: July (free agency)
  • Period 2: August 1st – October 11th (free agency holdout)
  • Period 3: October 12th – June 30th (in-season extension)

“Signs With” is a binary feature that accounts for whether a player signed a given contract with the team that they most recently played for (yes / no) – for projected contracts, this takes the form of “if a player signs with their previous team or with a new team, what do we expect their projected contract to look like?”. For display purposes, we’ve set the dropdown so all UFAs sign with a new team and all RFAs sign with their previous team. However, you can look at both options for UFAs and RFAs. It’s important to keep in mind that RFAs who sign with a different team are rare cases; the model doesn’t have a lot of prior data to work with here, so please take these projections with a grain of salt. A NOTE: we are NOT predicting whether a given player will sign with their prior team or with a new team. We are simply allowing users to view both scenarios, for all players.

While this does a good job accounting for 8-year contracts overall (please reference Rule 50.8, subsection (b) (iv) of the CBA), it doesn’t do this perfectly. Alex Pietrangelo, as of this writing, is still projected to sign an 8-year deal with a different team, which is impossible. For now, we’ve chosen to leave this as is since it’s somewhat telling of just how “valuable” the model(s) think he is based on historical signings. But please keep in mind: he can’t sign an 8-year deal with a different team, nor can any other player.

Finally, we’ve made projections for all active players available as well (anyone who played more than 1 game in the ’19-20 season) – the “Free Agent” dropdown. Looking at non-free agents, however, can be a bit strange since this assumes that any and all players could sign a new contract at any given time. This isn’t really how it works and is unrealistic. Even more important here is that players who recently (within the last 3 years) signed a contract will likely be quite close to their previously signed contract since both models were trained using those same recent contracts. While both models are significantly weighted towards the most recent season, the “biographical” features will be the same, and recent players’ metrics will be similar overall. It’s best to disregard projections here for players who signed a contract within the last 3 years, or at the very least, understand that their results are going to be biased (close to their previous contract).

Update (May 2, 2023):
We have added an “Extension” option in the Free Agent dropdown. This option allows users to select all players who are currently extension-eligible. This includes any player who is currently signed to a contract longer than one year that will expire one year after the offseason selected. For example, if “20222023” is selected from the Season dropdown, projections for any player whose contract expires at the end of the ’23-24 regular season (currently signed to a contract longer than one year) will be displayed. This will be available for the ’22-23 offseason and all future offseasons. Please keep in mind that these players are not currently free agents, so the same precautions should be taken that have been noted in the above paragraph.

← Return to Glossary Home