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.
Average points between the projection and the final score, on games each season's model had never seen.
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.
Five steps, run every day
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.
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.
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.
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.
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.
Four ways in
Predictions
25 upcoming games with the market number, Courtline's projection and the lean.
Research
The backtest, the back to back finding, home court by season and today's team ratings.
Calculator
Any two teams, any rest, any line. See the projected margin, total and fair price.
Bet log
Log a bet and see Courtline's chance against the price. Saved in your browser only.