Advanced Fantasy Hockey

By Johnny Fantasy

I’ve made plenty of criticisms of fantasy hockey setups.  Indeed, the whole inspiration for this blog was to start a conversation about how we choose the rules for our fantasy hockey leagues and ways to improve those choices.  But I’ve been thinking: what if, rather than just making adjustments within the established fantasy hockey system, we might do better by tearing down the fantasy hockey model and starting from scratch in a way that better reflects the sport as a whole? 

Hockey analytics and fantasy hockey should very much be kindred spirits, not only because both focus on stats and numbers, but because their nexus should be at the quantified values of individual players.  Analytics is working toward finding and quantifying the value of individual players separate from their surrounding teams.  Ideally, fantasy hockey would use those individual values to compare groups of players on fantasy teams.

However, I feel like there is a great divide between the forward-thinking analytics mindset (with its focus on possession metrics and situational statistics), and the old school, traditional-statistics-based, standard scoring setups of most fantasy hockey platforms (with its use of outdated and inappropriate statistics, such as +/- and goalie wins).  This disparity both stunts the hockey IQ growth of fantasy hockey managers and alienates analytics proponents from a more full enjoyment of fantasy hockey.

What follows is my proposal and rationale for a more advanced fantasy hockey game and experience, which incorporates (and can continue to be modified to incorporate new) advanced statistics.

Fundamentals: The Basic Formula

If our goal is to translate real hockey into a game with fantasy teams, we have to start with the most basic principles.  First, hockey is played head-to-head, so that will be our setup (as opposed to rotisserie, for example).  From there, we have to ask: how does one team win a hockey game against another? By scoring more goals than the opponent.  Obviously, if we wanted to play fantasy hockey on this principle only, we could already do so by using goals alone as our only scoring category.  This is of course not terribly interesting and leaves out a number of important aspects of hockey: teamwork, defense and goaltending, to name a few.

If we dig a little deeper, we can ask: how does one score goals in hockey?  Taking shots on the opponent’s net; all shots that are not saved become goals.  More broadly, a team’s ability to win a hockey game depends on both its ability to put shots on goal and on the opposing team’s ability to prevent those shots from going in.  To put this in a basic inequality, a hockey team wins if:

codecogseqn-1

We can see that each side of this inequality (representing the total goals that would be scored for each team) depends not only on the offense generated by such team, but also on the defence[1] of the opposing team.

This is an interesting piece that is missing from fantasy sports – the idea that the amount your team ‘scores’ depends on the performance of your opponent.  Fantasy sports traditionally are games of merely counting up the aggregate statistics of your team and comparing to that of your opponent.  In categories leagues, this ultimately leads to the fantasy matchup being won by winning more categories than the opponent, without valuing any one category more highly than any other.  In any sport, this is not a fair reflection of reality since not all stats will relate as directly to winning the (real-life) game as others (e.g. scoring goals will always be more directly related to winning an individual game than taking shots will).  Points leagues do better in respect of this problem since weighting the different stats is permitted, but even if we try to find a mathematical basis for weighting each stat that we are using, we are still just counting the statistics of each team in isolation.  This isn’t how most real sports, especially hockey, work and therefore this traditional model of fantasy sports doesn’t do a good job of estimating which fantasy team would actually[2] beat the other as if they were actually playing each other.

Building Out From the Basic Formula

While the above formula is a truism of real hockey, this doesn’t really work for fantasy hockey, since the players on one fantasy team aren’t necessarily taking their shots on goal against the goalie on the opposing fantasy team.  Therefore, shots on goal multiplied by the save percentage term will not always yield the same number as the number of goals actually scored by the players on a fantasy team.  Additionally, counting just the shots on goal doesn’t account for the actual goals scored by the players (nor the assists and various other statistics that contribute toward winning a hockey game).  Therefore, we won’t rely on the shots on goal alone to determine a fantasy team’s offence, but we can build out from the basic “offence (shots) filtered through the opponent’s defense” concept and relate all of the offensive stats to a common number to be filtered through a defensive metric to arrive at the equivalent of how many goals one fantasy team would score against another (we can call this a fantasy team’s “Goal Equivalents” for the matchup; in other words, the amount of goals that would be scored by Fantasy Team A against Fantasy Team B, given Fantasy Team A’s offence and Fantasy Team B’s defence during the applicable matchup period).  Then, the winner of a fantasy matchup can be determined by comparing the Goal Equivalents of each fantasy team, just as the goal totals of real hockey teams in a game are compared to determine the winner.

codecogseqn-2

So what we are going to do is build out the above formulas from here to see how we can account for and appropriately fit in the applicable offensive statistics to arrive at a fair estimation of Goal Equivalents for each team to determine the winner of a fantasy matchup.

Adding in Simple Statistics

If our basic formula focuses on filtering shots on goal through an opponent’s defensive metric, then our task is to relate each offensive statistic into an appropriately equivalent number of shots on goal.  Goals are the most straightforward.  Shooting percentage for the NHL has been around 8.9% for the past few years.  Let’s round it to 9% for simplicity.  That means for every 100 shots on goal, about 9 turn into goals, or:

codecogseqn-3

which means goals are worth an equivalent of shots on goal as follows:

codecogseqn-4

or in other words, that each goal is worth the equivalent of 11.11 shots on goal. Let’s add this into our larger formula:

codecogseqn-5

and,

codecogseqn-7

and therefore:

codecogseqn-8

Players that take a lot of shots on goal will be valuable for a fantasy team under this system, but not as valuable as players that also score goals.  We reward goal-scoring players by awarding them a number of shot equivalents equal to the number of shots on goal they would have had to take, on average, to score their goals. That number of shots is translated into Goal Equivalents by filtering it through (i.e. multiplying it by) the opposing fantasy team’s defensive metric.  If the opposing team is below-average defensively, then Goal Equivalents (in respect of goals-scored adder) will be greater than the number of goals actually scored, representing the expectation that the fantasy team would have scored even more goals against such a sub-par defense.  If, on the other hand, the opposing team is above-average defensively, Goal Equivalents (in respect of goals scored) will be less than the number of goals actually scored, representing the expectation that not as many goals would be scored against a superior defense.

We can continue this approach to relate other offensive statistics into shot on goal equivalents, so long as we can find an appropriate mathematical relation to one of the statistics we’ve already incorporated.  Let’s do assists next.  Assists don’t have a direct relation to shots like goals did, but we can first translate assists into goals and then relate that into shots on goal.  For now, we can use a simple correlative number[3] – the average number of assists that are awarded for each goal is leveling out around 1.7 assists over the past few years.  Therefore:

codecogseqn-9

and thus the equivalent number of goals in respect of assists is:

codecogseqn-10

and then incorporating the relation to turn goals into shot on goal equivalents from above:

codecogseqn-11

and therefore, updating our equation for Goal Equivalents above:

codecogseqn-13

As you may see, to consider more factors and statistics into our offensive term, we can just equate those statistics to shots on goal, and then add that into the first parenthetical (the total shots on goal equivalent term) in the Goal Equivalents equation above (which represents the offensive output of the given fantasy team).

Incorporating Situational Statistics

The beauty of this system is that we can make any adjustments that we can find a mathematical basis for.  For example, another way we can adjust this equation is to account for situational statistics.  Do we want to account for the differences of both scoring rates and save percentages on the power play?  We can split the calculation into a sum of the different situations.

codecogseqn-14

Accordingly, for the second bracketed term (the power play term), the shots on goal equivalent should be calculated as before, except with rates (e.g., shooting percentage, assists per goal, etc.) for power play situations only (and the first, even strength bracketed term should be calculated only with even strength rates).  These situational factors should self-weight[4] themselves based on the amount of power play opportunities (i.e. shots on goal) the offensive fantasy team gets and will result in two numbers that we can just add together.[5]

The great thing about this is that we get to compare statistics on an apples-to-apples basis – a team that has a lot of power play scoring will be rewarded appropriately, dependent on the strength of the opposing team’s penalty killing.  We could also get more granular if we wanted to – for example, we could further break down the power play term into two terms, one for 5-on-4 situations and one for 5-on-3 situations, or we could split the terms into different score-effect (even, leading, trailing) situations.[6]

The Defensive Metric

I’ve talked about the opposing team’s “defensive metric” so far.  So far, that metric has just been the save percentage of the opposing team’s goaltenders.[7]  This however does not account for the defensive play of the skaters on the opposing team.  Ideally, we would use the save percentage of the opposing fantasy team as a whole, but just like the goaltenders and the shooters, the skaters on a fantasy team are not necessarily actually defending the ice in front of the goalies that are on that fantasy team (nor are they defending it against the opposing fantasy skaters).

The further wrinkle is that defensive statistics are usually inherently team statistics, and thus it is difficult to isolate individual skaters’ defensive contributions and amalgamate them piece by piece to calculate the defensive play of a fantasy team as a whole.  One could make an argument that blocked shots (i.e. blocking an opponent’s shot attempt) are a defensive statistic that are easily attributable to a single skater.  While this is true, blocked shots are hardly a comprehensive measure of overall defensive contribution (and indeed may not correlate well with good overall play from a shot suppression perspective).  We could subtract the number of blocks by the opposing fantasy team from the total shot on goal equivalents,[8] but since this is such a small part of defensive play, we may want to leave the skater contributions to the defensive metric as an area to be built into this model in the future as hockey statistics, tracking and theory evolve and improve.[9]

However, we might be able to incorporate some skater defensive contributions if we are willing to take this whole system up a level to shot attempts and incorporate some modern possession metrics.

Getting More Advanced: Incorporating Possession Metrics

Much of modern analytics thinking stems from the idea that teams that spend more time with possession of the puck are more likely to take shots, score goals, and prevent shots and goals against.  In this respect, the system we have discussed so far remains inadequate since we have not included any such possession metrics into our calculations.  If we were to do so, we would not only be able account for skaters’ defensive contributions through driving puck possession, but also for other things that skaters do (beyond shots on goal, goals and assists) to drive offense through possession.

So far in our model, we’ve been mathematically transforming everything into shots on goal (equivalents).  If we perform a further transformation to change such shot on goal equivalents into shot attempt (or Corsi) equivalents, then we can apply some individual (relative) Corsi numbers to the attempt equivalents to factor in the puck-possession contributions of the individual players.  After such adjustment, we can transform those adjusted shot attempt equivalents back into shot on goal equivalents to once again filter them through the opponent’s save percentage and arrive at Goal Equivalents.

The first step (to reach shot attempt equivalents) can be accomplished in an analogous way to how we turned goals into shot on goal equivalents – by looking at the average number of shot attempts that result in shots on goal.  For the 2015-16 season, this was 53.58%:[10]

codecogseqn-15

and thus:

codecogseqn-16

When it comes to what possession statistics to apply from here, we need to use something that (to the best extent possible) separates the individual player’s contribution from the rest of his NHL teammates.   Relative Corsi does a good job of this, telling us how many more (or fewer) shots are allowed when the given player is on the ice as compared to the rest of his NHL team when that player is not on the ice.  In order to properly show meaningful information with this statistic, it needs to be expressed as a rate per 60 minutes.[11]  To get a counting (i.e. non-rate) statistic out of this to apply in our formula, we can simply multiply the relative Corsi per 60 by the player’s actual time on ice.  For example, if Drew Doughty has a 1.29 relative Corsi For/60, and he plays 30 minutes in a game, he would have contributed the equivalent of 0.645 shot attempts for his team for that game (in excess of what the rest of his team would have done without him).  On the defensive side, if his relative Corsi Against/60 equals -6.68, then for that 30 minutes of ice time, he would have prevented 3.34 more shots against than his team would have without him.  Taking theses resultant numbers and subtracting (in the case of Corsi Against for the opposing fantasy team) and adding (in the case of Corsi For for the offensive fantasy team) them to the shot attempt equivalents that we derived from shot on goal equivalents above incorporates the possession metrics of the players on each fantasy team to our model.

codecogseqn-17

If the offensive team has strong relative possession numbers, they will get a bonus bump to their shot attempt equivalents (and conversely, poor possession numbers will result in a reduction in the shot attempt equivalents).  The opposing fantasy team’s defensive possession numbers will accordingly further reduce (or add, in the case of a bad possession team) the shot attempt equivalents.

After aggregating these possession factors into our shot attempt equivalent totals, we can transform the attempts back into shot on goal equivalents by multiplying by that same average attempts to shots on goal proportion as above.

codecogseqn-18

In this way, we are assuming an average possession offense/defense, but with the relative contributions of each of the players on the fantasy team incorporated at the shot attempt level.  The possession-adjusted shot on goal equivalents are then filtered back through the defensive metric to arrive at Goal Equivalents:

codecogseqn-19

Or, to express in one comprehensive equation (not including situational statistics):

This is of course getting very complicated, but a key feature of this model is that it has the ability to be modified to account for numerous different factors and concepts depending on the preference of the user and the evolving state of analytical theory.

Illustrations

To help illustrate how such calculations could work in practice, I have created a spreadsheet containing examples (found here).  Each sheet has two sample fantasy teams, with some hypothetical statistics to calculate Goal Equivalents using a few of the models suggested above (starting on the first sheet using simply shots on goal, goals, assists and save percentage, incorporating situational statistics in the second sheet, and showing the Corsi step-up model with situational power play statistics in the third sheet).

Conclusion

This model is not without its faults, particularly its complex nature.  Because the scoring system is dynamic and integrated with the performance of the fantasy opponent (unlike in traditional fantasy hockey where you can know “I’m only 5 points behind, I need a goal!” or “If I can catch up with 3 more Hits, I’ll take that category and win the matchup!”), it is not intuitive how any one statistical event will affect the outcome of your fantasy matchup.[12]  However, as fantasy hockey players, we were willing to dig a bit deeper into the numbers than the casual fan to begin with; perhaps a portion (hopefully most) fantasy players will be willing to delve a little deeper to take advantage of this method, which better aligns conceptually with real hockey, and which can be continually improved to incorporate more and more advanced metrics of individual performance as hockey analytics and statistics advance.  All we need from here is a platform that is willing to program (or adapt from my example spreadsheet above) this system into a usable format for the fantasy hockey community.

 

[1] Well, the goaltending of the opposing team at this point.  More on defence below.

[2] i.e., in our fantasy world

[3] This formulation is assuming that we can’t (or don’t want to) track first assists and second assists separately.  If we did, we could tackle the very interesting problem of weighting each kind of assist relative to goals, and this could be a setup that is even more faithful to actual hockey.  Of course, great minds have already started to turn to this question.  We can explore this in more detail in the future.

[4] Power play scoring will translate to shot on goal equivalents at a lower rate than at even strength, since average shooting percentages are higher on the power play; but, this will be filtered through the opposing team’s defensive metric in power play situations, which on average will be worse than at even strength.

[5] Of course, we could also consider making this power play term dependent on (or scale with) the number of penalties taken by the opposing fantasy team.

[6] The downside to getting more granular, however, is that it decreases the sample size of the statistics being used for those situations during any specific fantasy matchup.  This is particularly problematic for the defensive aspect of the equation (e.g., what if the opposing team’s goalies don’t face any 5-on-3 situations during the fantasy matchup?).  This problem could be mitigated through the use of contingency rules (e.g., if the opposing goalie doesn’t face a certain minimum number of 5-on-3 shots against in a particular fantasy matchup, then the formula uses its career save percentage in that situation (or its save percentage in that situation over the past few years)).

[7] Or rather one minus save percentage, to arrive at a percentage equal to “shooting percentage against”, which is the appropriate mathematical term to multiply shot on goal equivalents by in order to get Goal Equivalents.

[8] Doing so will leave us having to deal with the goalie appearance problem.  This can be addressed using minimum goaltender appearances, having goaltender line-ups adjustable on a weekly basis (as opposed to daily) only, or even prohibiting from goaltenders from being benched.

[9] Although a block really just prevents a shot attempt, rather than a true shot on goal (since shots on goal are defined as those shot attempts that are not blocked and do not miss the net).

[10] For simplicity, we are using all situations numbers here.  If we are using a model that incorporates situational statistics as discussed above, then we should be using the appropriate rate for each of those situations.

[11] Since the player’s on-ice Corsi numbers need to be compared to the rest of his NHL team for the same amount of time, and time on ice varies from game to game

[12] However, this could be mitigated by having a few ‘resultant’ numbers that are pre-calculated and displayed for easy viewing.  For example, a displayed multiplier number for each input statistic that shows how much each additional instance of such statistic would then affect the Goal Equivalents for the fantasy matchup.

3 thoughts on “Advanced Fantasy Hockey

  1. Hey. I’m in a points league that adopted your scoring strategy 4 years ago and I just wanted to say it’s absolutely great and certainly seems to genuinely reflect player values. Without a doubt, best system I’ve come across. Thank you so much.

    Like

    1. Thanks so much! It’s really great to hear (and as you can guess from the complete lack of posting, this blog as really fallen off of my radar, but this justifies the annual cost to WordPress to keep it up!)

      Hope you’re having a great season despite the pandemic!

      Like

Leave a comment