NBA DFS Stacking: There Is Nothing to Stack

I have had a baseball lineup optimizer running on this site since June and a football one since August. Pointing the same engine at basketball looked like the easiest job of the three — eight roster slots instead of nine, a $50,000 cap, done before lunch. That part was true. The part that stopped me was NBA DFS stacking, because when I opened a new rules file and went to write the stacking constraints, there was nothing to put in it.

That is not a complaint about missing data. It is a statement about the sport. Baseball and football each hand you a structural link between two players’ scores — something written into the rules of the game itself. Basketball does not have one, and no amount of modeling invents it.

How NHL, NFL, MLB and NBA differ in whether the sport links two players' fantasy scores

A stack is a constraint, not a hunch

In my MLB optimizer, a stack is a hard constraint that forces four hitters from one team into consecutive batting-order spots — 3-4-5-6, not 2-5-7-9. The correlation there is sequential. A single sets up the double that drives him in, and the batting order is a fixed rotation, so “next to each other” is a thing the model can actually point at.

In football it is sharper and simpler. I wrote about how NFL stacking becomes an optimization constraint when I built that version: the rule hangs off the quarterback’s own selection variable, so if the quarterback is in the lineup, at least N of his pass catchers come with him. There is a bring-back rule that pulls in a player from the opposing side of the same game, and an exclusion that stops you rostering a defense against an offense you already own.

Both of those encode one idea: two players whose points come out of the same physical event. A 40-yard touchdown is one throw and it scores twice. Roster both ends of it and you have not diversified anything, which is exactly why it works in a tournament and hurts you in a cash game.

Basketball has one ball

The closest basketball gets to a shared scoring event is the assist. A pass that leads to a basket does score twice — points for the shooter, an assist for the passer. But only some baskets are assisted, the assist is worth a fraction of the field goal, and that is the whole list. There is no second category where one play pays two players.

Worse, the dominant effect inside a team runs the other way. Five players share one possession stream. Over a game a team takes roughly a fixed number of shots, so a teammate taking one is, to a first approximation, me not taking one. Two high-usage players on the same roster are competing for the same finite resource before they are cooperating on anything.

Rebounds are the clearest version. A rebound only exists because somebody missed, so the supply is a pool of missed shots — and that pool is shared with the other team, not owned by yours. Two of my own big men chasing the same misses is the single most obviously self-defeating pair in a basketball lineup, and it is the opposite of a stack.

Nothing in the rules of basketball binds two players’ scoring together. Substitutions are continuous rather than structured, roles shift game to game, and there is no batting order to be adjacent in. That absence is the whole story.

Where the four sports actually sit

Hockey is the purest version of the thing basketball lacks. Forwards skate in fixed lines and power-play units, they are on the ice together by design rather than by coincidence, and a single goal routinely pays a goal plus two assists at once. Line stacking is the oldest idea in hockey daily fantasy for that reason — the league’s own substitution rules build the correlated unit for you.

Football is next: not a fixed unit, but one throw with two scorers attached. Baseball is weaker again — the link is sequential rather than simultaneous, and it needs two or three batters to pay off — but the batting order is still a published, fixed rotation you can write a constraint against.

Basketball is the end of that line. It is the only one of the four where the rules of the sport create no linked scoring unit at all, and where the strongest within-team relationship is competitive rather than cooperative.

The site rules are different too

The other half of porting a sport is the constraint set, and NBA is not a reskin of MLB there either:

DraftKings NBAFanDuel NBADraftKings MLB
Roster8910
SlotsPG, SG, SF, PF, C, G, F, UTIL2 each of PG/SG/SF/PF + C2 P, C, 1B, 2B, 3B, SS, 3 OF
Salary cap$50,000$60,000$50,000
Max per team— (lineup must touch 2 games)4 (and at least 3 teams)5 hitters
Late swapYes, in most contestsNoYes

Two of those matter more than they look. DraftKings NBA has genuine multi-position eligibility plus a UTIL slot, so a player listed PG/SG is legal in four different places — which means the slot-assignment machinery I built for baseball, and the knapsack formulation underneath it, carries straight over and earns its keep. FanDuel NBA has none of that; positions are single-valued and the assignment is nearly one-to-one.

The sharper one is late swap. On DraftKings you can generally still change any player whose game has not tipped off — though DraftKings also runs designated non-late-swap NBA contests where you cannot, so it is a property of the contest rather than of the site. On FanDuel NBA you cannot at all — the whole lineup locks when the first game of the slate starts. An entire feature of the baseball tool simply has no FanDuel equivalent in basketball, and given that late scratches are the biggest single information event in an NBA slate, that is a real asymmetry between the two sites rather than a footnote.

A note on sourcing, because it matters for a table of numbers. The roster sizes, slot structures, salary caps and team limits above match what two independent open-source optimizers encode for each site — pydfs-lineup-optimizer and draftfast — which is two sources agreeing rather than one. The scoring table I have from a single reference, nbastuffer, so treat those values as the weaker line. I have not read DraftKings’ or FanDuel’s own rules pages, because both sites geo-block them outside the United States and I am writing this from Argentina. When the season opens and there is a real salary export to pull, that is what I will check every line of this against — the same order I followed for baseball and football, which caught a DraftKings column change once already.

So what goes in the file?

Almost nothing, and I think that is the correct answer rather than an unfinished one. The only rule I can actually ship is a game-level toggle that pulls players from both sides of the same matchup — the one positive link worth exposing, and the one the file has the information to enforce, because a DraftKings export does tell you which game each player is in.

There is a second rule I believe in and cannot encode, and the gap is worth spelling out because it is where a lot of confident DFS advice quietly falls over. Two big men on the same team are competing for the same missed shots, so you should not roster both. Fine as advice. But look at what a salary export actually contains: position, roster position, salary, team, game, and an average fantasy score. There is no rebounding column in it. “Big man” in the sense that matters here is something I worked out from three seasons of box scores — the optimizer cannot see it.

The obvious substitute is to use the listed position and cap centers at one per team. That does not survive contact either. FanDuel has exactly one center slot, so rostering two is already impossible there and the constraint does nothing. On DraftKings it would only ever bite in the single case of a center at C and another at UTIL. And it misses the power forward who takes the boards anyway, which is half the pairs I measured. Encoding it properly would mean maintaining a rebound-rate lookup for every player in the league, refreshed all season — a real data pipeline, bought in exchange for one of the smallest effects in the study.

So it stays advice, and the rules file stays empty. A correlation you can measure is not the same thing as a rule you can ship, and the distance between those two is exactly the size of the data you would have to go and get.

The temptation is to invent basketball versions of the baseball constraints so the file looks respectable — a “starting five stack,” a “guard pairing,” something with a confident name. I would rather ship a nearly empty rules pack than ship constraints I cannot justify, because a constraint that encodes a correlation which is not there does not make lineups better, it just makes the set of lineups you build less diverse for no reason.

All of which is an argument, not evidence. Arguments about correlation are cheap and the internet is full of them. So before writing a line of NBA code I pulled three seasons of box scores and measured whether any of this is true. That is the next post, and one of the things I predicted here turns out to be wrong.

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