Snooker ELO-Inspired Scores and Dashboard
Snooker Player Data Analytics
New ELO-inspired scoring to reflect latest forms and strength
Visualization and Interactive Dashboard available at HERE
Method A
In this approach, apart from typical ELO, recent abilities to make 70+ breaks are taken into consideration. Average score for all players is 1500.
ELO is handled on frame level
For a Match between player1 and player2, we have expected frame win rate for player1 as:
$$P_{1,2} = \frac{1}{1+e^{(S_1-S_2)/400}}$$
Where $S_1$ and $S_2$ are the scores of player1 and player2 respectively. After a match, the scores are updated as:
$$S_1’ = S_1 + K \cdot (F_1 - T_{1,2} \cdot P_{1,2})$$
$$S_2’ = S_2 + K \cdot (F_2 - T_{2,1} \cdot P_{2,1})$$
Where:
- $F_1$ and $F_2$ are the actual frame wins for player1 and player2 respectively
- $T_{1,2} = T_{2,1} = F_1 + F_2$ is the total frames played in the match
- $P_{2,1} = 1 - P_{1,2}$ is the expected frame win rate for player2 against player1
- $K$ is a constant that determines the sensitivity of score updates
This so far is standard frame-wise ELO, satisfying the Zero-Sum property, meaning the total score of both players remains constant after a match, because:
$$T_{1,2} = T_{2,1} = F_1 + F_2$$
$$P_{2,1} + P_{1,2} = 1$$
Count of 70+ breaks is introduced
$$S_1’’ = S_1’ + M \cdot (B_1 - G \cdot F_1) $$
$$S_2’’ = S_2’ + M \cdot (B_2 - G \cdot F_2) $$
Where:
- $B_1$ and $B_2$ are the counts of 70+ breaks for player1 and player2 respectively
- $G$, usually around 0.31-0.33, is the season global average of 70+ breaks per frame, calculated as total 70+ breaks divided by total frames in the season
- $M$ is a constant that determines the weight of 70+ breaks in the score
Now the Zero-Sum property is no longer satisfied on the match level, since two players could play both well (many 70+) or bad and therefore have both positive or negative changes in scores.
However, on a season level, the average score of all players remains constant, because we compared player’s match performance against the seasonal average 70+ breaks per frame, and the total 70+ breaks and total frames are fixed for the season, and therefore the total score change from 70+ breaks across all players will sum to zero.
Method A score prior to 2026 World Open last 64:
| Rank | Player Name | Latest Score |
|---|---|---|
| 1 | Zhao Xintong | 2406.340808642514 |
| 2 | Mark Selby | 2378.5029682660784 |
| 3 | Judd Trump | 2328.046582784832 |
| 4 | Wu Yize | 2323.810588553531 |
| 5 | Chang Bingyu | 2293.6605320392305 |
| 6 | John Higgins | 2264.31645446841 |
| 7 | Kyren Wilson | 2236.3574342426523 |
| 8 | Mark Allen | 2228.2852619426403 |
| 9 | Barry Hawkins | 2191.193175970828 |
| 10 | Zhou Yuelong | 2187.0799682827574 |
| 11 | Shaun Murphy | 2178.3587654488315 |
| 12 | Ronnie O’Sullivan | 2123.3886251770477 |
| 13 | Xiao Guodong | 2109.266799325858 |
| 14 | Jack Lisowski | 2109.135987267064 |
| 15 | Elliot Slessor | 2092.8455557749594 |
| 16 | Neil Robertson | 2083.49485922483 |
A demonstration of Score evolution since 2022/2023 season for Judd Trump, Zhao Xintong and Mark Selby:

Method B
The main problem for Method A is that the number of total frames in a match is not fixed.
Expected Number of Frames won
Method B calculates the expected number of frames won by players. For a scenario when player 1 wins k frames and player 2 wins r frames, the probability of this scenario is calculated as:
$$P(F_1=k,F_2=r,k \gt r) = \binom{k+r-1}{r} \cdot P_{1,2}^k \cdot P_{2,1}^r$$
$$P(F_1=k,F_2=r,k \lt r) = \binom{k+r-1}{k} \cdot P_{1,2}^k \cdot P_{2,1}^r$$
Where $P_{1,2}$ and $P_{2,1}$ are the expected frame win rates for player1 and player2 respectively, calculated as in Method 1.
Considering all scenarios, the expected number of frames won by player1 and player 2 are:
$$E[F_1] = \sum_{k}{} \sum_{r}^{} k \cdot P(F_1=k,F_2=r)$$
$$E[F_2] = \sum_{k}{} \sum_{r}^{} r \cdot P(F_1=k,F_2=r)$$
Then the score updates are calculated as:
$$S_1’ = S_1 + K \cdot (F_1-E[F_1])$$
$$S_2’ = S_2 + K \cdot (F_2-E[F_2])$$
In this case, there is no match level zero-sum property. Take example of a match where Zhao Xintong best an amateur player 4-3:
- Method A would deduct Zhao’s score because he has about 90+% expected frame win rate but only won 4 out of 7
- Method B would increase Zhao’s score slightly because he won more frames than expected (but very close to 4)
- Both Methods would increase the amateur player’s score significantly because he won much more frames than expected
Therefore, we need a solution to balance out the inflation of scores caused by Method B, introducing:
Score Decay and Recovery
For a match on day $t$ for a player. Check their last match’s date $t’$, if $\Delta t=t-t’>7$, it triggers decay or recovery before we evaluate the matches expected number of frames won by players.
- if the player’s current score is below 1500 and their historical highest score, we “recover” their score by an amount proportional to $\Delta t$ and the difference between current score and historical highest, with a maximum cap.
- else, if the player’s current score is above its historical average score, we “decay” their score by an amount proportional to $\Delta t$ and the difference between the current score and the historical average, with a maximum cap.
By adjusting the hyperparameters of decay and recovery, we can control the overall inflation of scores caused by Method B, keeping the overall average around 1500.
This “decay and recovery” mechanism also helps to reflect players’ current forms more accurately, as elite players who have been inactive for a while will have their skills regressed towards their average, and players with lower scores will recover from the break.
A important note to this method is that an initialization of players’ estimated scores are recommended (or a burn-in period), otherwise the historical average would not be accurate.
Method B score prior to 2026 World Open last 64:
| Rank | Player Name | Latest Score |
|---|---|---|
| 1 | Mark Selby | 2960.1461099128837 |
| 2 | Zhao Xintong | 2753.019490099193 |
| 3 | Wu Yize | 2546.3414952509206 |
| 4 | John Higgins | 2426.842646091861 |
| 5 | Mark Allen | 2391.3486734734875 |
| 6 | Judd Trump | 2333.2611272735026 |
| 7 | Barry Hawkins | 2284.461814312875 |
| 8 | Ronnie O’Sullivan | 2235.531035051619 |
| 9 | Xiao Guodong | 2234.5004336109746 |
| 10 | Elliot Slessor | 2213.436021451588 |
| 11 | Jack Lisowski | 2210.7400483689507 |
| 12 | Kyren Wilson | 2191.188032900559 |
| 13 | Zhang Anda | 2176.361755067192 |
| 14 | Shaun Murphy | 2159.3051323349814 |
| 15 | Chang Bingyu | 2128.725427902105 |
| 16 | Chris Wakelin | 2116.705502290573 |
A demonstration of Score evolution since 2022/2023 season for Judd Trump, Zhao Xintong and Mark Selby:

Prediction for 2026 World Open last 64:
source:
- For rankings: snooker.org
- For matches results: cuetracker.net
sourcecode: