In the following, the model behind the FIBA Kalman ratings is presented in full detail. The original model was developed in my Master's thesis for the NBA, and it carries over to international basketball with one modification that concerns the time between games. The idea is simple. Every team has a hidden strength that drifts over time. The strengths are never seen directly, only the scores of the games, which depend on the difference between the two teams' strengths plus a quite a lot of randomness. The Kalman filter turns the stream of scores into running estimates of the strengths, together with a measure for the uncertainty related to those estimates.
State-space model
Consider a league of \(n\) teams. The state of the league at time \(t\) is the vector \(\mathbf{x}_t \in \mathbb{R}^n\), whose element \(x_t(i)\) is the strength, or rating, of team \(i\). The strength of a team depends on players developing and declining, injuries, roster changes, coaching, and plenty of intangibles. Instead of modeling any of these explicitly, the model treats their combined effect as random noise
\[ \mathbf{x}_t = \mathbf{x}_{t-1} + \mathbf{w}_t, \qquad \mathbf{w}_t \sim N(\mathbf{0}, \mathbf{M}_t). \tag{1} \]There is no trend: the best guess for tomorrow's strength is today's strength. In the thesis, \(t\) counts the game days of an NBA season and \(\mathbf{M}_t = \sigma_w^2 \mathbf{I}\). International competition is played differently. The teams play short tournaments and qualifying windows, with gaps ranging from a day to several years. Therefore, the variance of the change is scaled by the elapsed time,
\[ \mathbf{M}_t = \sigma_w^2 \operatorname{diag}\bigl(\Delta_t(1), \ldots, \Delta_t(n)\bigr), \tag{2} \]where \(\Delta_t(i)\) is the number of days since the previous game of team \(i\) and \(\sigma_w^2\) is the variance of the change in team strength per day. This makes each rating a Brownian motion in calendar time. A team that has not played for ten years has had plenty of time to accumulate variance making our estimate of its strength highly uncertain.
The ratings are observed only through game scores. In a game between teams \(i\) and \(j\), the observation is the point differential \(y_t\), i.e., the points scored by team \(i\) minus the points scored by team \(j\), and it is modelled as
\[ y_t = x_t(i) - x_t(j) + \mu h_t + v_t, \qquad v_t \sim N(0, \sigma_v^2). \tag{3} \]Here \(\mu\) is the home-court advantage, \(h_t = 1\) if team \(i\) plays at home and \(h_t = 0\) on a neutral court, which is the usual setting in international tournaments. The noise term \(v_t\) consists of all other factors affecting a single game such shooting accuracy and foul trouble. The noise terms of different games are independent of each other and of the changes \(\mathbf{w}_t\). In matrix form, the observation equation reads \(y_t = \mathbf{C}_t \mathbf{x}_t + \mu h_t + v_t\), where the schedule row \(\mathbf{C}_t \in \mathbb{R}^{1 \times n}\) has \(+1\) in position \(i\), \(-1\) in position \(j\), and zeros elsewhere. The thesis stacks all games of a game day into one observation vector. In the FIBA model, the games are processed one at a time, which gives exactly the same estimates because the noise terms of the games are independent.
Two properties follow directly from model equations. First, the ratings are measured in points: the point differential on the left-hand side is in points, and so is any difference of ratings on the right-hand side. Second, only differences of ratings are observed. Adding the same constant to every rating leaves their difference unchanged, so the absolute level of the ratings is a matter of convention. Here every team starts from zero, but ESPN would probability choose 100 as the starting point.
Kalman filter
The Kalman filter estimates the state recursively, one game at a time. After the games up to time \(t\), everything known about the ratings is summarized by the estimate \(\hat{\mathbf{x}}_{t|t}\) and its covariance matrix \(\boldsymbol{\Sigma}_{t|t}\). The diagonal of \(\boldsymbol{\Sigma}_{t|t}\) tells how uncertain each team's rating is, and the off-diagonal elements tell how the errors of different teams' ratings are linked. Under the Gaussian assumptions,
\[ \mathbf{x}_t \mid \mathcal{Y}_t \sim N\bigl(\hat{\mathbf{x}}_{t|t}, \boldsymbol{\Sigma}_{t|t}\bigr), \]where \(\mathcal{Y}_t\) denotes the scores observed up to time \(t\). Without any prior information, all teams are assumed equal, and the filter is initialized with
\[ \hat{\mathbf{x}}_{0|0} = \mathbf{0}, \qquad \boldsymbol{\Sigma}_{0|0} = \sigma_0^2 \mathbf{I}, \tag{4} \]where a large \(\sigma_0^2\) says that the initial guess is nothing more than a guess. Each game then involves two steps. In the prediction step, the ratings stay where they are, but they become more uncertain with time,
\[ \hat{\mathbf{x}}_{t|t-1} = \hat{\mathbf{x}}_{t-1|t-1}, \qquad \boldsymbol{\Sigma}_{t|t-1} = \boldsymbol{\Sigma}_{t-1|t-1} + \mathbf{M}_t. \tag{5} \]The predicted point differential and its variance are
\[ \begin{aligned} \hat{y}_t &= \mathbf{C}_t \hat{\mathbf{x}}_{t|t-1} + \mu h_t = \hat{x}_{t|t-1}(i) - \hat{x}_{t|t-1}(j) + \mu h_t, \\ O_t &= \mathbf{C}_t \boldsymbol{\Sigma}_{t|t-1} \mathbf{C}_t^{\top} + \sigma_v^2 = \Sigma_{t|t-1}(i,i) + \Sigma_{t|t-1}(j,j) - 2\,\Sigma_{t|t-1}(i,j) + \sigma_v^2. \end{aligned} \tag{6} \]The variance \(O_t\) has two parts: the uncertainty about the difference of the two ratings and the randomness of a single game. In the update step, the score of the game is compared with the prediction and the estimates are corrected,
\[ \begin{aligned} d_t &= y_t - \hat{y}_t, \qquad \mathbf{K}_t = \boldsymbol{\Sigma}_{t|t-1} \mathbf{C}_t^{\top} O_t^{-1}, \\ \hat{\mathbf{x}}_{t|t} &= \hat{\mathbf{x}}_{t|t-1} + \mathbf{K}_t d_t, \qquad \boldsymbol{\Sigma}_{t|t} = \boldsymbol{\Sigma}_{t|t-1} - \mathbf{K}_t O_t \mathbf{K}_t^{\top}. \end{aligned} \tag{7} \]The innovation \(d_t\) is the prediction error, i.e., the actual point differential minus the expected point differential. The Kalman gain \(\mathbf{K}_t \in \mathbb{R}^n\) decides how much the ratings are adjusted to account for the error, and to which direction. The two teams that played move in opposite directions, and the other teams move as well if their ratings are correlated with either of them. Correlations build up as the games are played, since each game ties the ratings of its two teams together. For example, beating a team that recently beat your neighbour says something about the neighbour, too.
The behaviour of the filter is easiest to see in the case where the two teams have equal prior variances \(\sigma^2\) and correlation \(\rho\). Then the update (7) reduces to
\[ \hat{x}_{t|t}(i) = \hat{x}_{t|t-1}(i) + \frac{d_t}{2 + r^2}, \qquad \hat{x}_{t|t}(j) = \hat{x}_{t|t-1}(j) - \frac{d_t}{2 + r^2}, \qquad r^2 = \frac{\sigma_v^2}{(1-\rho)\,\sigma^2}. \]The ratio \(r^2\) compares the noise of a single game with the uncertainty of the ratings. If the games were free of noise, \(r^2 \to 0\), and the difference of the two ratings would be set equal to the result of their latest game. (In Finnish basketball discussions, this kind of naive updating is known as jabastics, after Jari "Jaba" Suvanto.) If the ratings were already known precisely or the games were pure noise, \(r^2 \to \infty\), and nothing would change. The Kalman filter sits in between, and it does so optimally: the estimates minimize the mean squared error among all linear estimators, and under the Gaussian assumptions they are the conditional expectations \(E(\mathbf{x}_t \mid \mathcal{Y}_t)\).
Estimation of the model parameters
The model has four parameters, \(\boldsymbol{\theta} = (\sigma_0^2, \sigma_w^2, \sigma_v^2, \mu)\), listed in Table 1. For the FIBA ratings, \(\sigma_0^2\) is fixed at 1000. This corresponds to a standard deviation of 32 points: before its first game, a team could be almost anything. The other three parameters were estimated using maximum likelihood method from 7,341 games played between 2000 and 2026.
| Parameter | Interpretation | Value |
|---|---|---|
| \(\sigma_0^2\) | Uncertainty related to the initial rating of a team | 1000 |
| \(\sigma_w^2\) | Uncertainty related to the change in team strength per day | 0.0470 |
| \(\sigma_v^2\) | Uncertainty related to the point differential of a game | 171.23 |
| \(\mu\) | Home-court advantage (points) | 2.72 |
The estimates have intuitive interpretations. Over a year, the variance of the change in team strength accumulates to \(365.25 \times 0.0470 \approx 17.2\), i.e., a typical team's level changes by about \(\pm 4.1\) points per year. The random variation of a single game has a standard deviation of \(\sqrt{171.23} \approx 13.1\) points.
Numerical example
Consider a hypothetical men's game between Germany (GER) and Finland (FIN) on 31 August 2026, one day after the latest games of both teams. Table 2 shows the estimates after the prediction step (5), i.e., including the extra variance \(\sigma_w^2 \times 1\) day.
| Quantity | Germany | Finland |
|---|---|---|
| Rating \(\hat{x}_{t|t-1}(\cdot)\) | 52.42 | 41.31 |
| Variance \(\Sigma_{t|t-1}(\cdot,\cdot)\) | 27.53 | 27.76 |
| Covariance \(\Sigma_{t|t-1}(GER,FIN)\) | 11.08 | |
1. The ratings are measured in points
The ratings move in points, as seen when the update (7) is applied to an actual score. Suppose Germany wins by 20 points on a neutral court. The predicted differential is \(\hat{y}_t = 52.42 - 41.31 = 11.11\) (see below), so the innovation is \(d_t = 20 - 11.11 = 8.89\) points. With the variance \(O_t = 204.34\) from (6), the gains of the two teams are
\[ K_t(GER) = \frac{27.53 - 11.08}{204.34} = 0.0805, \qquad K_t(FIN) = \frac{11.08 - 27.76}{204.34} = -0.0816, \]and the ratings become \(52.42 + 0.0805 \times 8.89 = 53.13\) and \(41.31 - 0.0816 \times 8.89 = 40.59\). The nine-point prediction error moves each team by about three quarters of a point. Here a single game carries little information, because the game noise \(\sigma_v^2\) is large compared with the uncertainty of the ratings.
On the other hand, if there has been a longer break since the teams' latest game, the changes are significantly larger as there is a lot more uncertainty about the teams' strengths. One could call this the USA Basketball effect, because the first game of the tournament or qualification window usually reveals what kind of lineup the Americans have sent to the competition.
Because only differences are observed, the zero point of the scale is the starting value of a team entering the FIBA system without any games played, not a "typical" team. If all teams had equal variances throughout, the corrections would sum to zero and the ratings would keep averaging zero. In the FIBA data, teams enter at different times, play at different rates, and the absolute worst teams have a tendency to quit the international competition altogether. Because of this, the average rating of the 191 teams has drifted to \(+6.6\) points. This does not matter when making statements about the differences between teams but it changes the interpretation of the team ratings. The team ratings are not expected point differentials against a hypothetical average team, but expected point differentials against El Salvador \(+0.38\) or Togo \(-0.30\).
2. The rating difference is the expected point differential on a neutral court
On a neutral court, \(h_t = 0\), and the predicted point differential (6) is simply the difference of the ratings,
\[ \hat{y}_t = \hat{x}_{t|t-1}(GER) - \hat{x}_{t|t-1}(FIN) = 52.42 - 41.31 = 11.11. \]Germany is expected to win by 11 points. If Germany played at home, \(h_t = 1\) and the expectation would be \(11.11 + 2.72 = 13.83\) points. In Helsinki, with the teams' roles swapped, Germany would be expected to win by \(11.11 - 2.72 = 8.39\) points.
3. The prediction variance gives the winning probabilities
By (8), the point differential is normally distributed with mean \(\hat{y}_t\) and variance
\[ O_t = 27.53 + 27.76 - 2 \times 11.08 + 171.23 = 204.34, \qquad \sqrt{O_t} = 14.29. \]Germany wins if the point differential is positive, so its winning probability is
\[ P(y_t > 0 \mid \mathcal{Y}_{t-1}) = 1 - \Phi\Bigl(\frac{-\hat{y}_t}{\sqrt{O_t}}\Bigr) = \Phi\Bigl(\frac{11.11}{14.29}\Bigr) = \Phi(0.777) = 0.781, \]where \(\Phi\) is the cumulative distribution function of the standard normal distribution. Finland wins with probability 0.219, i.e., roughly one game in four or five. With home court, Germany's probability is \(\Phi(13.83/14.29) = 0.833\) in Germany and \(\Phi(8.39/14.29) = 0.721\) in Finland. The 90% prediction interval for the point differential, \(11.11 \pm 1.645 \times 14.29\), runs from a 12-point Finnish win to a 35-point German win.
Here one should notice where the variance comes from. The uncertainty about the difference of the ratings, \(27.53 + 27.76 - 2 \times 11.08 = 33.12\), is only 16% of \(O_t\). The remaining 84% is the randomness of a single game. The same covariance matrix also tells how sure we are about the order of the teams:
\[ P\bigl(x_t(GER) > x_t(FIN) \mid \mathcal{Y}_{t-1}\bigr) = \Phi\Bigl(\frac{11.11}{\sqrt{33.12}}\Bigr) = \Phi(1.930) = 0.973. \]We can be 97.3% sure that Germany is the better team, and yet Finland would win almost a quarter of the games.
That is basketball.