Courtline · NBA model vs. the betting market

Vegas missed by 10.55. My model missed by 10.56.

I built an NBA model from public data and tested it on 6,573 games it had never seen. It found no edge against the closing line on sides or totals. Now it runs every day of the 2026–27 season, projects every game against the market, and grades itself in public.

Backtest v0 · walk forward6,573 games · 2021–26
VegasCourtlineAvg miss, margin10.5510.56Avg miss, total14.2214.22

Average points between the projection and the final score, on games each season's model had never seen.

This season, out of sample

2026–27: 119 games graded

Every game is projected against the consensus line from my last odds pull before tip, using a model trained only on earlier seasons. Courtline always takes a side, so these records include every graded game, not a hand-picked list.

53–64–2Against the spread45.3% · every game
50–67–2Totals, over or under42.7% · every game
12.08Avg miss on the marginVegas: 12.07

See every graded game

How it works

Five steps, run every day

  1. Collect the data

    Team box scores, schedules and closing lines from the open hoopR NBA dataset: about 7,899 lined games since 2020, plus every game this season.

  2. Model team form

    Exponentially weighted offensive rating, defensive rating and pace with a 12 game half life, regressed 30% toward average between seasons, plus rest days and back to backs.

  3. Backtest walk forward

    Each season from 2021–26 is projected only from the games before it, then scored against final results and the closing line.

  4. Save the market

    A daily pull from The Odds API saves spreads, totals and moneylines across US sportsbooks before the evening slate, so every projection is graded against a real number.

  5. Publish and grade

    This site rebuilds itself every evening after the odds pull and every morning after the results, so each projection is posted before tip and graded after the final.

Explore

Four ways in