WTS 8.2 - Fixed NHLe and 2026 Values

WTS 8.2 - Fixed NHLe and 2026 Values

Jan 21, 2026

imageHello! This update was originally intended not to be an update, but rather an addition of NHLe values for the 2025-2026 season, since there is now enough data to make updated values. That changed when I discovered an error in my previous method of calculating NHLe conversions, which meant that every conversion had to be redone. I'm also going to use this post as an updated NHLe creation guide so you can see how all my values get created. Let's get into it!

NHLe Conversion Creation Method

My process has four major steps. The first is adjusting every player's stats for their team's quality. You can read more about how this is done in this article: buymeacoffee.com/watchthestats/wts-8-1-update-team-strength-adjustment. This process is done for every season and every league in my database.

Think of NHLe as using many flat stones to create a path. The path takes a league's scoring and puts it in NHL terms, NHLe. The path is made of many stones, all connected. The little stones are needed since there is rarely one big stone that connects a league to the NHL. In the case that stone exists, it's rarely flat. It is subject to a lot of variance, which is why you also need other stones to help smooth out the path.

There are three types of stones that I use in my process. I call them Type 0, Type 1, and Type 2. A type 0 stone uses stats from the same season for both leagues to calculate the conversion. The difference between Type 1 & 2 is all about perspective (important later on), but both use stats from adjacent seasons. For now, let's just combines Type 1 and 2 into Type B. We'll differentiate later on.

Stones are created one league at a time. I'll use the OHL as an example here, but just keep in mind this process is done for every league I have data for. Creating Type 0 stones is easy. All I have to do is find players who played in both the OHL and any other league in the same season. Before aggregated stats, I adjust each player's production to make high scoring worth disproportionately more than lower scoring. You can read about the process and why in this article: buymeacoffee.com/watchthestats/6-1-update-nhle-adjustments.

Following that adjustment, every unique combination of season and leagues gets aggregated. Using the point pace of this cluster of players in both leagues, a conversion is then calculated. Here are some examples of Type 0 OHL stones for the 2024-2025 season.

imageThe conversion value is how many second_league points are equivalent to 1 first_league (OHL) point. The sample size is how many total games the league with fewer had in each unique combination. For example, if our OHL-OJHL conversion had 830 games of data for the OHL and 1,200 for the OJHL, the smaller 830-game value would be stored as the sample size.

All these stones are Type 0, so now it's time to create Type B stones. The process for these is similar, but instead of using stats from the same season, the stats now come from adjacent years. This is also where it matters which leagues are first and second in each combination. For Type 0 stones, a reverse stone exists for every combination. If you looked at every stone for the OJHL in 2024-2025, you would see a stone that has the OHL as the second league, and with a conversion of 1 / 5.77072 = 0.21816.

imageType B stones may have reversed league combinations, but the conversion will rarely be the inverse of the other, since the cluster of players making up each group is different. One group is players who played in the OJHL and then the OHL next year, while the other group is of players who played in the OHL and then went down to the OJHL next year. These are two very different groups that will not create inverse-able conversion values.

When creating Type B stones, I also adjust for development based on a player's age. This makes these stones more accurate since the changes in production are more based on league difference than on age difference. You can read about the development curve I use here: buymeacoffee.com/watchthestats/watch-the-stats-6-0-update. Once all the adjustments are made, the stats are aggregated by season, leagues, and order to create Type B stones.

As I said earlier, the difference between Type 1 and Type 2 stones is about perspective. If we make our perspective revolving around the OHL, then a Type 1 stone will be one where the OHL was the first league in the first season. A Type 2 stone will be the opposite, one where the OHL was the second league in the second season. Here are some examples of Type 1 & 2 OHL stones for the 2024-2025 season.

imageType 1, OHL comes first

imageType 2, OHL comes second

Now that we have all our stones created, it's time to piece them together to create a path for every league directly to the NHL. I use a max of three stones to create a path, but there are also full paths made of one or two stones.

This is where the error in my previous method was. For paths with three stones, I was not using all possible stones in that third spot. Let's say we want to make a path for the OHL, and I have the start of a path of OHL -> AHL. If I had a Type 1 stone of NCAA -> AHL, I was not using it to finish this path since the AHL wasn't the first year. This happened since I copied the code from Type 0, where the inverse already existed, so there would be another stone in my database that would be AHL -> NCAA with an appropriately inverted conversion. This doesn't exist for Type 1 & 2 since AHL -> NCAA stone would use a different group of players. Flipping the NCAA -> AHL stone and using its inverted conversion might be better for this path if it has a higher weight than the AHL -> NCAA stone.

Now that I'm flipping stones in this process, it gives me more stones to use and leads to what I've seen as more stable NHLe values. It also makes NHLe values for most leagues lower than usual, which was an interesting change to see. This fix gives me more possible paths to use and create final NHLe values with.

Each possible path is assigned a weight value, which is used to measure how influential it should be when all paths are combined. Path weights are calculated by multiplying the smallest stone sample size value in that path by...

  • 0.5 for 1 stone paths

  • 0.25 for 2 stone paths

  • 0.125 for 3 stone paths

This gives more weight to paths with fewer stones while keeping paths with consistently large sample sizes influential in the final step. The final NHLe values come from combining many complete paths that have a path weight of at least 5. A league can not be used in multiple complete paths since it would give it more influence than its weight value. For example, the OHL's NHLe can't be built from two complete paths that use the NCAA, only one can stay. Here are all of the paths that meet these requirements and are used to calculate the OHL's 2024-2025 NHLe.

imagePaths that use Type 0 stones can only use Type 0 stones. I don't mix there. What can happen, however, is that a path consists of both Type 1 and Type 2 stones. How do you classify a path as Type 1 or Type 2 if it uses stones of both types? If a path has two Type 1 stones and one Type 2 stone, then its "weighted type" would be 1.33. I found that paths that round to the same whole number have similar NHLe values, where I felt comfortable rounding them and combining them.

Type 0, 1, and 2 are new to my NHLe creation process. My thought was that Types 1 and 2 would pull a league's NHLe in opposite directions since there is some significant bias in which players move up/down leagues. I found that to be true in this step. Paths with weights of 1 and 1.33 were very similar to each other, while paths of 1.5, 1.66, and 2 were all similar to each other but not in the same way as those of weights of 1 and 1.33.

If you have a keen eye, you may notice that the World Juniors (wjc-20) are used in three paths. This happens since they have the same weight, so all three are kept by my code. These three paths get combined into one path that has a weight of 22, with an NHLe value that is the average of those three paths. Here's the result of combining all these final branches, separated by type.

imageFrom here, it's easy to find the OHL's NHLe for this season. To balance out the effects that Types 1 and 2 have on NHLe, I disregard weight from here on. The final NHLe is found using an average of the NHLe conversions of the three types.

Before taking the average, there are a few things that have to happen first. One of these is completing values for the 2025-2026 season. The main issues are that Type 1 stones for this season don't exist yet, and smaller sample sizes than normal, since the year isn't over yet. The first problem is fixed by simply borrowing last year's Type 1 value. The second problem is fixed by "filling in" the Type 0 & 2 stones. Here's the OHL's 2026 NHLe values next to its 2025 ones. Note the difference in weight and the missing Type 1 in 2026.

image"Filling in" is done by bringing the 2026 values to a weight that matches 2025, using 2025 values. Filling in Type 0 2026 looks like this: (0.383 * 72.000 + 0.1514 * (379.500 - 72.000)) / 379.500 = 0.195. The same thing is done for Type 2. This solves the problem with the 2026 values. The next thing that needs to happen before taking the average is removing any outlier final branches. I also removed any branches from the NHL lockout years and the 2020-21 COVID-affected season.

All the adjustments are now made, final NHLe values can be calculated. I use a five-year average for this step to make these values more stable and less affected by minor changes. Here's the final result for the OHL to conclude our example.

imageLooking at NHLe in a New Way / Results

Here's the OHL's new NHLe plotted out. You may notice the league going in the opposite direction of what you may expect based on the new CHL-NCAA transfers...

imageShouldn't the OHL's NHLe be getting lower this season since the league lost a lot of talent to the NCAA? That's what I expected to see as well... It turns out the problem is not with my NHLe values, but with this way of looking at them. If we're using this chart as a way to view the strength of the OHL, we're making one key assumption that may not be true. This assumes the scoring rate in the OHL remained the same for the past 36 seasons, something that probably isn't true.

I'm calculating league scoring by finding the total number of points scored and games in my database for each league and season combination. Finding the point production pace using these totals gives us what an average player scores in a league every season. Here's what that looks like for the OHL.

imageThis makes it pretty clear that the assumption we're making before is incorrect. League scoring rates change, and those changes should be taken into account when we view NHLe. Multiplying these paces by their corresponding NHLe values and then by 82 games results in a value that allows for a much better way to view NHLe. These are the results...

imageThis tells a much more accurate picture. It shows the OHL seeing a significant dip, now back at its lowest point in 16 years. This is how my NHLe will be displayed on the NHLe values sheet, available to $5 members. Here are the top leagues this season and their adjusted values.

image

That's It!

If you read through all of this, let me just say thank you! The full results can be found on the NHLe values sheet, which is available to $5/month members. Thanks to everybody who supports my stuff, it means a lot!

Vous aimez cette publication ?

Achetez un stick tap à Nick Iacoban

Plus de Nick Iacoban