WTA Rankings
Purpose
This model estimates WTA player strength over time and across surfaces, with uncertainty, by treating historical market probabilities as noisy observations of latent player strength. It can derive a probability for any matchup on any surface. Current estimates are published on the WTA Rankings page.
The system has two inference stages which share the same generative model. Each off-season, the global model learns the shared parameters while integrating over the player states. During the season, those parameters remain fixed while the online player model estimates latent strengths before each day’s matches.
Data
One row per match: players \(i\) and \(j\), date \(t\), surface \(s\), player ages, prior WTA appearances, and decimal odds \(o_{i,m}\) and \(o_{j,m}\). The odds are converted to raw implied probabilities and multiplicatively de-vigged:
\[ \pi_{i,m}=\frac{1}{o_{i,m}}, \qquad p_{i,m}=\frac{\pi_{i,m}}{\pi_{i,m}+\pi_{j,m}}, \qquad y_m=\log\frac{p_{i,m}}{1-p_{i,m}}. \]
The raw bookmaker margin is \(v_m=\pi_{i,m}+\pi_{j,m}-1\). The model uses its training-standardized value,
\[ V_m=\frac{v_m-\bar v_{\mathrm{train}}}{s_{v,\mathrm{train}}}. \]
The stored odds are the source’s first available bookmaker; bookmaker identity is not preserved. When forecasting a match, its own price is not used: all matches on a date are predicted before prices from that date update the player states. Match outcomes are used only for evaluation.
States
- \(x_{i,t}\) = player \(i\)’s overall strength at time \(t\)
- \(\mathbf u_i=(u_{i,\mathrm{hard}},u_{i,\mathrm{clay}},u_{i,\mathrm{grass}})\) = player \(i\)’s surface effects
- \(z\) = all player states and surface effects
Parameters
- \(\theta\) = all shared system parameters
- \(\tau_0\) = population entry SD, in log-odds; \(\tau_0\sim\operatorname{LogNormal}(\text{median}=1.5,\text{log-SD}=0.75)\)
- \(\sqrt q\) = process SD, in log-odds per square-root year; \(\sqrt q\sim\operatorname{LogNormal}(\text{median}=0.5,\text{log-SD}=1)\)
- \(\sqrt r\) = base observation SD, in log-odds; \(\sqrt r\sim\operatorname{LogNormal}(\text{median}=0.25,\text{log-SD}=0.75)\)
- \(\tau_s\) = SD of the orthonormal surface contrasts, in log-odds; \(\tau_s\sim\operatorname{LogNormal}(\text{median}=0.35,\text{log-SD}=0.75)\)
- \(\beta_g\) = annual pre-peak growth, in log-odds; \(\beta_g\sim\operatorname{LogNormal}(\text{median}=0.4,\text{log-SD}=0.75)\)
- \(\beta_d\) = annual post-peak decline, in log-odds; \(\beta_d\sim\operatorname{LogNormal}(\text{median}=0.15,\text{log-SD}=1)\)
- \(\gamma_e\) = change in log entry SD per standardized unit of prior experience; \(\gamma_e\sim\operatorname{Normal}(0,0.5)\)
- \(\gamma_v\) = change in log observation SD per standardized unit of bookmaker margin; \(\gamma_v\sim\operatorname{Normal}(0,0.5)\)
State model
Player strength at panel entry is drawn from the tour population:
\[ \log \tau_i=\log\tau_0+\gamma_e E_i, \qquad x_{i,1} \sim \operatorname{Normal}(0,\tau_i^2). \]
\(E_i\) is the training-standardized value of \(\log(1+n_i)\), where \(n_i\) is player \(i\)’s number of stored WTA appearances before entering the panel.
The live model fixes peak age at 24 and uses the piecewise-linear age path
\[ a(A;\beta)= \begin{cases} \beta_g(A-24), & A<24,\\ -\beta_d(A-24), & A\geq24. \end{cases} \]
The peak is an assumption rather than an estimated parameter. Player strength then evolves as
\[ x_{i,t} \mid x_{i,t-1} \sim \operatorname{Normal}\!\left( x_{i,t-1}+a(A_{i,t};\beta)-a(A_{i,t-1};\beta), q\Delta t \right). \]
\(\Delta t\) is elapsed calendar time in years, calculated as elapsed days divided by 365.25. The mean follows the age path; variance grows linearly with elapsed time.
Each player has two independent coordinates in an orthonormal surface-contrast basis:
\[ \mathbf c_i\sim\operatorname{Normal}_2(\mathbf 0,\tau_s^2\mathbf I_2), \qquad \mathbf u_i=\mathbf C\mathbf c_i, \]
\[ \mathbf C= \begin{pmatrix} 1/\sqrt 2 & 1/\sqrt 6\\ -1/\sqrt 2 & 1/\sqrt 6\\ 0 & -2/\sqrt 6 \end{pmatrix}, \qquad \mathbf 1^\mathsf T\mathbf u_i=0. \]
Observation model
For match \(m\), the expected market log-odds are the difference between the two players’ overall strengths and surface effects:
\[ \eta_m = x_{i,t}-x_{j,t}+u_{i,s}-u_{j,s}, \]
Observation variance changes with bookmaker margin:
\[ \log\sqrt{r_m}=\log\sqrt r+\gamma_v V_m, \qquad y_m \mid z,\theta \sim \operatorname{Normal}(\eta_m,r_m). \]
\(r_m\) determines how strongly the observed price updates the player states.
Fit
Off-season global fit
Let \(y_{\mathrm{train}}\) contain the eligible market log-odds from the preceding seasons in a ten-season window. The 2026 fit uses every available season from 2019 through 2025. The shared parameters are estimated by maximum a posteriori probability while the player states are integrated out:
\[ \hat\theta = \underset{\theta}{\arg\max} \left\{ \log\int p(y_{\mathrm{train}}\mid z,\theta) p(z\mid\theta)\,dz +\log p(\theta) \right\}. \]
The Gaussian integral is evaluated exactly in sparse precision form; player states are not optimizer coordinates.
In-season online fit
Given fitted parameters \(\hat\theta\), estimate the player states from prices observed before date \(t\):
\[ p(z_t\mid y_{<t},\hat\theta). \]
Carry the state distributions forward, predict a given set of matches, then condition on the new prices. This is implemented as an information-form Kalman update.
Output
The model supplies player-level strengths, surface effects, historical trajectories, matchup probabilities, and uncertainty. These are available as weekly rankings.