The short version
Sage is a ratings model. It watches the results of every game in 24 leagues, gives each team a rating, and uses those ratings to project the next game. It produces two numbers you can see on our basketball predictions page: a win chance and a projected score.
It is deliberately simple, and it knows nothing but results. No injury reports, no line-ups, no travel schedules. That is a real limit, and we would rather you knew about it than found out the hard way.
This post covers how the numbers are made, how they did on games the model had never seen, and how to use them without expecting more than they can give.
How the ratings work
Every team carries a rating built from its past scores. After each game the rating moves, up if the team beat what the model expected and down if it fell short. Recent games therefore count for more than old ones, and a team that changes over a season gets picked up as the results arrive.
Three other things are tracked for each league, because leagues are not alike:
- Home court. Each league learns its own home value. Hosts win 63.3% of games in Greece's Basket League but only 51.8% in Japan's B.League, so one fixed number would be wrong almost everywhere.
- Scoring level. NBA games average 228.0 points and EuroLeague games 166.9. Each league keeps a running average that moves with the league.
- Spread of results. How far games tend to land from a projection. This is what turns a projected margin into a chance.
When a new season starts, 70% of a team's rating carries over. Rosters change and so does form, so old ratings are pulled partway back to the middle rather than trusted in full. It also means October chances lean on last season, and they sharpen as games are played.
From ratings to a prediction
For any game, the model takes both teams' ratings and home court, then projects a score for each side.
The gap between those scores is the projected margin. Comparing that margin with the league's usual spread of results gives the win chance. A six-point favourite in a league where results vary widely has a smaller win chance than a six-point favourite in a steadier league.
We show the favourite's chance as a whole number. Anything finer would suggest a precision the model does not have.
Predictions appear up to 48 hours before tip-off and update every hour. At tip-off they freeze. Once the game ends, they settle automatically on the final score, overtime included. Postponed or cancelled games are not counted.
Here is what that looks like right now, with today's free predictions:
Updated Friday 30 October. Times are UK time. 55 of the 101 games in the next 36 hours are free. Pro opens the rest, plus over/under and handicap reads.
| Tip-off | Game | Sage favours | Win chance | Projected score |
|---|---|---|---|---|
| Fri 17:30 | Anadolu Efes v Panathinaikos | Panathinaikos | 60% | 81 – 84 |
| Fri 18:00 | Zalgiris Kaunas v Partizan Mozzart Bet | Zalgiris Kaunas | 70% | 86 – 80 |
| Fri 19:00 | Lyon-Villeurbanne v Baskonia | Lyon-Villeurbanne | 63% | 91 – 87 |
| Fri 19:00 | Den Bosch v Mechelen | Den Bosch | 65% | 83 – 77 |
| Fri 19:15 | Olympiacos v Olimpia Milano | Olympiacos | 91% | 95 – 80 |
| Fri 19:30 | Brussels Basketball v Spirou Charleroi | Brussels Basketball | 68% | 82 – 75 |
| Fri 23:30 | Boston Celtics v Chicago Bulls | Boston Celtics | 84% | 125 – 109 |
| Fri 23:30 | Toronto Raptors v Orlando Magic | Toronto Raptors | 68% | 116 – 108 |
| Fri 23:30 | Brooklyn Nets v Detroit Pistons | Detroit Pistons | 76% | 105 – 116 |
| Sat 00:00 | Minnesota Timberwolves v Los Angeles Clippers | Minnesota Timberwolves | 64% | 115 – 109 |
| Sat 00:00 | Dallas Mavericks v Houston Rockets | Houston Rockets | 69% | 110 – 118 |
| Sat 16:00 | Cedevita Olimpija v FMP Beograd | Cedevita Olimpija | 74% | 87 – 80 |
| Sat 18:00 | Buducnost v Borac Mozzart | Buducnost | 84% | 91 – 79 |
| Sat 19:00 | Utah Jazz v Portland Trail Blazers | Portland Trail Blazers | 64% | 113 – 119 |
How we tested it
A model can look brilliant on games it has already seen, so we split the data. We ran it through 33,385 finished games across all 24 core leagues, in date order, so it only ever knew what had happened before each game. Settings were tuned on games before July 2025. The 9,440 games after that were kept back as the test.
Here is how the home team's win chance compared with what actually happened in those test games:
| Sage said | Games | Average chance | Home team won |
|---|---|---|---|
| 20-30% | 557 | 25.5% | 27.1% |
| 30-40% | 952 | 35.3% | 33.9% |
| 40-50% | 1,486 | 45.2% | 46.4% |
| 50-60% | 1,876 | 55.2% | 57.4% |
| 60-70% | 1,768 | 64.8% | 65.6% |
| 70-80% | 1,349 | 74.7% | 74.3% |
| 80-90% | 823 | 84.3% | 86.4% |
| 90-100% | 298 | 93.7% | 94.6% |
The two right-hand columns track each other closely, within about two points in every band. When Sage said 75%, the team won about 75% of the time. That property is called calibration, and it is what you want from a chance.
We also scored it against a plain baseline that simply used each league's home-win rate. Sage's Brier score, where lower is better, was 0.206 against 0.244, and it beat the baseline in every one of the 24 leagues. Its typical miss on the margin was 10.7 points.
Where the numbers are weaker
Being honest about this is the point of publishing it.
- Long-shot underdogs. Below 20% the model runs high. It said 16% on 269 games and those teams won 12.3%. It said 6% on 62 games and they won 1.6%. So we show those chances as "under 20%" and never quote a precise figure.
- Over/under. Over chances held up between 20% and 80%, within about three points. Beyond that they were a little too confident, so we cap what we show at 20-80%.
- Handicap. Margins spread the way the model expects, with 69.4% landing within one standard deviation against 68.3% in theory. But we had no historical spreads to test against, so cover chances are labelled as estimates.
- Some leagues. Korea's KBL, Finland's Korisliiga, Argentina's Liga A, the UK's SLB and Australia's NBL were the hardest to call, with the EuroLeague next. Sage's favourite won 74.2% of 248 games in Denmark but 58.9% of 331 in Korea, so a chance means more in some leagues than others.
What the model cannot see
This is the big one. The feed we use has no injury reports and no line-ups, so:
- If a star is ruled out an hour before tip-off, the chance does not move for that reason.
- If a team has played three nights running, the model does not know.
- If a club has just signed or lost a key player, it only finds out from the results that follow.
A number that ignores all this can still be well calibrated across thousands of games, because team news tends to even out. It can be badly wrong on one particular night. Always check team news. Bookmakers already have.
We also have not yet compared the model with bookmaker prices, because we only began capturing odds on 29 October 2026. We will run that test once a few hundred NBA games have prices stored. Until then we make no claim that these chances beat the market, and neither should you.
How to use the numbers
- Start with the win chance. It answers one question: who is likelier to win?
- Check team news. The model cannot.
- Compare with the market. Each game page shows the best prices we hold.
- Respect the close game. Even a 70% favourite should lose about three times in ten. In the EuroLeague, 32% of games finish within five points.
- Keep stakes flat. Our flat staking vs Kelly post shows why.
Every call is on the record
Testing on past games is only half of it. Since 30 October 2026, every published prediction has been settled and counted on the public basketball record, right or wrong, split by confidence band. Early numbers will swing, so judge them once there are a few hundred games.
The strongest half of each day's games is free, with win chance and projected score. Pro opens the rest, plus over/under and handicap reads, on the same subscription as football.
Frequently asked questions
Is Sage a machine learning model? It is a statistical ratings model. It learns from results by updating team ratings, and we prefer to describe it plainly.
Does it use bookmaker odds? No. Win chances come from results only, so they stay an independent view. Odds are captured separately so they can be shown beside the model.
Why did a 90% favourite lose? Because 90% is not 100%. In the test, teams rated 90-100% lost about one game in twenty. See the record page to check how each band is doing.
Which leagues are covered? Twenty-four, including the NBA, EuroLeague, EuroCup, Basketball Champions League, ACB, Lega A, BBL and LNB.
Predictions are chances, not promises. Only bet what you can afford to lose. 18+. BeGambleAware.org.