Please enable javascript in your browser to view this site!


Our application user guides are intendended to help you a) use our applications more efficiently and b) understand their underlying methodology. Use the menu to the left to navigate to each application page. Use the menu to the right to navigate to each application's user guide in this page.


The motivation behind this app is to create a dynamic interface for comparing the historical fantasy production of NBA players. We've tried to make it as customizable as possible, allowing for specification of DFS site scoring format, specific fantasy stat isolation, per-game total or per-minute comparison, and discrete quantile inclusion. As part of our commitment to data transparency, you can also download the raw data that produces the output, allowing you to explore nuances and game conditions that aren't displayed in the graphical output.

NBA_player distributions-09.jpg
  1. Player input: Select players to compare in the output. You can view one or more players, having an empty player box will produce an error in the output section. You can select players by either clicking the box and scrolling down to the desired player or by beginning to type the player's name and then clicking the desired player when their name appears in the dropdown.

  2. Site input: Select site scoring scheme to compare players over. DraftKings or FanDuel only, can't select multiple.

  3. Fantasy stats input: In this input, you can select the fantasy-generating counting statistics that you want to consider when comparing players. While comparing players' total fantasy production is probably simplest method of player comparison, you have the flexibility to compare fantasy distributions of specific fantasy statistics. The app opens with all fantasy statistics selected; you can de-select certain statistics by clicking the statistic and pressing the backspace or delete key. For statistics like "3P" (three-point field goals made) or "Double-Double" or "Triple-Double" which don't have any value in FanDuel scoring, it is ok to leave these statistics in the input, they are counted as 0 when "FD" is selected in the site input.

  4. Game total or per minute input: The app is defaulted to compare players' scoring distributions as game totals ("Total"). This is a good way to compare players' who each have had pretty consistent roles over the course of the season. But for players who have had variable roles (and minutes) over the course of the season, it might make sense to compare players' per-minute fantasy production. You can do this by selecting the "Per Minute" option.

  5. Show quantiles input: This input allows you to control whether or not the distribution output also includes the scoring quantiles of the selected players that are indicated by the vertical lines and numbers in feature (7). We think these are import metrics to consider, but as more players are compared, the output can become increasingly crowded.

  6. Raw data download button: Clicking this button downloads a .csv file called "ASA Player Distribution Data.csv"; this file can be opened in Microsoft Excel. The file contains extra columns that aren't featured in the app, but might be of interest to DFS players trying to gain an edge based on further game considerations like spread, over/under, opponent, or home/away. The data only contains rows (each row represents a single player's box score line for a single game) for players that are selected in input (1).

  7. Scoring quantiles: One feature that we're really excited about in this updated distribution comparison app is the inclusion of discrete player fantasy performance quantiles. Even with continuous distributions, it can be hard to tell a player's median scoring expectancy or ceiling or floor. When "Yes" is selected in input (5), the output will also show players' 5th, 10th, 25th, 50th (median), 75th, 90th, and 95th percentile fantasy scores from the current season. The numbers that appear on the x-axis are rounded scores. To aid with quantile discrepancy, the solid vertical line represent median production, the long dashed lines represent 25th and 75th percentile production, the dash-and-dotted lines represent 10th and 90th percentile production, and the dotted lines represent 5th and 95th percentile production levels.

  8. Player color legend: Refer to this legend for distinguishing multiple players' distributions and quantile production levels.


Responding to breaking news about inactive players is crucial to NBA DFS strategy. Figuring out the role changes and beneficiaries of inactives is one of the best ways to unlock value at low- and mid-price levels. While the primary beneficiaries are often the inactive players' backups who are thrust into a starting role, sometimes the value of these role changes can be murky, as ball-handling duties shift, and opposing defenses adjust their defensive focus. We wanted to create an app that objectively explores the re-distribution of fantasy production vacated players who are ruled out on any given night.

NBA_Inactive Pivot-10.jpg
  1. Team input: Select team for inactive response evaluation. You can do so by selecting the desired team from the dropdown menu or by typing the desired team's abbreviation and selecting from the dropdown menu.

  2. Player input: Once the desired team is selected, the player input box will populate with players from that team. Select the inactive player(s) you would like to pivot off of; you can select a single or multiple players. When multiple players are selected, the "w/o Inactive" columns will show stats when both players are inactive, not when either player is inactive.

  3. Site input: Select site scoring scheme to compare players over. DraftKings or FanDuel only, can't select multiple.

  4. Columns input: In this input, you can define the statistics that you would like to compare for active players. For each column selected, the output will show a column of active players' fantasy production when the player(s) specified in (2) are active and when they are inactive. The columns "UsgM" and "TSA" are not fantasy counting stats, they are measures of players' offensive usage. "UsgM" is "usage minutes", it is the product of a player's minutes played and their usage rate (which is the percentage of on-court possessions a player takes a shot or records a turnover or assist); "TSA" is "true shots attempted", it is a weighted combination of two-pointers, three-pointers, and free throws a player takes; "Offensive" columns are fantasy points derived from points, three-pointers (DK only), assists, and turnovers; "Defensive" columns are fantasy points derived from blocks, steals, and rebounds; neither "Offensive" nor "Defensive" include the DK double-double or triple-double bonuses. The columns input is defaulted to "Total" fantasy points and games played with and without the player(s) selected in (2).

  5. Comparison type input: In the output, after the columns defined in (4) are displayed, the app calculates and creates column(s) of the difference in active player production and/or usage with and without the player(s) specified in (2). You can view this difference in one of two ways. The default is to view this difference as the raw difference ("Diff."). However, when comparing relative benefit for players of significantly different price points, it might be more informative to compare players marginal production relative to their to their initial production. By selecting "% Diff", these difference columns will display active players production as a percent increase or decrease relative to their production level when player(s) in input (2) are active.

  6. Raw data download button: Clicking this button downloads a .csv file called "ASA Inactive Responder.csv"; this file can be opened in Microsoft Excel. The file contains box score data and game information for all players and games of the team specified in input (2). An additional "Active/Inactive" column shows whether or not the specified players were active or inactive for the game defined in each row.

  7. Columns output: These are the columns that are defined in input (4). The first column in each set is the per-game average (quantity for "Games") of the statistic when the player(s) identified in input (2) are active, the second column when inactive.

  8. Difference column output: Based on difference type specified in input (5), this column displays the difference in fantasy production and/or usage when specified players are active and inactive. In the example above, note the blue arrow next to the column name; every column is sortable, allowing you to find the player with the largest difference in fantasy production or usage when specified players are inactive.


Knowing the rank of opponents versus position as presented by DraftKings or FanDuel is simply not enough information. How much worse is the 30th ranked defense against point guards than the 29th ranked defense? How should we discount defenses that play in a division or conference of positional strength, are they really that bad, or do they just play a lot of really good small forwards? Just because FanDuel considers James Harden a shooting guard, should his production while playing point guard be counted against his opponents' defense against the shooting guard position? Our Opponent vs. Position app aims to add additional information to the ranks that are so blindly relied upon in the DraftKings and FanDuel lobbies.

NBA_Opponent vs Position-17.jpg
  1. Site input: Select site scoring scheme to compare players over. DraftKings or FanDuel only, can't select multiple.

  2. OVP type input: This is the difference maker in our app. We have data on the percentage of minutes played by each player at each position and use this to inform our analysis of opponents versus positions. Selecting the "raw opponent vs. position" (rOVP) produces a table of the average fantasy points allowed by a team to each position, with consideration for players' minutes proportion at each position. For example, Russell Westbrook logs about half his minutes as the Thunder point guard, half as the shooting guard, ceding point guard duties to Dennis Schroder. Thus, half of his fantasy points scored against an opponent count towards points allowed to point guards, half to points allowed to shooting guards. This is an improvement over the discrete "rank vs. position" that you'll see in draft lobbies, but we still feel falls short of optimal information. The defaulted input is “true opponent vs. position” (tOVP), which is a +/- metric we have created that better captures teams’ ability to prevent players at each position from generating their expected value fantasy production.  The equation for tOVP is as follows, it is calculated per position and per game: Sum(game fantasy points_i * position%_j) - Sum(game minutes_i * avg fantasy points per minute_i * position%_j); where i = {all players} and j = {all positions}.  If the math doesn’t quite make sense, on the left side of the subtraction, we calculate how many fantasy points are scored in a game from each position, making the assumption described above, that a player who plays x% at position A and y% at position B splits their fantasy total accordingly; this is the equation used to calculate rOVP.  On the right side of the subtraction, we calculate how many fantasy points are expected at each position if every player scores their season per-minute average in the minutes they played at each position, again, assuming that players split their minutes according to their season position proportions.  We feel that the right side of the tOVP formula controls for a necessary piece of information that is lost in raw opponent vs. position calculations.  That is, how to we discount or inflate metrics based on a team’s baseline positional talent or efficiency (this is the average fantasy points per minute component) and the volume that that talent plays in a specific games (the minutes component).  If the Warriors-Nuggets game goes into double overtime and Kevin Durant plays 42 minutes, it seems like the Nuggets should be given a discount in terms of their allowance of fantasy points to small forward, because KD (a very good player) played with an unusually high volume.  Conversely, if the KD was inactive and Alfonzo McKinnie put up a KD-like 40-fantasy-point performance, it seems like the Nuggets should be penalized for allowing a less skilled player to put up huge numbers.  This is the thought process behind our tOVP calculation.  Keep in mind that tOVP is a +/- metric for an entire positional unit.  So in a Phoenix-Minnesota matchup, where Phoenix has a Center DKP tOVP close to +5, it would be foolish to inflate Karl-Anthony Towns' expectation by +5.  Rather, we expect Timberwolves centers to score culmulatively five more DKP than their average.  So if we expect KAT to play 34 minutes (of a possible 48, assuming MIN runs single-center lineups), we can multiply through 4.67*34/48 to give KAT a +3.37 DKP expectation.  There are some dangers to using this calculation religiously, as there might be other factors that affect how we project a player on any given night, this should be seen as an “all else equal” level-setting metric.

  3. Positions input: Select the positions you want to view opponent vs. position for.  Keep in mind that these are positions as defined by our proportional position data.  So even though FanDuel considers Russell Westbrook a point guard (he actually plays about half his minutes at shooting guard), the effect an opposing defense will have on him should fall between their tOVP for point guard and shooting guard.

  4. Teams input: This input is defaulted to show the teams that are playing each night. You can add specific teams by adding them to the input, or if you want to view all teams, you can add "All" to the input.

  5. Players input: This input is used control the players shown in the "Player Positions" tab, see (7). This tab contains the percentage breakout of each player at each position. The default input is blank, which will show all players.

  6. OVP data download button: Clicking this button downloads a .csv file called "ASA NBA OVP.csv"; this file can be opened in Microsoft Excel. The file contains the same data available through the app, but all columns based on possible combinations of site input (1) and OVP type input (2).  If you have your own projection models this file could prove a useful input into such models.

  7. OVP and Player Positions tabs: Use these tabs to toggle back an forth between OVP nd player position breakout tables.

  8. OVP columns output: These are the columns that are defined by inputs (1-3).  In the example above, note the blue arrow in the “PG DKP tOVP” column; every column is sortable, allowing you to easily find the best and worst teams against each position.

  9. Position breakout columns: These columns show the proportion of playing time each player plays at each of the five positions. This proportion can sometimes be different from DraftKings/FanDuel position designation.


The concept for the heat check app is simple: we wanted to produce an app that would help users identify which players are seeing the biggest spike in fantasy production in recent games. Some players that are seeing boosts in minutes, usage, and/or fantasy production, perhaps due to injuries or trades are well known. However, some players manage to slip under the radar of the public and DraftKings and FanDuel pricing schemes. Furthermore, that task of developing an ordered hierarchy of players who have been the hottest in the last week can be overwhelming. Enter the Heat Check App.

NBA_Heat check-13.jpg
  1. Site input: Select site scoring scheme to compare players over. DraftKings or FanDuel only, can't select multiple.

  2. "Heat Window" input: Select how many days back you want to consider as players' recent performance. The app aggregates per game averages of minutes, usage, true shot attempts, and fantasy points for "recent" games and compares that to per game average for games that aren't considered "recent". With this input, the user can define the window for which games are considered recent. The most appropriate window will vary from player to player and situation to situation. Some statistic increases happen suddenly and with much public attention, such that site pricing responds appropriately and quickly. To target these players before their pricing reaches efficiency, a shorter Heat Window might be warranted. However, there is an inherent tradeoff with this approach, as statistic reporting will be more sensitive to small sample sizes. However this is an unavoidable tradeoff in DFS trend recognition, balancing early recognition with small sample overreaction.

  3. Statistic columns input: In this input, you can select the statistics which margins you want to compare. The input is defaulted to compare marginal increase/decrease in minutes per game, usage per game, and fantasy points per game (either DK or FD as specified in (1)) as well as sample size variables like the number of games and overtimes each player has played in in recent and earlier games. You can also compare per game differences in true shot attempts ("TSA/Game"), which is an aggregation of 2-point and 3-point field goals and free throws, with appropriate weighting for the expected value each shot attempt provides.

  4. Teams input: This input is defaulted to show the teams that are playing each night. You can add specific teams by adding them to the input, or if you want to view all teams, you can add "All" to the input.

  5. Raw data download button: Clicking this button downloads a .csv file called "ASA Heat Check Data.csv"; this file can be opened in Microsoft Excel. The file contains our full NBA dataset, with an extra columns called "Heat Window", and values of either TRUE or FALSE, a logical variable of whether or not the specified row is in the "heat window" of recent games. This file could be useful when further examining the factors that might have contributed to certain players' statistical increases or decreases in recent games.

  6. Sample size columns: The "Games" and "OTs" columns provide context about the sample size of the specified heat window. In each column, the number to the left of the slash represents the number of games/overtimes the player has played in prior to the specified heat window and to the right of the slash the number of games/overtimes the player has played in within the recent heat window.

  7. Marginal per-game statistic columns: These columns are the information that should help users determine which players are hot and which players are cold. The numbers in each column represent the per-game difference in the specified statistic for recent games in the heat window and earlier games prior to the heat window. A positive value represents an increased per-game average in the heat window than in games prior. These columns can be sorted in increasing or decreasing order.


We've focused so much of our content to date on around roster construction. While this concept is at the core of DFS strategy, the experienced DFS player knows that the game selection and bankroll management is just as important. Our ROI & Game Selection App was created to help you track your ROI to aid in bankroll management and provide an analysis of which contests your playing most profitably. IMPORTANT: Your .csv uploads will remain private, they won't be saved to the app in any way.

  1. Site input: Select site scoring scheme to compare players over. DraftKings or FanDuel only, can't select multiple.

  2. Contest history uploader: Upload your DraftKings or FanDuel contest history .csv file. The app is very particular in terms of the .csv file that it reads in; you must not edit your playing history file, simply download directly from DraftKings or FanDuel, and upload the downloaded .csv file.

  3. Sports input: Select the sports that you would like to filter on. If there are any selected sports that aren't in your contest history, these sports will be omitted in the outputs.

  4. Rolling window input: The rolling window tabs (9-10) will show a rolling average of your ROI. In this input, set the size of the rolling average window. The default is set to 30 days, showing at each date your ROI over roughly the past month.

  5. Contest cuts input: This input allows you to select the cuts for which you can view your ROI. This input is defaulted to show cuts by contest size (H2H, 3-10, 11-100, 101-1000, and 1001+ opponents), contest entry fee ($0-5, $5-10, $11-100, $101-1000, and $1001+), contest type (cash games and GPPs), contest days (weekdays and weekends), and a custom filter (6).

  6. Custom contest filter: This input allows you to create a custom filter. Type in a word that appears in the contest title that you want to filter on, and the Contest Cut ROI tab (11) will display your ROI for contests which names contain the filter input and for contests which names donnot contain the filter input. For example, if you were curious to know you ROI in single-game "showdown" contests, you could type "Showdown" in this input and view your ROI for "Custom Filter: Showdown" and "Custom Filter: Not Showdown". Keep in mind that this filter is case-, spelling-, and punctuation-sensitive.

  7. Total ROI line graph: Output showing your total, to-date ROI and net winnings over time.

  8. By-Sport ROI line graph: Output showing your by-sport, to-date ROI and net winnings over time.

  9. Total Rolling ROI line graph: Output showing your total, n-day rolling ROI and net winnings over time.

  10. By-Sport Rolling ROI line graph: Output showing your by-sport, n-day rolling ROI and net winnings over time.

  11. Contest Cuts ROI bar graph: Output showing your ROI and net winnings by specified contest cuts.

  12. H2H Opponents table: Table showing your H2H performance vs. all your historical opponents. This tool can be useful when trying to avoid contests against skilled players and enter contests against weaker players.



1.   Seasons Input: Select which seasons of data you would like to download. You can select a single season, or a range of seasons using the numeric slider.

2. Data Download Button: Press this button to download the data that you have specified in (1), the csv is a combination of general box score and fantasy columns and more advanced box score metrics.