How the predictions work
What the win probabilities and season projections mean, how they are calculated, and how well they have worked.
bbStat shows two kinds of predictions: the chance that a team wins a game, and the chance of each team finishing in each place of a league table. Both are estimates calculated from past results. This page explains what goes into them, what comes out and how well they have worked on past seasons. Technical details are folded away under each section.
In short
- A game's win probability is based on the teams' recent form, the players likely to play and, where it matters, home court.
- A season projection plays the rest of the schedule thousands of times on a computer and counts where each team ends up.
- Tested on past seasons, the projected probabilities fit the final tables better than assuming today's table stays as it is. The champion is hard to pick early in the season.
1. Win probability for a game
Before a game the model looks at three things:
- Form. How many points ahead or behind each team has been on average in its last eight games.
- The players. The recent scoring averages of the players who are likely to play. A team without its top scorers is weaker.
- Home court. In leagues where home court has been shown to matter there is a small bonus for the home team. In some leagues, such as Kortteliliiga, where games are played at shared venues, there is none.
These are combined into an expected margin, the number of points by which we expect one team to win. Basketball scores vary a lot, so a team expected to win by 10 points still loses fairly often. The curve shows how an expected margin translates into a win probability.
During a game the same calculation is repeated with the actual score and the time left. That is why the win-probability line on a game page moves as the game goes on.
For the technically curious
The rest of the game is modelled as a random walk: the margin moves by a random amount with a standard deviation of σ points per quarter. A "quarter" means a quarter of regulation time, so a 2 x 25 minute Kortteliliiga game has the same four quarters as a 4 x 10 minute game.
P(home wins) = Φ( (m + D · r/4) / (σ · √r) )
Here m is the current margin, r the quarters left (4 before tip-off), Φ the standard normal distribution function and D = h + wr · ΔRoster + wf · ΔForm the expected margin over a whole game.
ΔForm is the difference of the teams' average margins in their last 8 games (zero unless both have at least 3). ΔRoster is the difference of the summed scoring averages (last 10 games) of the players in the box score; a player with fewer than two games counts as 3.0 points. h is a home edge, used only where the data show one.
σ, h, wr and wf are fitted separately for each league level and gender by minimising the average log-loss over the last six seasons of games with a half-time score, with at least 150 games per group. Leagues without enough games use the gender model, then the all-leagues model. The fit is repeated every month. Current values:
| Group | Games | σ / quarter | Home edge | w roster | w form | Log-loss: plain → fitted |
|---|---|---|---|---|---|---|
| All leagues | 1813 | 6.60 | 0.51 | 0.262 | 0.418 | 0.481 → 0.398 |
| All men's leagues | 1515 | 6.81 | 0.58 | 0.281 | 0.456 | 0.493 → 0.407 |
| All women's leagues | 298 | 6.10 | – | 0.220 | 0.368 | 0.406 → 0.337 |
| 2nd Division (men's) | 311 | 7.03 | 1.13 | 0.255 | 0.465 | 0.512 → 0.449 |
| 3rd Division (men's) | 391 | 6.81 | – | 0.252 | 0.530 | 0.485 → 0.399 |
| 3rd Division (women's) | 225 | 5.73 | – | 0.202 | 0.343 | 0.416 → 0.341 |
| 4th Division (men's) | 316 | 6.73 | – | 0.326 | 0.470 | 0.444 → 0.328 |
| Korttelikoris (men's) | 495 | 6.82 | – | 0.323 | 0.390 | 0.542 → 0.449 |
2. Season projections
A league table shows only what has happened so far. To estimate how the season will end, bbStat plays the rest of it on a computer, many times:
- 1 Start from the real table today and the games still to be played.
- 2 For each remaining game, work out each team's chance of winning (see above). This includes which players are likely to play: a player who played 6 of the team's last 8 games is assumed to play with that probability.
- 3 Pick a winner for each game at random, weighted by those chances, add up the league points and see where every team finishes.
- 4 Repeat 10,000 times. The share of runs in which a team finishes first is its chance of finishing first, and the same for every other place.
The result is the table on the Projections tab. Each row is a team and each column a final position; a darker cell means a more likely position. Teams of similar strength share the middle of the table, so one team can have a real chance of several positions.
Worked example
| Team | 1 | 2 | 3 | 4 | 5 | 6 | Proj. points |
|---|---|---|---|---|---|---|---|
| Front group | |||||||
| A | 81% | 15% | 4% | 19.3 | |||
| B | 13% | 61% | 25% | 1% | 17.1 | ||
| C | 5% | 24% | 66% | 5% | 16.1 | ||
| Bottom group | |||||||
| D | <1% | 5% | 85% | 9% | 1% | 11.9 | |
| E | 9% | 76% | 15% | 8.9 | |||
| F | 1% | 15% | 85% | 6.7 | |||
The projected points column is the average over all runs. In Kortteliliiga a game is worth up to three league points (the win and each half), so there each game is played as two halves.
For the technically curious
Each run draws, for every remaining game, whether each player in the team's recent roster plays (probability = the share of the team's last 8 games he or she appeared in) and takes the difference of the available players' scoring averages as ΔRoster. The game is then decided with the win probability above.
Season projections use 1.3 × the fitted σ. A single game's σ is right for one game, but a projection holds each team's strength fixed for the rest of the season, which understates real variation (injuries, lineup changes). In a calibration test the teams given a 65–100% title chance won only about 80% of the time; widening σ removed most of that over-confidence.
Form combines the current season with the team's average margin in the previous season at the same league level, if it played there: that value counts fully with no games played and fades out as the 8-game window fills.
Kortteliliiga: each half's margin is drawn as N(D/2, 2σ²) and rounded to whole points, so a tied half (about 2.5% of halves) happens as often as in real games. From the 2023 ruleset a tied half goes to the winner of the game, before that to nobody. League points always come from the stage's ruleset (for example FIBA: 2 for a win, 0 for a loss). The rule reproduces the standings stored by the old bbStat for every team we checked.
Equal points are separated by point difference. Results are stored and recomputed only when a game result is added or corrected, so opening the tab is instant after the first visit.
3. Groups, the shaded band and "against the odds"
Groups
Around the middle of a season there are usually top teams, a middle group and a bottom group. bbStat finds these groups from the simulation. A line between two positions counts as a group boundary only if hardly any team crosses it: in at most 10% of the runs does a team above the line finish below it, or a team below the line finish above it. A group that holds most of the league is called the main pack.
The shaded band
The shaded band around a line in the title-probability chart shows how much a team's chance could change if we have misjudged its strength. Early in the season a team is known from only a few games, so the band is wide. It narrows as more games are played. The band is drawn for the three teams with the best title chances.
"Against the odds"
For finished seasons the Projections tab replays the season from a point in the middle and compares the real result with what looked likely then. Sometimes a team wins the league against the odds.
For the technically curious
The band re-runs the projection with the team's strength nudged up and down by 1.96 standard errors (the standard deviation of its last 8 margins divided by √n) and shows the range of title probabilities that results. Only that team's own strength is varied, so it understates the full uncertainty. It is not simulation noise, which with 10,000 runs would be only about ±1 percentage point.
4. How accurate is it?
We tested the projections on past seasons. For each season we pretended it was, say, 60% played, made the projection from what was known at that point and compared it with how the season really ended. The baseline is the simplest guess: the table stays exactly as it is.
Across a whole season the projected probabilities are clearly closer to the real outcome than assuming today's table is the final one. As a single best guess, the projection is about as good as picking the current leader in FIBA leagues. In Kortteliliiga it is better on every measure. There every pair of teams meets only once, so the table is much less settled at mid-season. Early in the season the champion is hard to pick either way.
The charts below use the Brier score. For each team it takes the probability the projection gave to the position the team really finished in and measures how far that is from 100%. The gap is squared and averaged over all teams. 0 would be perfect, and lower is better. A table in which every position is equally likely scores about 0.8 to 0.9 in leagues of this size, so a clearly lower score means the probabilities carry real information. A confident wrong answer costs more than a cautious one.
FIBA leagues
Kortteliliiga
| FIBA leagues | At 60% of the season | At 90% of the season | ||
|---|---|---|---|---|
| Projection | Today's table | Projection | Today's table | |
| Champion picked correctly | 73% | 73% | 90% | 85% |
| Champion in the top three picks | 98% | 98% | 100% | 100% |
| Average error in final position (places) | 0.85 | 0.84 | 0.44 | 0.38 |
| Seasons tested | 60 | |||
| Kortteliliiga | At 60% of the season | At 90% of the season | ||
|---|---|---|---|---|
| Projection | Today's table | Projection | Today's table | |
| Champion picked correctly | 36% | 14% | 64% | 64% |
| Champion in the top three picks | 100% | 79% | 100% | 93% |
| Average error in final position (places) | 1.07 | 1.34 | 0.64 | 0.78 |
| Seasons tested | 14 | |||
Measured October 10, 2026 on model version 3; 60 FIBA seasons and 14 Kortteliliiga seasons. The model has changed since these figures were measured (now version 4), so they may be slightly out of date.
5. What it does not know
- Injuries, illnesses, holidays and players about to join the team, until they show up in a box score.
- Playoffs. Only regular-season tables are projected.
- Anything the bookkeeper does not record. We know made shots, but not misses, rebounds or turnovers.
- Very small samples. With only a few games played the estimates are shaky, which is what the shaded band shows.
- Chance. Something with a 10% probability still happens about once in ten times.
Model version 4. When the method changes, this page changes with it.