From the roster up
Roster Math rates college basketball teams by rating the players on them first. That is the whole idea, and most of what follows is the discipline it takes to make it honest.
Team results are the only ground truth
A college basketball team plays about thirty games. A player's box score is a noisy shadow of what he did on the floor, lineup data is thinner still, and a recruiting rank is a guess about a seventeen-year-old. The one thing that is measured cleanly, every night, is how many points each team scored per possession against whom. So the team rating comes first, and everything underneath it is held to one standard: when a team's players are rated and their ratings are added up, minutes-weighted, the sum has to match how the team actually played. A player model that cannot pass that test is not describing players, it is describing something else.
What a rating is
A team's rating is points per 100 possessions better than an average Division I team on a neutral floor: +30 is elite, 0 is average, and the gap between two teams is the margin the model expects on a neutral floor. Offense and defense are the two halves, each against the average, and the rating is their sum. It is estimated from every game, adjusted for the strength of every opponent and for where the game was played, with the fit shrunk toward a prior so that a team's number is not thrown around by one hot shooting night. A small part of each game's three-point luck is removed from the target, and the score is split into its four factors (shooting, turnovers, offensive rebounds, free throws) so that the noisiest part is shrunk hardest. Tempo is modelled separately, which is why "rating" is per 100 possessions and not per game.
A player's rating is points per 100 possessions better than an average Division I player while he is on the floor. Contribution weights it by the share of a rotation slot he is projected to play, so a star on the bench and a role player who never sits both read right.
The player, before the season
A preseason projection is a shrinkage problem. Every player has a prior and an amount of evidence, and the less evidence he has, the more the prior wins. A returning player is projected from his own record, shrunk by how much he played, with the known patterns applied: good freshmen keep improving, good seniors regress harder, about forty percent of a one-season spike is given back, and the recruiting pedigree he arrived with still says something years later. A transfer is projected from his record at the old school with the change in level priced in; transfers as a group have slightly under-delivered their projections, and the model knows it. A freshman is projected from his recruiting rank and, where there is one, his place in the preseason NBA mock drafts, which turned out to be the better signal for the very top of the class. A junior-college, international or Division II arrival is the thinnest case: no approved source carries his previous league, so he gets a careful prior and, for the handful projected to matter, a hand-written one with its source noted.
Then minutes. Who plays is as important as how well, so a second model projects each player's share of a rotation slot from his record, his position and the crowding around him, with a cap, because nobody actually plays the 85% of minutes his projection would like, and a squeeze on deep rosters, because the tenth man on a loaded team does not play.
The team, before the season
The roster's player ratings are added up, minutes-weighted, into a roll-up. The roll-up is then calibrated against what teams with that roll-up actually did, alongside last season's rating (a program carries over more than its players do), the roster's experience, its shape and the program's own level two and three seasons back. That calibration is where the model admits what the roster alone cannot see, and every team's page shows its terms. A simulation on top of it gives every team an 80% range, a probability of finishing in the top 25 and a probability of finishing No. 1. The ranges are honest: over the seasons they were tested on, eight teams in ten landed inside theirs.
In season
Once games are played, the projection becomes the prior of the in-season rating, worth about eight games, and fades as results accumulate. A player's rating blends his projection with his box score to date in proportion to how much each has to say. A player who is out moves the team's rating by what his minutes were worth, from the date he is out, not before. The published number updates on Mondays.
What is not done
- No tuning on the season being reported. Every evaluation is walk-forward: a season is projected only from the seasons before it. The preseason number is frozen before the first game, with its own scorecard written in advance, and is scored in March against what happened. The frozen file is never regenerated.
- No scraping of other rating sites. Their terms of service forbid it, and a model that reads other models is not a model. The ratings come from box scores and play-by-play through ESPN's public data, rosters, recruiting and lines through CollegeBasketballData, and live betting lines through The Odds API.
- No hand-edited numbers. Roster corrections (a player ruled eligible, a late transfer, an injury) live in a checked-in file with a source note on every row. The model reads the file; nobody reads the model and changes a rating.
- No silent changes. Every idea tried on the model is written down with its numbers, the rejected ones beside the adopted ones, and the list of rejections is longer. Most ideas that sound right do not help, and knowing which ones is most of the value.
Betting
A rating system that cannot say where it beats the market is not finished. The paper season is the test: a rule fixed before tip-off, every qualifying pick recorded against the posted lines, settled weekly, with closing-line value as the metric that decides whether the model earns real stakes next season. Until then, nothing is wagered.
Glossary
- Rating
- Points per 100 possessions better than an average Division I team on a neutral floor. +30 is elite, 0 is average. The gap between two teams is the expected margin on a neutral floor at an average pace.
- Offense
- Points per 100 possessions the team scores above what an average team would against the same opponents. The rank is among all teams.
- Defense
- Points per 100 possessions the team allows below what an average team would. Positive is good. The rank is among all teams.
- 80% range
- The projection interval for the rating: eight seasons in ten, a team's true strength lands inside it. Wider means more uncertainty, usually more newcomers.
- Top 25
- The model's probability that the team finishes the season rated in the top 25, from 20,000 simulated seasons of the projection.
- No. 1
- The model's probability that the team finishes the season rated No. 1.
- Returning
- The share of the team's projected minutes that played for the same team last season.
- Projected record
- Expected wins and losses over the games on the schedule as posted (regular season and listed tournaments), each game simulated with the rating's uncertainty. The range beside it is the 10th to 90th percentile of wins.
- Preseason
- The team's rank in the frozen preseason projection, before any game was played.
- MPG
- Projected minutes per game: the player's projected share of a rotation slot times 40.
- Rating (player)
- Points per 100 possessions better than an average Division I player while he is on the floor, offense and defense combined.
- Contribution
- Rating times the projected share of a rotation slot: what the player adds to the team's rating. The roster's contributions, summed, are the team's roll-up.
- Player rank
- Before the season the players are ordered by rating times the square root of the share, so a star projected to play most of the game ranks above a reserve with a better per-minute rating. In season they are ordered by contribution so far.
- Rating rank
- The player's rank by rating alone, ignoring minutes.
- D1 yrs
- Division I seasons played before this one.
- Group
- Returning: played for this team last season. Transfer: came from another Division I team. Freshman: ranked recruit out of high school. Other newcomer: junior college, international, Division II or unranked.
- From
- Last season's team.
- Proj. margin
- The model's expected margin from the team's side, with home court where the game is not neutral.
- Win prob.
- The model's probability of winning, from the expected margin and the game's uncertainty.
- Edge
- The model's margin minus the market's consensus line at the recording minute, in points. A pick needs three or more.
- CLV
- Closing-line value: the consensus line at the recording minute minus the closing line, from the pick's side. Positive means the market moved toward the pick.
- Tempo
- Possessions per game above or below the average team.
Who
Roster Math is a personal project, built in the open and run from one laptop. The numbers are the model's; the mistakes are the author's. It posts as @Roster_Math on X and @roster_math on Instagram.