Getting Ready for NFL: Developing the Optimizer
Preseason Week 2
We’re a mere three weeks away from Opening Kickoff to the 2021 NFL season. As we ramp up for the new season, we’re going back to our NFL optimizer code to see where we can add feature enhancements for the 2021 season. Since the start of last NFL season, we’ve revamped our NBA & MLB optimizers, and even built out a new NHL optimizer. As such, we wanted to put a fresh set of eyes on what would be possible for this season. In this article we’ll highlight the many optimizer features that are available (as of now). Click the link below to access the alpha version of our optimizer if you would like to follow along.
* Note: We have not made any manual edits to the current projections (or model input variables), and thus are very crude. If you are experiencing any bugs with the tool, or have feature recommendations you’d like to see implemented, please reach out to us through Twitter or email. As of now we have multi-game functionality built, we’re working on building functionality (and specific features) for single-game contests.
In the Slate Settings tab you can select the slate you want to build lineups for - currently the app supports DraftKings & FanDuel main slates, we’ll add in the other slates as they become available & we build out the optimization logic they require.
The Projections tab is your one-stop shop for positional projections. These are our base projections (again, we have yet to get into the weeds fine-tuning Week 1 projections), but we want to create a framework that allows you to edit and customize projections. To do this, you can download the projection set to a .csv (using the Download button) , and re-upload the your edits using the Browse… button. Once you select your edited set, the updates you’ve made in your .csv will populate in the projection tab.
For tournament purposes, one step in the lineup construction process should be identifying potentially high-value stacks as opposed to just high-value individuals. We wanted to create a feature that does some of this simple arithmetic for you.
The Lineup Stacks tab aggregates projections by team (and opponent) to give you a sense of which stacks project to have the most value. You have some degree of control over how you identify “stacks”, and how they are aggregated. The default is to build stacks for each team consisting of the QB + the two highest-projected (raw) WR/TEs + the highest-projected (raw) WR/TE from the opposing team. But the app does give you a few options for modifying this build - perhaps you are looking for the highest-value single stack with no bring back, perhaps you want to consider specific running backs as stack options. All of this can be done with the Stack Size, Bring Back Stack Size, and Stackable RBs inputs. Notice how the Green Bay stack at the bottom considers opposing RB Alvin Kamara as the highest raw bring back on the New Orleans side. The Prioritize By input allows you to select how you want to “rank” stacking options. The default is to rank players by raw value. If you allowed D’Andre Swift to be a stackable RB, he is the highest raw projected stack option for Detroit, and would be the player that appears in sorted single stacks. However, Breshad Perriman projects as a better value and therefore would be the selected stacking option if prioritization were set to Value Projection.
We’ve really tried to build out the Groups & Rules functionality of our optimizer - when building by hand we can easily make mental note to implement and follow a certain set of rules, but when building lineups at scale (where using optimizers can be valuable), we often have to be deliberate in setting rules that coerce our lineups to look a certain way. There are a bunch of different features, some of which are self-explanatory, so I’ll try to review some that might generate more questions than others.
Optimize - The default is to optimize towards projected fantasy points, but users can select to optimize towards other metrics like floor, ceiling, ownership, or leverage.
Differentiators - This feature is sometimes referred to as “uniques”, it represents the number of players lineups must differ by. The default is to output lineups that differ by one or more players (setting this to zero would result in 20 duplicates of the same lineup). Increasing the number of differentiators will promote more diversity in your lineups.
Max Exposure - This caps the number of times players at each position can appear in your optimal set. The default is to allow 100% exposure, if a player is a great value they’ll appear in every lineup. By capping this at a certain level, you’ll promote some degree of diversification in you optimal’s player selection.
Bounce - Another diversification feature. Each time a player is selected in an optimal, their projection (for subsequent builds) will be reduced by the selected amount. If a “bounced” player is not featured in a subsequent lineup, their projection will be regenerated by half of the delta between their current “bounced” projection and their full projection. So if WR Bounce is set at 20% and WR X is featured in 5 lineups (in order) to the tune of IN, OUT, OUT, IN, OUT, their projection for each build would be 100%, 80%, 90%, 95%, 76% (previous 95% times 80% due to bounce).
Randomness - Yet another way to encourage lineup diversification. For lineup build, players’ projection is randomly sampled from a normal distribution centered around their base projection, with a standard deviation of X% of their base projection. So if WR Randomness is set to 20%, and Davante Adams has a 25 point projection, each lineup build will consider Adams’ projection as a random number sample from a normal distribution with mean = 25, standard deviation = 5. For statistics nerds, that would mean that there is a 68% chance that Adams’ projection (for an individual lineup run) would be between 20 and 30 fantasy points.
Lineup Stacking (tab) - This tab will allow you full control over your lineup stacks. You can select how many players you want to stack, what positions you want to consider, and what teams you want to cycle through. The Excluding/Including tab allows you to add & remove players from the pool of possible stack options who might or might not be included in the pool based on positional parameters. If you want to make exceptions for Alvin Kamara, Austin Ekeler, and D’Andre Swift as possible RBs who could be stacked with their QB (or as a bring back candidate) while preventing other RBs from being part of stacks, you can do that. If you want to allow stacks with TEs but want to prevent secondary TEs like Harrison Bryant or Mo-Allie Cox from being a part of stacks you can do that.
Conditions (tab) - The Groups & Teams rules should be pretty self explanatory. The Conditions tab allows you to create more nuanced rules that might guide how your lineups are built. You can set rules that read more or less as “if lineups contain player X, make sure that lineups have no more/no less than N number of players from the group consisting of players A, B, and C”. For example, if you wanted to only play Emmanuel Sanders in lineups that have Josh Allen, and never play Sanders as a one-off play around some other quarterback, you could set a line to Doesn’t contain / Josh Allen / <= 0 / Emmanuel Sanders. If you want to always roster James Robinson with a Houston pass-catcher you could set something like Contains / James Robinson / >= / Brandin Cooks, Chris Conley, Keke Coutee, Jordan Akins.
Keep in mind that these rules settings can be use in combination with one another. If you’re open to stacking Jameis Winston with Kamara or Murray buy never want it to be Kamara and Murray, you can configure this using the Lineup Stacking & Groups subtabs. We also plan to roll out some more rules features specifically for single-game contests. Since these types of contests are positionless, lineup parameters should be less structured around specific positions, and more around roster positions (Captain vs. Flex).
If you have any questions about specific features - their use case, why a specific set isn’t working, or other features you’d like to see added, please reach out to us and we will be happy to respond and assist. Code often has bugs, we hope to have this tool bulletproof ahead of Thursday Night Kickoff so any bug callouts are much appreciated.