← back to journal

K Is Doing Two Jobs

2026-10-08 · Kit Wickham

Elo has one knob, K: how many points move after each game. Pick it too small and ratings can't keep up with players who improve; too big and every lucky win throws a rating around. I wanted to know what the right K is, and whether Glicko, the fancier system that tracks how sure it is about each player, is worth the extra machinery. Short answers: when everyone plays steadily, the best K is about twice how much a player's skill changes per game, and a well-tuned Elo is as good as Glicko. On real chess games it isn't close. On four months of lichess games, the best fixed K got only 69% to 78% of Glicko's improvement over a coin flip. Most of that gap goes away if K simply shrinks as a player's game count grows.

A formula for K

Treat a rating as an estimate of a moving target. After each game it moves K points times the surprise (result minus expected score). Two kinds of error pull in opposite directions. Each update adds noise, because one game says little; that grows with K. And between games the player's real skill wanders; a small K lags behind. If each game moves skill by a random amount with spread d Elo points, and games are between roughly even players, linearizing the update gives a steady-state error whose minimum sits near

K ≈ 2d

More exactly it's d/√(p(1−p)), averaged over pairings, which is a bit more than 2d when players are unevenly matched. FIDE's K of 20 for most established players, if it were optimal, would imply skill moving about 10 points per rated game.

To check the formula, I simulated 1,000 players with true skills spread 200 Elo points, each drifting a little every round, everyone playing one random opponent per round. Eight seeds per setting, 8,000 scored rounds after a 4,000-round warm-up. With equal skills and no drift, the simulated error matched the formula within 2.2% for K from 4 to 32. With a spread of skills and drift, it matched within 7.3% everywhere from K = 2 to 80, after I added a term for skills that stay in a fixed range instead of wandering off forever:

Line chart of simulated Elo rating error, in Elo points RMS, against K from 2 to 80 on a log scale, for skill drift of 2, 5, 10 and 20 points per game. Each drift has a U-shaped formula curve with measured dots lying on it. Minima: about 29 points near K = 4 for drift 2, about 46 near K = 12 for drift 5, about 65 near K = 20 to 24 for drift 10, and about 90 near K = 40 for drift 20. Dotted vertical lines at K = 4, 10, 20 and 40 mark twice the drift and sit at or just left of each minimum. At the largest K all curves converge near 90 to 100.

The formula's best K for drift 2, 5, 10 and 20 is 4.8, 11.7, 22.5 and 41.4; the simulation's best in my grid was 4, 12, 20 to 24, and 40. And in this tidy world Glicko had nothing to add. With its own drift setting tuned, its rating error was within 2% of the best Elo's for every drift from 2 to 20, and its predictions were better by at most 2.1 millinats of log-loss per game.

Real players don't play steadily

The formula assumes every player gets one game per unit of drift. Real rating pools break that in two ways. Some players play every day and some once a month, so per-game drift differs a lot between them. And new players arrive with no rating at all, when the right step size is huge, not 2d.

Both showed up in the simulation. With drift 5, I made 20% of players play every round and the rest one round in 20. The regulars' error was lowest at K = 12 (46 points) and the occasional players' at K = 40 (98 points); at K = 12 the occasional players were off by 120, at K = 40 the regulars by 64. No single K serves both. Glicko, which widens its uncertainty with the time since a player's last game, got 46 and 96. Adding newcomers did the same: each round, every player had a 1-in-2,000 or 1-in-200 chance of retiring and being replaced by a new, unrated player.

Extra log-loss of the best fixed-K Elo over the best Glicko, in millinats per game (positive means Glicko predicts better):

drift / gamesteady playuneven play1/2,000 newcomers1/200 newcomers
20.11.84.611.5
50.24.02.48.8
100.75.11.44.9
202.13.62.01.4

Newcomers hurt fixed K most when skill moves slowly, because then the right K for veterans is tiny and the right K for a beginner is still enormous. The best fixed K in the high-churn column was 32 at every drift up to 10: a compromise set by the beginners. Glicko lost one of the 30 scenarios I ran, by 1.8 millinats, with the fastest drift, uneven play and heavy churn all at once.

Lichess

For real games I used the lichess open database (CC0): every rated game from January to June 2013, about 963,000 bullet, blitz and classical games after dropping abandoned ones, each speed rated as its own pool. Every system started from scratch on January 1, and I scored next-game predictions from March 1 on: about 200,000 to 280,000 games per pool. The score is log-loss, with a draw counted as half a win. Guessing 50% every time scores 0.6931.

The pools look nothing like the steady simulation. 80% to 84% of players have fewer than 30 games in a pool, while the busiest 10% play 75% to 86% of all games. The median gap between one player's consecutive games is 4 minutes in bullet and 25 in classical.

log-loss per gamebulletblitzclassical
coin flip0.69310.69310.6931
Elo, best fixed K (32)0.61370.64210.6410
Elo, K = A/(games+5)0.4, best A0.59820.62820.6289
Elo, K = 1200/(games+4), min 40.59320.62180.6256
Glicko-2, best of 24 settings0.59130.62000.6225
Glicko, drift 5 pts/√day0.59140.61900.6225

Counting from the coin flip, the best fixed K got 78%, 69% and 74% of Glicko's improvement. The second row is the schedule FiveThirtyEight used for its tennis Elo; it gets 88% to 93%, or 60% to 70% of the way from the best fixed K to Glicko. The third row, K shrinking like one over the number of games played with a small floor, gets 96% to 98%. That's the Elo version of "your rating is the average of all your games," which is roughly what Glicko does when skill barely drifts.

Line chart of extra log-loss compared with Glicko, in millinats per game, against fixed K from 4 to 128 on a log scale, for bullet, blitz and classical lichess games. All three curves are U-shaped with minima at K = 32: about 22 for bullet, 23 for blitz and 18 for classical. At K = 4 they are 37 to 46, at K = 128 about 60 to 68. Dashed horizontal lines for Elo with K = 1200 over games plus 4 sit between 2 and 3 for all three pools, just above the zero line that marks Glicko.

Two checks on where the rest of Glicko's edge comes from, in blitz. Turning off Glicko's use of the opponent's uncertainty when updating changed nothing (0.6191). Turning off its use of uncertainty when predicting, so that a game between two newcomers is predicted as confidently as one between veterans, cost 3.1 millinats (0.6221), almost exactly the shrinking-K Elo's score. So nearly 90% of the gap is the step size, and the rest is knowing when to say "I'm not sure who wins."

The data also say something about how fast skill moves. Glicko's score was nearly flat for drift settings from 0 to 10 points per √day (0.6196 to 0.6190 in blitz) and got worse above that. At 5 points per √day, with these players' gaps between games, a typical game moves skill by 3 to 4 points, which by the formula wants K around 7 or 8 for the regulars. The best fixed K was 32 anyway, because the beginners set it. For the shrinking-K Elo, any floor from 0 to 8 scored within 0.0011 of the best. Glicko-2's extra piece, a per-player volatility it learns, didn't help: in every pool its best setting started volatility at the lowest value I tried, and it came within 0.001 of plain Glicko's best without beating it.

What I'd take from it

Limits: one site, one half-year, and from 2013, when lichess was young and full of new players; a mature pool with fewer newcomers would shrink the gap, as the simulation's newcomer columns suggest (it does, partly; see the follow-up below). Every system's settings were picked on the same games they were scored on, from grids of a few dozen settings each. To check how much that flattered them, I later picked each system's best setting on March and April only and scored it on May and June. Glicko, Glicko-2, the FiveThirtyEight schedule and fixed K in bullet and classical picked the same setting either way; the others' picks cost at most 0.5 millinats per game, and the shares of Glicko's improvement came out the same within a point (fixed K 69% to 78%, shrinking K 96% to 98%). No system modeled white's advantage (white scored 52% to 53%), and draws (about 3%) were scored as half a win. The simulation's drift is a random walk that stays inside a fixed spread, which is my guess at how skill moves, not a measurement. About 240 simulation runs and a few dozen replays of the lichess games for the numbers here.

Follow-up: a more mature pool

Added 2026-10-08. The limits above guessed that a mature pool would shrink the gap. To test it I replayed May and June 2016 from the same database: 12.3 million games, 57,000 to 112,000 players per pool, three years after the games above. Same systems, same grids of settings, scored on June: 1.6 to 2.7 million games per pool. I started the systems two ways. "From scratch" is the method above, everyone unrated on May 1. "Seeded" starts each player, at their first game in my data, from the rating lichess showed for them before that game, which is the closest I can get to a system that has known everyone for years. Glicko also needs an uncertainty for the seed; I tried 50 to 250 points, and 160 to 200 did about equally well for players with 30 or more games, so I used 200.

best fixed K, share of Glicko's gainbulletblitzclassical
2013, from scratch, all games78%69%74%
2013, from scratch, known players86%78%82%
2016, from scratch, all games83%76%74%
2016, from scratch, known players89%80%79%
2016, seeded, all games85%77%75%
2016, seeded, known players93%89%91%

"Known players" means games where both players already had 30 or more games in my data. So the guess was right, but only halfway. Among known players in the seeded replay, the best fixed K trailed Glicko by 6.2 to 7.4 millinats per game, down from 13 to 16 in 2013. Over all games the share barely moved: 13% to 29% of June games involved someone with fewer than 30 earlier games in my data, and a fixed K still fits them badly. The shrinking-K Elo tied Glicko on known players (within 0.3 millinats in every pool) and got 97% to 99% overall. Glicko-2 again came within about 1% of plain Glicko without beating it.

Why does a fixed K still lose on players the system knows well? The formula above says the best K is about twice the per-game drift, and per-game drift depends on how often someone plays. Grouping the seeded June games by how much the two players played over the two months (the geometric mean of their game counts, used only for grouping), the best fixed K fell steadily with activity. Each cell is the group's best K, then how far it trailed Glicko in millinats per game:

games in May–Junebulletblitzclassical
60 to 20032, 7.732, 7.732, 6.3
200 to 60024, 8.520, 6.816, 4.9
600 to 2,00016, 5.112, 4.38, 1.3
over 2,0006, 1.76, 1.5(too few)

Even with its group's own best K, Elo trailed, because a group still mixes players coming back from a break with players who never stopped, and Glicko widens its uncertainty with time away. Turning that widening off cost Glicko 1.5 to 2.3 millinats per game on known players.

One more comparison. The pre-game ratings in the files are lichess's own, built from all of a player's games on the site. As predictions they did best after shrinking every rating gap by 15% to 20%, and then scored within 1.4 millinats of my Glicko started from scratch on May 1, either way, on known players. Glicko seeded with them beat them by 1.4 to 3.2. Lichess tunes its ratings for players to look at, not for predicting the next game, so this isn't a flaw on its part; it does say that one month of games predicted about as well as a player's whole history on the site.

Limits of the follow-up: the seed uncertainty and every system's settings were again picked on the games they were scored on, and it's still one site. About 30 replays of the 2016 games.