In short
- Every player gets a rating from every game in the data, worked out with Glicko-2 and adjusted so the size of a win counts. Ratings start at 1,500.
- Next to the rating is a rating deviation (RD): how sure the system is. The ± band on the rating chart is one RD on each side. It shrinks as a player plays and grows when they take a break.
- The forecast turns two ratings into a chance of a win, a draw and a loss in one game played today. It also looks at how the two have done against each other compared with what their ratings said.
- The ratings and forecasts are rebuilt every day from the latest results.
The rating
Glicko-2 was made by Mark Glickman as an improvement on the Elo system used in chess. Each player has three numbers:
- Rating
- The estimate of playing strength. A new player starts at 1,500.
- Rating deviation (RD)
- The uncertainty of that estimate, in rating points. A new player starts at 350, so their first results move their rating a lot. A regular player settles around 40 to 60.
- Volatility
- How erratic the player's results are. It decides how fast RD grows again, and it is not shown on the site.
After each game both players' ratings move towards the result. The move is bigger when the result was a surprise, when the player's own RD is high, and when the opponent's RD is low. A win over a well-known player counts for more than a win over someone the system knows little about.
What this site changes
It updates after every game. Classic Glicko-2 groups games into rating periods, such as a month. Here each game updates both players straight away, in the order they were played.
It counts the goal difference. Instead of 1 for a win, ½ for a draw and 0 for a loss, a game is worth
score = 1 / (1 + e−0.4 × goal difference)
| Result | Score |
|---|---|
| Draw | 0.50 |
| Win by 1 (for example 3–2, or any overtime win) | 0.60 |
| Win by 2 | 0.69 |
| Win by 3 | 0.77 |
| Win by 5 | 0.88 |
| Win by 8 | 0.96 |
Because a narrow win is worth only a little more than a draw, ratings here spread out less than in systems that count every win as a full point. The numbers can't be compared directly with other rating lists or with the ITHF world ranking.
RD grows with time away. Before each game a player's RD grows by their volatility once for the game itself, and once more for every week since their last game. A player coming back after a long break moves quickly until the system has caught up with them.
Every game counts. That includes games from team events and against players who don't have a page on the site. Players listed under more than one id share one rating.
Settings
| Setting | Value |
|---|---|
| Starting rating and RD | 1,500 ± 350 |
| Starting volatility | 0.3 |
| τ (how fast volatility can change) | 1.5 |
| Extra RD growth | one volatility step per 7 days away |
| Goal-difference scale | 0.4 |
These were not picked by hand. See “How well it works” below.
From ratings to a forecast
The forecast is for one game played today. Both players' RDs are first grown up to today, so a player who hasn't played for a while is less certain, and the forecast moves closer to even.
The rating gap is shrunk by how uncertain both ratings are, using Glicko's g-function:
x = g(√(RDA² + RDB²)) × (ratingA − ratingB) / 173.7
Then the three outcomes follow an ordered logit model:
P(A wins) = σ(2.14 x − 0.29)
P(B wins) = σ(−2.14 x − 0.29)
P(draw) = what's left
where σ(z) = 1 / (1 + e−z). Between two equal players this gives 43% each and a 14% draw. Draws get rarer as the gap grows.
The head-to-head adjustment
Some players beat a particular opponent more often than their ratings say, for example because of their style or the matchup. To catch that, the build keeps track, for every pair, of how each meeting went compared with what the ratings expected at that time: 1 for a win, ½ for a draw, 0 for a loss, minus the expected score.
edge = (sum of result − expected) / (meetings + 20)
x = x + 1.09 × edge
The “+ 20” holds the edge back until there are plenty of meetings. A pair who have met a handful of times barely move. Take two evenly rated players who have met 80 times, where one scored 8 points more than the ratings expected. Their edge is 0.08, which moves the forecast by about 4 percentage points.
The backtest shows about 60% of a long rivalry's past over- or under-performance carries over into the next meeting. The effect also holds after allowing for a player simply being in good or bad form.
Against each nation
Player pages compare a player's results against each opponent nation with what the ratings expected. Before every game the forecast gives an expected score (win chance plus half the draw chance, without the head-to-head adjustment). Adding these up over all games against one nation's players and comparing with the real score (1 for a win, ½ for a draw) shows where a player does better or worse than their rating says.
gap = (score − expected score) / games
The gap is shown in percentage points: +6 means the player scored 6% more of the available points than expected. A small sample can show a big gap by chance, so a nation is only named as over- or underperformed when there are at least 10 games, the gap is at least 3 points, and it is at least 1.645 standard deviations from zero (a 1 in 10 chance or less if the player were really as good against that nation as anywhere else). Faded bars are gaps that are smaller or could be chance.
A player's nation comes from their profile, or their ITHF ranking entry when the profile has none. Games against players with no nation listed are left out.
How well it works
All settings were tuned on games from 2017 to 2021, then tested on the 458,727 games played from 2022 to 2026, which the tuning never saw. Each game was predicted using only results from before it.
| Model | Log loss | Picks the winner |
|---|---|---|
| Elo (K = 24) | 0.771 | 74.9% |
| Elo, tuned | 0.768 | 74.9% |
| Glicko-2, standard settings | 0.767 | 75.0% |
| Elo with goal difference | 0.762 | 75.3% |
| Glicko-2, tuned | 0.761 | 75.3% |
| Glicko-2 with goal difference | 0.755 | 75.7% |
| … plus head-to-head (used here) | 0.753 | 75.9% |
Log loss scores the probabilities themselves, draws included: lower is better. Guessing from how often wins, draws and losses happen overall scores 0.99. “Picks the winner” counts how often the more likely winner won, in games that didn't end in a draw.
The biggest gains are for players with few games. When one of the two had fewer than 30 earlier games, the winner pick goes from 76% with Elo to 82%.
What it doesn't know
- The format. A forecast is for a single game. It doesn't know if the game is a group game or part of a best-of-seven playoff series.
- Anything off the table, such as injuries, travel or a new table.
- Games that aren't in the data sources listed below.
- Results from today. The site rebuilds once a day.
A 70% favourite still loses three games in ten. The forecast says how often, not who will win the next one.