Basketball Projection Tool Guide
The overall philosophy behind the Custom Projection Tool is to give daily fantasy players the ability to blend up-to-the-minute news and intuition with historical data to generate the best possibly lineup. On one hand it’s easy to let various biases creep in if you’re simply building lineups based on intuition and ignoring any historical data. But if you rely solely on a model based on historical data to select your lineup you’re missing major value opportunities based on injuries or lineup changes on a given night. The Custom Projection Tool is built upon historical data for the current NBA season, but gives you the ability to put your own touch on the numbers based on your knowledge of the daily fantasy landscape.
There are 2 major functions performed by the tool:
1. Generate a projection for every possible fantasy player using a blend of historical data and the adjustments that you apply
2. Run the projections through an optimization “Solver” model to find the lineup that is projected to score the highest number of points that stays within all of the roster parameters (total salary, positional requirements, etc) of each fantasy site.
Here’s an overview of the different components of the tool and how you can use to it generate optimal lineups
Here you’ll see the player pool just as you would on the FanDuel or DraftKings site with all available players to choose from on a given night. You’ll see all of the various factors associated with the game and each player like the Vegas lines, injury status, game location, and days of rest. For a detailed explanation of all of the available data see the end of this guide. I want to focus on workflow before we get into the details of the math behind the adjustments.
Fantasy Site Setting
In the top left corner there is a setting for Fantasy Site. Currently we support FanDuel and DraftKings, but support for other, smaller fantasy sites will be coming soon. The tool will only allow you to create lineups for one site at a time so be sure to set the fantasy site first so all of the scoring settings are specific to the site you’re building a lineup for.
Today’s Games Refresh
After you have your fantasy site set you’ll want to move to the Today’s Games Refresh tab to get everything up to date for today’s games. Simply click the Refresh Data button and Excel will connect to the websites and API’s that store the player pool data on FanDuel and DraftKings, injury information from Rotoworld, betting and schedule data from www.sportsdatabase.com, expected starting lineups from Rotowire. This will typically take about 20-50 seconds depending on your computer and version of Excel. You must be connected to the internet for the refresh to run, and there are instructions throughout the sheet (and in the Troubleshooting Tips tab) on what to do if you run into an error during refresh
You can also use the controls on this page to exclude certain games or teams from your player pool. Next to each game there is a 1 (by default) in the green “Use for Optimal Lineup” column. If you’re playing in a late-only contest or something other than the standard contest you can exclude games that are not part of your contest by changing that value to a 0. It will essentially zero out projections for every player in those games. You can also exclude certain teams (if you think a team has a really bad matchup and don’t want to include anyone from that team in your lineup) by adding the team abbreviation to the “Exclude Individual Teams” column. So if you don’t want the Pacers included you would add IND to that column. Check the Projections tab if you’re unsure of a team abbreviation.
Once you’ve configured your projection settings and refreshed all the data you’re ready to see what the optimal lineup looks like. Navigate to the optimal lineup tab for the site you’re building a lineup for and hit the “Find Optimal Lineup” button. You shouldn’t need to make any other changes on this tab. All of the values in the columns to the left are used by the Solver plugin to generate the lineup so changing them manually will only cause problems.
If you run into an error on this tab please see the Troubleshooting Tips tab for instructions.
The spreadsheet will take 10-30 seconds to process the optimal lineup and you’ll get a pop-up saying that it found a solution. Hit OK and then you’ll see your optimal lineup for the night based on all of the projections you created back on the Projections tab. You’ll see the total projection for your lineup, and the algorithm is set to provide the highest possible projected points. *Technical Note* – there is a chance the solution is not the absolute highest projected points based on the projections provided. A linear solving method is used and it gets to the maximum in a reasonable amount of time. Much more powerful computing tools can run through millions of possible lineup iterations and find the absolute highest, but our Excel will find the best lineup it can (which is often truly the best and when it’s not it’s only 1-2 projected points away). Also, the 4 player per team limit on FanDuel is not built into the Optimal Lineup. It slows the process down considerably to have to check through every single team so if you get a lineup with more than 4 players you can simply exclude the player with the lowest value in the next section.
Now you can start to think about making changes to your lineup if the algorithm gives you players that you’re not very confident in or you’re not happy with your lineup. To do that – move over to the Player Adjustments tab.
This is where you can start to factor your own research and hunches into the tool. If you’re using season average stats or anything longer than the last 5 games as your base projection (more on how to set that below) you’ll probably want to add minutes adjustments for players that will see a different level of playing time on this given night than they normally do. In the example above, if you know that J.R. Smith and Carmelo Anthony are out of the Knicks lineup for tonight you might want to adjust Tim Hardaway Jr.’s minutes up. When you add his name to the “Players with Minutes Adjustments” section you’ll see his average minutes appear. In the New Minutes column you would enter the expected minutes for tonight. There’s not really an exact science to this because coaches change their rotations all of the time, but I would suggest looking up past games in which a certain starter was out and see who picked up the slack. Rotoworld is always a great source to give you information on situations like this. When you add in the new minutes for a player the tool will add or subtract to the final projection based on (Change in Minutes * Average Fantasy Points per Minute) for each player.
If a player doesn’t show up when you type him in it’s likely that the name is spelled incorrectly. Look back at the Projections tab for the correct spelling.
In this section you can add or subtract value to a player using your own hunches or research. Say you think Stephen Curry is set for a really big game and he’ll definitely outscore his average fantasy points per game in this given matchup. You can manually add 10 points to Curry’s projection (or whatever value you like) to see if that puts him over the edge and into your optimal lineup. You can also subtract points from a player if you think their situation is even worse than the numbers say. Simply add the player’s name and you’ll see their current projection appear in the “New Projection” column. When you enter the value you’d like to add or subtract in the “Manual Fantasy Points Adjustment” column you’ll see that New Projection change.
If you’d like to build your lineup around a core group of players regardless of their projection you can add their names to the “Lineup Guarantee” section. The players listed here will *always* appear in your optimal lineup.
*There are still salary cap and positional constraints that the tool must abide by so if you put the 6 top players into the Lineup Guarantee section it’s not going to allow you to go over the salary cap. Some of those players will simply not get included and a lineup will be created with those top 3-4 players selected in the Lineup Guarantee column.
If there are players that you don’t want in your lineup under any circumstances – add them to this column. It will set their projection to zero and will not be chosen for the optimal lineup.
The injury list and blurbs are coming from Rotoworld and will be refreshed whenever you click the “Refresh Data” button on the Today’s Games Refresh tab. Any player listed here will be marked as Out and their projection will be set to 0. Sometimes a blurb will actually indicate the player will play. Most of those are captured and set correctly within the tool, but some can fall through the cracks based on the text that’s used. Take a look at this list and delete any players that are listed that you know are going to play. Ultimately, you shouldn’t have to do much with it if it’s capturing all of the injuries you would expect.
Depth Chart Adjustments
This is a new feature to the spreadsheet that’s designed to capture a lot of the adjustments based on recent injuries. What you’ll see on this tab are the suggested injury replacements for any player on the injury list and the new minutes they are expected to play. These are automated adjustments so they may not reflect very recent changes in a team’s rotation, and some of them may be so far down on the depth chart already that it won’t matter. However, this is a quick way to see what players might get extra minutes for that night’s games due to injury. If some of these look wrong to you you can simply delete the replacement player from this tab. Anything in blue can be edited. You also have the option of turning this tab on or off completely. If you want to adjust minutes all on your own you can do so on the Player Adjustments tab and turn the Depth Chart Adjustments off on the Projections tab. The value under “Depth Chart Adjustment” is the value that will be added to the Replacement Player’s custom projection based on the new minutes and their average fantasy points per minute.
How To Customize Projections with Adjustments for Betting Totals, Opponent vs. Position, Game Location and More
In the green box for Base Projection in the upper left corner you’ll determine how the base projections are calculated for each player. You’ll notice there are several options for different time periods and ways to summarize the data. The time periods are based on games played for each player so if a player gets injured for two weeks it will go back to the games played before the injury and calculate the last x games played. The preseason projection is based on data from ESPN.com’s preseason fantasy projections.
The way data gets summarized is either by average, floor, or ceiling. The floor is defined as the 10th percentile of fantasy points scored during the time period selected. Conversely, the ceiling is the 90th percentile of fantasy points scored during the time period. The best way to explain the percentile calculation is that 10% of the player’s fantasy scores are below the value for”Floor” and 90% of the scores are below the “Ceiling” value. Average is just as you would expect – the sum of fantasy points scored divided by the number of games played.
You can also combine or blend different time periods and different summation methods. If you’d like the time period to be a blend between the Last 5 games and the season average you would enter 0.5 in both the Season Average and Last 5 Games Average boxes. If you’d like to weight it more towards the Season Average you could use 0.75 under Season and 0.25 under Last 5 Games. The key is that the total in the entire Base Projection box should add up to 1.
More testing needs to be done to see exactly how the different methods perform, but in theory the Ceiling values would be useful for constructing a GPP lineup and the Floor values would provide more consistency for a head-to-head or 50/50 lineup.
The default settings will be loaded each time the spreadsheet gets updated and that is what I would recommend as the best general settings, but it’s up to you to test and customize different settings based on your playing strategy.
The Adjustments section is in the yellow box on the top. You can choose which ones you’d like to use and apply to every player in the “Use?” columns to the right of each adjustment. The Adjustments that I would most recommend using are turned off by default. Using every adjustment is actually counter-productive because several of the adjustments can overlap with each other. For example, the Vegas adjustments should not all be used – either use the Total and Line adjustments together or the Projected Points adjustment on its own. Here’s the math behind each adjustment:
The Vegas Line Adjustment can be applied at the Team or Individual Level depending on the setting in the Method column.
Team – Each team’s average Vegas line from all previous games is calculated and compared to their Vegas line for this particular game. A Vegas Line worse (more of an underdog) than the team’s average Vegas Line will adjust that teams’ players downward. Here’s an example: The Bulls are a 2 point underdog against the Warriors at home, but on average they are a 4 point favorite across all previous games. That’s a 6 point difference on the negative side. Those 6 points would get multiplied by .01 and subtracted from 1 to give a final adjustment value of 0.94. All Bulls players would have their Base Projection by 0.94 if you choose to use this adjustment.
Individual – Using the Individual method of the Vegas line adjustments compares how well each individual player has performed in games with a similar line to that players’ season average fantasy points. So if Derrick Rose is playing for the Bulls against the Warriors and the Bulls are a 2 point underdog the individual Vegas line adjustment is going to compare average fantasy points for Rose in games played with a line between 3.5 and -3.5 to his average across all games. So if he averaged 30 fantasy points in games between 3.5 and -3.5 and 40 fantasy points in all other games his adjustment would be 0.75. Vegas lines are bucketed into the following groups:
-10 and above
-3.5 to -10
3.5 to -3.5
10 to 3.5
10 and above
The Vegas Total Adjustment can be applied at the Team or Individual Level depending on the setting in the Method column.
Team – Each team’s average Vegas total from all previous games is calculated and compared to their Vegas total for this particular game. A Vegas total lower than the team’s average Vegas total will adjust that teams’ players downward. Here’s an example: The Pacers are playing in a game with a total of 202 against the Lakers, but on average Pacers games have had a total of 195. That’s a 7 point difference on the positive side. Those 7 points would get multiplied by .01 and subtracted from 1 to give a final adjustment value of 1.07. All Pacers players would have their Base Projection by 1.07 if you choose to use this adjustment.
Individual – Using the Individual method of the Vegas total adjustments compares how well each individual player has performed in games with a similar line to that players’ season average fantasy points. So if David West is playing for the Pacers with a total of 202 the individual Vegas total adjustment is going to compare average fantasy points for West in games played with a total between 196 and 203 to his average across all games. So if he averaged 40 fantasy points in games between 196 and 203 and 30 fantasy points in all other games his adjustment would be 1.25. Vegas totals are bucketed into the following groups:
192 and under
196 to 192
203 to 196
207 to 203
207 and above
Vegas Projected Points
Vegas Projected Points is calculated using the line and the total to get a projected score for each team. So if the Rockets and Clippers are playing in a game with a 210 total and the Rockets are favored by 4 then the projected points for the Rockets is 107 and the projected score for the Clippers is 103.
The Vegas Projected Points Adjustment can be applied at the Team or Individual Level depending on the setting in the Method column.
Team – Each team’s average Vegas projected points from all previous games is calculated and compared to their Vegas projected points for this particular game. A Vegas projected points lower than the team’s average Vegas projected points will adjust that teams’ players downward. Here’s an example: The Thunder are playing in a game in which their projected points is 100, but on average the Thunder games have projected points of 104. That’s a 4 point difference on the negative side. Those 4 points would get multiplied by .01 and subtracted from 1 to give a final adjustment value of 0.96. All Thunder players would have their Base Projection by 0.96 if you choose to use this adjustment.
Individual – Using the Individual method of the Vegas projected points adjustments compares how well each individual player has performed in games with a similar line to that players’ season average fantasy points. So if Kevin Durant is playing for the Thunder with a projected points of 100 the individual Vegas projected points adjustment is going to compare average fantasy points for Durant in games played with a projected points between 98 and 101 to his average across all games. So if he averaged 40 fantasy points in games between 98 and 101 and 50 fantasy points in all other games his adjustment would be 0.8. Vegas projected points are bucketed into the following groups:
95 and under
98 to 95
101 to 98
104 to 101
104 and above
The Rest Adjustment can be applied at the League or Individual Level depending on the setting in the Method column.
League – The league rest adjustment is very straightforward. I analyzed all individual games from the 2013-2014 season and found that, in aggregate, players score 1.025 points more with at least a day of rest and 0.975 points with no rest. So if a player is in a back-to-back they get their base projection multiplied by 0.975. If they’re playing on at least 1 day of rest they have their projection multiplied by 1.025.
Individual – Similar to the Vegas adjustments, the player’s fantasy points in previous games with the same amount of rest are compared against the player’s average fantasy points in all previous games. So if Blake Griffin averages 44 fantasy points with rest and 40 fantasy points in all other games he would get an adjustment of 1.1 if the current night’s game is on at least one day of rest.
The Site Adjustment can be applied at the League or Individual Level depending on the setting in the Method column.
League – The league site adjustment is very straightforward. I analyzed all individual games from the 2013-2014 season and found that, in aggregate, players score 1.04 points more at home and 0.96 points on the road. So if a player is at home they get their base projection multiplied by 1.04. If they’re playing on the road they have their projection multiplied by 0.96.
Individual – Similar to the Vegas adjustments, the player’s fantasy points in previous games at the same location are compared against the player’s average fantasy points in all previous games. So if James Harden averages 50 fantasy points at home and 45 fantasy points in all other games he would get an adjustment of 1.1 if the current night’s game is a home game.
Many other sites calculate the opponent/position statistic as the raw average points scored against each opponent/position. We calculate things a bit differently because I don’t think it’s fair to compare average points across the league because of the different level of competitions teams face. The way we look at it is each player has their season average fantasy points calculated before each game. If Stephen Curry averages 40 fantasy points and he’s held to 30 fantasy points against the Grizzlies then that shows the Grizzlies are better than average at defending point guards. All of the point guard results against the Grizzlies are aggregated and the total expected fantasy points are compared to the actual total fantasy points. So if point guards against the Grizzlies were “expected” to score 1,000 points in the 50 individual games against the Grizzlies and they actually scored 950 then 950/1000 = 0.95. Going forward, point guards against the Grizzlies would have their base projection multiplied by 0.95.
One enhancement we made to this calculation is that all games in which a player plays more than 10 minutes different than their season average minutes are thrown out of the calculation. That avoids the issue where a player like Russell Westbrook only scored 7 fantasy points against the Clippers because he got hurt in the first quarter doesn’t make the Clippers defense against point guards look incredible because they held Westbrook to 35 points below his average.
This adjustment looks at each individual players past results against the same team. It will only get applied if the player has played in at least 2 previous games against a team in the same season so it’s only relevant for a small percentage of games. The player’s average fantasy points against that team is compared to his average fantasy points against all other teams. So if Chandler Parsons scores 25 points on average in all games but 35 points against the Rockets then his Matchup History Adjustment would be 35/25 = 1.4. His base projection would get multiplied by 1.4 in a future game against the Rockets.
The calculation is explained in the Depth Chart adjustment section above. If this is turned on, the automated depth chart adjustments will be applied.
Last 2 Minutes Adjustment and Last 5 Minutes Adjustment
This adjustment is useful if you’re using a Base Projection of Last 15 games or Season Average. If you’re using a shorter period of time then it’s best to leave this adjustment off. What this does is compares each player’s season average minutes with their average minutes across the last 2 games (or last 5 games). So if Tony Wroten has been playing 20 minutes a game for the season, but across his last 5 he’s averaged 30 minutes per game then his base projection would get multiplied by 30/20 = 1.5. This is helpful to better project players on teams whose rotations have changed significantly due to injury or players moving up or down the depth chart.
The way I calculate Usage Rate is different than the generally accepted formula that you can find on the web. The problem with that formula based on the way I was interested in applying it for fantasy is that it’s calculated per possession played. So if a player only plays 5 possessions in a game and takes a shot attempt on 4 of those 5 possessions their Usage Rate, by the true definition, is going to be incredibly high. To me, that’s not useful as a comparison to someone who’s playing 75% of the game but has a slightly lower per possession rate. I’ve defined Usage Rate as a percentage of FGAs, FTs, and ASTs (with FTs and ASTs weighted less than FGA) each player gets as a % of their teams totals in those categories over time. So for a given team the total Usage Rate should add up to 100%. Now a guy like Russell Westbrook might account for 28% of his team’s stats in those categories and a player like Jeremy Lamb (who might shoot a lot when he’s on the floor so his traditional Usage Rate might be high) only accounts for 1-2%. Now when a player is listed as out due to injury I can sum up the missing Usage and distribute it to the remaining players on the team. Usage gets distributed according to their existing ratio so guys like Westbrook and Durant would pick up the bulk of the Usage if Serge Ibaka was out, but everyone on the Thunder would get bumped up slightly.
Here’s a concrete example of how this gets applied. Kevin Durant is expected to miss tonight’s game. Say he’s averaged 25% of the Thunder’s Usage over the last 2 weeks (the time period I’m using to get the percentage of total Usage each player has accumulated). Now that 25% needs to get distributed to the rest of the Thunder players. I calculate the revised Usage without Durant for each player first. So if Russell Westbook is currently at 28% Usage I would divide 28/(100-25) – that’s total team usage – Durant’s 25% to get 37%. So I expect to give 37% of the missing Usage to Westbrook. I then multiply 37% (percent of missing usage I’m applying to Westbrook) by 28% (Westbrook’s current Usage) to get 10.4%. That’s the percentage by which his expected fantasy points will be increased. So if Westbrook is expected to get 50 fantasy points and you have this adjustment turned on he would be expected to get 55 points with a 10% increase. The Regression Level is still applied so if you have it set to 2 it would divide that adjustment in half and give him a 5% increase.
This is a very important factor that could easily get overlooked. Some of the adjustments can produce some odd results (especially on players with very few games played or low minutes). A big game here or there could really change their adjustment values significantly. The regression level brings all adjustment values closer to 1 by dividing the difference from one in half. So an example would be a Last 5 Minutes Adjustment for Tony Wroten at 1.5 because he’s played 30 minutes per game over his last 5 vs. 20 minutes per game on average for the season. If the regression level is set to 1 this value will stay at 1.5. Each increase of the regression level will divide that number in half and bring it closer to 1. So a regression level of 2 would make Tony Wroten’s adjustment = 1.25 instead of 1.5. Increase the regression to 3 and now it’s 1.12. This is simply a way to reign in some of the adjustments and bring everything a bit closer to average.
The blue box at the top allows you to filter the data by criteria that you select. Here’s how each filter works:
Average Fantasy Points
If you only want to include players in your lineup that have averaged at least 15 fantasy points per game on the season you can enter the value 15 here and all players who have averaged below 15 fantasy points for the season will have their projection set to 0 and you’ll get a lineup made up of players who have all averaged at least 15 fantasy points on the season.
If you only want to include players in your lineup that have averaged at least 20 minutes per game on the season you can enter the value 20 here and all players who have averaged below 20 minutes for the season will have their projection set to 0 and you’ll get a lineup made up of players who have all averaged at least 15 minutes per game on the season.
Fantasy Points Standard Deviation
There are certain players who are very consistent with the number of fantasy points they score from game to game. These players will have a low standard deviation. Other players might bounce around from big games of 45 fantasy points to games of 10 or 12 fantasy points on a regular basis. These players will have a higher standard deviation. You can check the standard deviation of all players on the Season Stats tab of the spreadsheet. Players like Dirk Nowitzki, Klay Thompson, and Kyle Lowry all have fairly low standard deviations of around 8 points. Guys like Anthony Davis. Eric Bledsoe, and Jeff Teague all have higher standard deviations of around 13 points. If you’re looking for a consistent lineup you could set your standard deviation filter to 12 and all of the players with a standard deviation higher than that will be excluded.
If you’re looking to build a lineup that only includes starters you can set this to true. If the official starting lineups are out for the day those will be used. If it’s early in the day then expected starting lineups will be used and any player not expected to start will have his projection set to zero and the optimal lineup will be generated with starters only.
If you’re wary of players making their season debut or players that have only played in a few games on the season and don’t want anyone who hasn’t played at least 5 games on the season to appear in your lineup then you can set this value to 5 and any player who hasn’t played in at least 5 games will be zeroed out.
Played Last 7 Days
If you don’t want to include players coming back from injury in their first game back or players who have been out of the rotation completely for the past few games then you can set the Played Last 7 Days value to Yes. The value cannot be customized beyond 7 days – you either use that filter or not. If you choose to use that filter any player who has not played a game in the last 7 days will have their projection set to 0.
Comment below or send me an email with any additional questions you might have.