How our CBB projections work

By George Boyle · Updated Nov 9, 2026 · 6 min read

This is the model behind our team ratings and the pace numbers on the Matchups page. It multiplies expected possessions by each team's opponent-adjusted points per possession, then adds home court. Before any number went public it had to pass a test, written down in advance, on a season it had never seen.

Spread error, unseen season
9.32 pts
the closing line: 8.97 pts
Total error, unseen season
13.76 pts
the closing line: 13.40 pts
Win-probability calibration
2.2%
limit was 3.0% (lower is better)
Tested on
2025-26 season
built only on 2022-23 through 2024-25

What the model computes

The build is simple on purpose: possessions per team, times each side's points per 100 possessions, plus a home-court adjustment.

Possessions are estimated the standard tempo-free way: field-goal attempts, minus offensive rebounds, plus turnovers, plus a fraction of free-throw attempts, averaged across both teams in a game.

Points per 100 possessions ("efficiency") is opponent-adjusted. A team's offense is compared, game by game, with what each opposing defense has allowed everyone else, so the schedule is taken out of the number.

Home court is one number, applied to the side that is truly at home and zero at a neutral site.

Before a season starts, everything the model knows about a team comes from last season's final rating, pulled most of the way back toward the Division I average. A program with no D-I history starts near the bottom of the pack, because that is where such teams have finished.

Since October 2026 the projected score, spread and total on the Matchups page come from our line. This model supplies the ratings and the pace.

How it was tested

The model was built on three seasons, 2022-23 through 2024-25, and then locked. Every constant it uses, including the home-court number and how much a new season leans on last year's rating, comes from those seasons alone. (2021-22 supplied only the starting ratings for 2022-23.)

The test was written down before a single 2025-26 number was looked at: a set of limits comparing its projected spreads and totals with what happened, and with the market's closing spread and total for the same games.

The closing line is the most accurate public estimate there is. The model does not see the market and was not expected to beat it. The bar was to be close.

What it had to clear

Six checks, all on the full 2025-26 season, in D-I against D-I games with a market line.

They ask how far off the projected spread and total were next to the closing line, whether the projection leaned toward one side, whether it beat two much simpler versions, and whether its win probabilities were honest: when it says a team has a 70% chance, does that team win about 70% of the time?

The six checks, 2025-26 season
CheckResultThresholdPassed
Spread error vs. the close, full season+0.36 pts≤ 1.00 ptYes
Spread error vs. the close, from Jan 1 on+0.13 pts≤ 0.75 ptYes
Total error vs. the close, full season+0.36 pts≤ 1.50 ptsYes
Bias (signed margin / signed total error)+0.22 / +0.01 pts≤ 0.50 / ≤ 1.00 ptsYes
Beats two simpler baselines, spread and totallower on bothstrictly lowerYes
Win-probability calibration (10 deciles)2.2%≤ 3.0%Yes

The two baselines it had to beat

The first baseline froze every team's rating at its preseason number for the whole season, with no updates. Its spread error was 10.45 points and its total error 15.35.

The second used raw season-to-date efficiency and tempo with no opponent adjustment. It came in at 10.76 and 14.98.

The full model's 9.32 and 13.76 beat both, on both measures.

All six checks passed, on the first and only look at the unseen season. Passing switched the projected score, spread and total on for the Matchups page. That is a display switch, not a claim of an edge.

Early season vs. conference play

The gap between the model and the closing line is wider in November and December than it is from January on.

That is expected. Two months in, most teams' ratings still lean heavily on last year, while the closing line has already absorbed real games. By January both are working from a full season of data and the gap narrows to a third of a point.

Unseen season 2025-26, by part of season
WindowSpread error (ours / close)Total error (ours / close)
Nov–Dec10.01 / 9.29 pts13.92 / 13.41 pts
Jan 1 on8.90 / 8.76 pts13.66 / 13.39 pts
Full season9.32 / 8.97 pts13.76 / 13.40 pts

A bias that flips with the calendar

The season split showed one more thing: the model's small bias changes direction. It slightly underrates home teams early and slightly overrates them later.

That pattern, and a full attempt to fix it, has its own write-up: "Home court advantage in college basketball", linked below.

Checked against an outside source

As a check outside the model's own test, its ratings were compared with CollegeBasketballData's independently computed adjusted efficiency margins for the same season.

The two rank teams almost identically, with a rank correlation of 0.99. The model is measuring what other tempo-free systems measure, not a quirk of its own choices.

Method

how this was measured

One module holds every piece of this. The daily build and the season replay used for the test call the same code, so the number that was tested is the number that ships.

Efficiency and tempo are each fit by a weighted ridge regression that shrinks every team toward its preseason rating. The fit is redone day by day in a strict walk-forward replay: a game is projected using only games played before its date.

The fitted constants: home court worth 2.877 points per 100 possessions per side, a preseason rating pulled 80% of the way back toward the mean, and a projection-error standard deviation of 11.61 points (the number that turns a spread into a win probability).

All of them came from a grid search over the three building seasons. The unseen season was never used to choose anything.

What this does not claim

Beating the market is not the test and was never the goal. The model does not see the market at all.

Its early-season numbers are its weakest, by design: it leans on last year's rating until this year's results build up.

It does not know about injuries. ESPN publishes no college basketball injury feed, so the Matchups page shows recent playing time in place of an injury designation.

See it live

Written by George Boyle, who builds The Sport Stack. Corrections and questions: hello@thesportstack.io. Who runs this.