OPPO: Valuing Opportunities for Fantasy Football

Kyle Bland (@blandalytics) explains his OPPO metric and how you can use it to make better decisions in fantasy football.

Click here to access the full OPPO database!


Fantasy points are the currency of fantasy football, but they can be volatile. Consider these scenarios:

  • A running back gets stuffed on a 1-yard carry at the goal line, while his teammate later capitalizes on poor tackling for a 40-yard touchdown.
  • A tight end drops an easy 5-yard pass short of the first down marker, while a wide receiver gets open for a deep 30-yard bomb and makes the catch.


The Rationale


These scenarios highlight the volatility of a given play. Gaining a single rushing yard is likely, but short runs get stopped. A catch is more difficult when there’s more time in the air and the defense is prepared to prevent a first down or big play, but those catches are still made. Touchdowns are likelier on plays closer to the goal line, but teams still break off long-distance plays that score.

Opportunity Points (OPPO) is a way to pare down that volatility. By estimating yards gained, catch probability, and the likelihood of a play resulting in a touchdown, we can see which players are receiving the most valuable opportunities, and identify players that have been lucky or unlucky.


The Models


The foundation of OPPO is a combination of 5 models:

  • xRush Yards: Predicted number of yards for a given rush. This incorporates defensive personnel, distance from first down, and distance from the endzone.
  • Rushing xTD: Modeled probability of a rush being a touchdown. This incorporates defensive personnel and distance from the endzone.
  • xCompletion% (for xReceptions): Modeled probability of a target resulting in a catch. This incorporates defensive personnel, if the QB was hit, general pass location, the distance of the throw, distance from first down, and distance from the endzone.
  • xReceiving Yards: Predicted number of yards for a given target. This incorporates xCompletion%, the distance of the throw, and the modeled number of yards after the catch.
  • Receiving xTD: Modeled probability of a target being a touchdown. This incorporates the distance of the throw and distance from the endzone.

Data for training, testing, and applying the models is courtesy of nflfastR, via the nfl-data-py package.




With the outputs of these models, every rush and target has an estimate for yards gained, how likely it is to be a touchdown, and how likely it is to be a catch (for targets). From there, a standard PPR scoring system was used to provide the value of those outputs (0.1 pts for a yard, 6 pts for a touchdown, and 1 pt for a reception). Putting it all together gives an estimate of the number of fantasy points for a given opportunity: OPPO.

With this in hand, we can also see the difference in a play’s result compared to its expectation: PAO (Points Above OPPO). PAO above 0 indicates that a play resulted in more points than expected. This may be due to gaining more yards, scoring a touchdown, or both. Below 0 means a play didn’t meet up with its expectation. Over the course of a week, month, or season, a player’s PAO can help show if they’ve been lucky (high PAO) or unlucky (low PAO).

Note: Better players will tend to have slightly higher than 0 PAO, as player talent is something that isn’t taken into account for OPPO. This is something to consider when looking at PAO, but it does not invalidate the metric, as talented players can still get lucky or unlucky.

Data for this season can be found on this Google Sheet. You may want to make your own copy of the sheet so that you can sort and filter the sheet however you’d like. To do so, just navigate to File > Make A Copy and save your own version to your Google Drive. If you do this, you’ll need to return to the main sheet every week to receive the updated values.


Use Cases


OPPO has a variety of ways that it can be used to analyze players, but three prominent ones are:

  • Identifying regression candidates: Players that are performing above expectations (high PAO) would be expected to regress down if given similar opportunities going forward. This could be utilized by trading an overperforming player for an underperforming player with higher OPPO.
  • Seeing who is getting the best opportunities on a team: A WR corps may have multiple similar player types, but you can prioritize them by seeing who is getting the most OPPO. The same is true for committee backfields; if touches are split evenly, choose the RB who gets the more valuable (higher OPPO) touches.
  • Lineup setting: OPPO is position agnostic and can be used as a direct comparison tool for Flex spots. A WR may only see a few targets, but still have more OPPO than a RB with a lot of low-value rushes. This can also help when choosing within position groups as well; if two WRs have similar results, start the one with higher OPPO on the season.

With more data available than ever before, it only makes sense to use it to better inform our decision-making process. OPPO uses that extra information to provide additional context to a player’s results, measuring the inherent value of the opportunities they receive.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.