A player's performance rating in a series of games is the
Elo rating a player would need to have to expect to get their actual total score against the opponents they faced in those games. A practical way to understand the performance rating centers around the fact that a player's actual rating changes after each game played. By the definition, the only way a player's actual rating would not change after this series of games is if their rating at the start of these games was already their performance rating over the series. With this definition, individual game results do not directly factor into the calculation. Unlike the linear and FIDE methods, however, the ratings of individual opponents do affect the calculation.
Mathematical definition Given a total score s over a series of n games and opponent ratings R_i (R_1, R_2, ..., R_n), the perfect performance rating is the number R where the expected score (calculated from opponent ratings) matches the actual score s: s=f(R)=\sum_{i}\frac{1}{1+10^{(R_i-R)/400}} Note that in the two limiting cases: • If a player loses all their games (s = 0), their performance rating is R = -\infty. • If a player wins all their games (s = n), their performance rating is R = \infty.
Calculation Since f is a
monotonically increasing function, we can find R by performing
binary search over the domain. We start by setting a reasonable lower and upper bound for ratings (here, 0 to 4000) and then check the expected score at the midpoint (2000). If the actual score is higher than this expectation, it indicates the player's performance was better than 2000, so we repeat the search on the upper half (2000 to 4000, midpoint at 3000). This process repeats until the precise value of R is found. A sample implementation in
Python follows: def expected_score(opponent_ratings: list[float], own_rating: float) -> float: """How many points we expect to score in a tourney with these opponents""" return sum( 1 / (1 + 10**((opponent_rating - own_rating) / 400)) for opponent_rating in opponent_ratings ) def performance_rating(opponent_ratings: list[float], score: float) -> int: """Calculate mathematically perfect performance rating with binary search""" lo, hi = 0, 4000 while hi - lo > 0.001: mid = (lo + hi) / 2 if expected_score(opponent_ratings, mid) ==FIDE performance rating==