NBA DFS Correlation: 3 Seasons, 500,000 Pairs

In the last post I argued that basketball gives an optimizer nothing to stack, because no rule of the sport links two players’ scores the way a batting order or a quarterback does. That was reasoning, not evidence. So I pulled three seasons of box scores and actually measured NBA DFS correlation — 62,681 player-games, 3,690 games, and 505,721 pairs of players who shared a floor.

The short version: the structural argument holds, the numbers are far smaller than most stacking advice implies, and the most interesting thing in the data is something I had predicted backwards.

Line chart of NBA teammate and opponent DraftKings score correlation crossing as the final margin widens

How it was measured

Data is the public NBA stats API, via the nba_api package — regular season, 2023-24 through 2025-26, one call per season. I kept every player-game of at least 12 minutes from any player with at least 20 such games, scored each one with DraftKings rules, and then standardized each player against his own average so that a star and a bench guard contribute on the same scale.

Scoring has to be applied game by game, never to an average. DraftKings pays a double-double bonus and a triple-double bonus, and those are step functions. A player projected for 9.4 rebounds does not earn three-quarters of a bonus; he has a probability of earning all of it. Averaging first quietly destroys exactly the tail behavior you are trying to study.

The last choice is the one that matters most. I did not compute a correlation per pair of players over time. Two opposing teams meet about four times in a season, so any threshold high enough to make a per-pair correlation stable is also high enough to exclude every genuine opponent pair. Instead each co-occurrence is one observation and they are pooled — which gives roughly 267,000 opponent observations instead of none.

The first version was wrong

I am including this because it nearly published as a finding. My first pass labeled each pair as teammates or opponents using the first team ID it saw for each player. Across three seasons, 319 of 752 players changed teams. Every single pair the script reported as “opposing teams” was in fact a teammate pair — teammates in 93% of their shared games — and the true opponent count was zero.

The tell was mundane: the opponent group had a median of 42 shared games, and opposing teams cannot meet 42 times. The general lesson is worth more than the bug. When a filter selects a different population for each of the two groups you are comparing, the comparison is void, and group means will happily report a confident number anyway.

What the corrected numbers say

Correlation of DraftKings scores, pooled, split by how lopsided the game ended up:

Final marginTeammatesOpponents
Close (8 points or fewer)−0.001+0.021
Middling (9–14)+0.017+0.017
Blowout (15 or more)+0.074−0.009

Both columns move steadily with the margin and they cross. In close games teammates are uncorrelated and it is the opponents who drift together — the pace effect, where a fast, tight game feeds everyone on the floor. In a blowout that reverses completely: teammates move as a block and opposing players start pulling apart.

Breaking the blowout column down by role explains why. Two starters on the same team correlate at +0.099 in a blowout; two bench players on the same team, +0.101; a starter paired with his own bench, only +0.035. That is a minutes regime, not a scoring one. When a game gets away, the whole starting unit sits down together and the whole second unit goes in together, so players of like role rise and fall as a group.

And in close games the only negative number in the entire study appears exactly where you would expect a substitution effect: a starter and his own backup, −0.028. When the game is tight, those two are genuinely trading the same minutes.

The rebound result

The cleanest confirmed mechanism is the one I was most confident about. Correlating rebounds only, between players in the top third of the league by rebounds per 36 minutes:

PairRebound correlation
Two big men, same team−0.012
Two big men, opposing teams+0.022
Same-team pair, not both bigs+0.005

A swing of 0.034 produced by nothing except whether the two men share a jersey. That is the shared pool argument holding up: misses are a common resource, so two rebounders on opposite sides both feed on a bad shooting night, while two on the same side eat each other’s share.

The number that actually matters

Nothing in this study exceeds 0.10. Quarterback-to-receiver correlation in football runs somewhere around 0.3 to 0.6 depending on how it is measured. NBA pair correlation is roughly an order of magnitude weaker than the thing stacking was invented for.

That cuts both ways, and I want to be honest about the second half. It confirms the argument from the previous post: there is nothing here for a hard stacking constraint to bite on, and a rules file full of confident basketball stacks would be encoding noise. But it also caps what any correlation-aware model buys you in this sport. If you were expecting a covariance matrix to unlock NBA the way stacking unlocks football, it will not.

What is left is the regime itself. The interesting quantity is not any individual pair, it is the game script — and a lineup built for a tight game and a lineup built for a blowout want opposite shapes.

Where I was wrong

I predicted that in a blowout a starter and his own bench would be strongly negatively correlated, on the reasoning that one loses minutes exactly as the other gains them. It is +0.035, positive, and the substitution effect I was describing shows up in close games instead.

The mistake was conflating level with correlation. Blowouts really do cut a starter’s ceiling — that part was right — but cutting everyone’s minutes on the same bench at the same time is a shared shock, and shared shocks are positive correlation. Two true statements, and I ran them together into a false one.

So I checked whether you can see it coming

Everything above splits games by their final margin, which you only know when the game is over. Lineups lock before tip-off. So as it stands this is a description of what happened, not a strategy — the honest claim is “blowouts have a different correlation structure,” not “bet on blowouts.”

The actionable version re-runs the identical split against the pre-game point spread instead of the realized margin. So I did that, on 2,999 of the same games matched to a public odds dataset. Same players, same scoring, same pooled method — only the thing I sort games by changes.

It does not survive. Sorting by realized margin, on exactly these games, still gives the crossing: teammates −0.004 in close games and +0.066 in blowouts, opponents +0.023 falling to −0.020. Sorting the same games by the spread instead:

Pre-game spreadTeammatesOpponents
Pick’em (2.5 or less)+0.037+0.003
4.5 to 8.5+0.025+0.012
Big favorite (11+)+0.029+0.023

Flat. No crossing, no trend, nothing to trade on. A pick’em game and a double-digit mismatch produce the same correlation structure.

The reason is simple once you look at it. The spread is a weak predictor of how lopsided a basketball game ends up: across those 2,999 games it explains about 4% of the variance in the final margin. Games that closed as a pick’em still ended in a blowout 31% of the time. Games with an eleven-point favorite were blowouts 45% of the time. That is a real difference and it is nowhere near sharp enough to sort games into regimes — more than half of the big mismatches stayed competitive, and nearly a third of the coin-flips did not.

So blowouts in the NBA are mostly variance, not predictable mismatch. The correlation regime is real, it is large by the standards of this sport, and you cannot know before lock which one you are buying into. The honest conclusion is the boring one: this is a description of what happened, not a strategy.

One caveat on the caveat. The odds I used come from a free community dataset, and it is not documented whether its spreads are closing lines or earlier ones. A closing line is sharper. But it would have to be dramatically sharper to turn a flat table into a crossing one, and sportsbook spreads are already close to the best available forecast of a game’s margin — the limit here looks like basketball, not the data. I would spend money on a proper closing-line dataset to overturn this; I would not spend it to confirm it.

The code that produced all of this is a single script, and the whole run takes a few minutes on a laptop once the seasons are cached. It is the same posture as measuring the solvers instead of arguing about them — and as with that one, the measurement contradicted something I believed. If you want the tools this is feeding, the free NFL optimizer and the baseball one are both live; the basketball version will not ship until I know what belongs in it.

Tradeline Supply
Things that I use, like, and am affiliated with:
Mint Mobile offers great cell phone service for $15 flat, get $15 off using the link. Get discounted phones with service activation and no contract.
I never spend money before I check Mr Rebates or Rakuten to get cashbacks, rebates, discounts, coupons or cheaper gift cards.

Leave a Reply