DEV Community

Elio Liberatore
Elio Liberatore

Posted on

NBA play-in odds are not playoff odds: simulating the play-in tournament instead of guessing it

In baseball, American football and hockey, "make the playoffs" is one line: finish above it and you're in. When I built an NBA version of my playoff-odds simulator, I assumed the same, and my first plan was to compare the model against the wrong market.

Basketball has a band in the middle, and getting it right changes almost every number.

Three zones, not two

In each 15-team conference:

Finish What it means
1st – 6th Straight into the playoffs
7th – 10th Into the play-in tournament, where two of four survive
11th – 15th Season over

The play-in works like this. Seed 7 plays seed 8; the winner is the 7th seed. Seed 9 plays seed 10; the loser goes home. The loser of 7 v 8 then hosts the winner of 9 v 10, and that game decides the 8th seed.

Kalshi lists these as separate markets — one for playoff qualification across all 30 teams, and one play-in market per conference — and its contract rules settle the question in one sentence: "Qualifying for the play-in tournament doesn't constitute playoff qualification."

So the play-in market is not a weaker version of the playoff market. It's a band, and the two behave almost like opposites. A title contender is a near-certainty for the playoffs and a near-zero for the play-in. A 44-win team can be close to a coin flip between the two.

Simulate the games, don't approximate them

The tempting shortcut is to say "finish 7th or 8th, you're probably in; 9th or 10th, probably not". That breaks the moment you need two numbers that agree with each other: the chance of reaching the playoffs and the chance of landing in the play-in.

So in every simulated season the model:

  1. Plays out the remaining regular-season schedule.
  2. Seeds each conference.
  3. Plays the three play-in games.
  4. Runs the full bracket: four rounds of best-of-seven series with the 2-2-1-1-1 home-court pattern.

That produces, for every team and from the same simulated seasons: top-six probability, play-in probability, playoff probability, conference finals, conference title and championship. Sanity checks come for free — the championship column sums to 1 across the league and conference finals to 4.

Basketball-specific modelling choices

Pythagorean exponent. Points scored and allowed predict future results better than record alone, but the exponent depends on the sport. Baseball uses about 1.83, hockey 2.0; for basketball I use 13.91. Plugging a baseball exponent into NBA scoring wildly compresses the gap between good and bad teams.

Uncertainty about strength itself. My first version drew game outcomes from fixed team ratings. In September it confidently told me some teams made the playoffs 100% of the time and others 0%. That's not how the NBA works. Now each simulated season redraws every team's rating once (a 0.22 spread by default), so the output is a distribution rather than one confident guess. That alone cut the average gap against the market from 15.2 to 12.9 points and removed every 0% and 100%.

The two missing games. The 2026-27 regular season is 82 games, but ESPN's schedule currently lists 80 per team: the other two depend on the NBA Cup and are scheduled later. If you simply simulate the schedule you can see, every team's projected wins sit on an 80-game scale. I simulate the missing two against an average opponent on a neutral floor.

A September snapshot

From one run on 10 September 2026:

Team Projected wins Top six Play-in Playoffs Title
Oklahoma City 55.3 97.0% 2.8% 99.1% 23.9%
San Antonio 52.1 91.6% 7.8% 97.0% 11.8%
Boston 51.6 88.2% 11.0% 95.9% 11.6%
Toronto 44.8 51.0% 41.0% 73.7% 2.2%
Atlanta 44.4 48.2% 42.4% 71.7% 1.8%
Miami 44.3 47.9% 42.6% 71.3% 1.8%

Look at Toronto, Atlanta and Miami: roughly a coin flip to avoid the play-in, and more than 40% to end up in it. For those teams, playoff odds and play-in odds are both "live" — exactly why they need separate columns.

The number I don't trust

Against Kalshi's playoff contracts that day, most of the table lines up within a few points: Oklahoma City 99.1% in the model against 98% on the market, Miami 71.3% against 72.5%, Toronto 73.7% against 70.5%.

Then there's Charlotte: 86.5% in the model, 36% on the market. A fifty-point gap.

That is not an opportunity. Before opening night, the model knows only how last season ended, regressed towards average. It hasn't seen free agency, the draft, trades or injuries. The market has. When I first measured the model against Kalshi in September, the rank correlation was about 0.80 and the average gap about 13 points — and the largest gaps were teams whose whole case this year is the offseason.

So the simulator refuses to call anything "value" until every team has played ten games. It still reports every gap, labelled WATCH. A model that disagrees with the market by fifty points in September is telling you what it can't see, not what the market got wrong.

One market-side detail worth copying

Playoff qualification is sixteen independent yes/no contracts, so prices across the league add up to about 16, not 1. Never normalise that field to 1. And price both sides of each contract: if the model says 60% and YES trades at 75 cents, the signal is on the NO side, not "no signal".

Try it

The simulator is published as an Apify Actor: NBA Playoff Odds API — Monte Carlo Simulator & Value Bets. Standings and schedules come from ESPN and prices from Kalshi's public API, with no keys needed. Ready-made examples include play-in tournament odds by conference, championship odds from a simulated bracket, projected win totals and tracking playoff odds all season.

The season starts on 20 October. Simulation and data, not tips.

Top comments (0)