← back to journal

When skill drifts, the best Elo K is set by how fast it drifts

2026-10-15 · Kit Wickham

In the last post players never changed, so a fixed K only had a cost. This time each player's true strength wanders a little after every game they play. A K that shrinks with games played, which was nearly ideal before, now freezes the ratings and loses badly: with skill wandering about 25 Elo points per 100 games, its error was 80 points against 32 for the best fixed K. The best fixed K grew in step with the drift, at about 2.4 times the per-game drift, as a one-line formula predicts. Missing it by a factor of two cost 7 to 17%.

The test

Same league as before: 16 players, true ratings with a standard deviation of 200, random pairings, no draws, everyone starting at 0. Now, each time a player plays, their true rating takes a random step with standard deviation G, plus a slight pull toward the middle so that the field keeps its spread of 200 instead of fanning out. Over 100 games a player's skill wanders about 10·G points. Each league plays 24,000 games (3,000 per player), and I measure the error over the last two thirds, once the ratings have caught up from the start. Error is again the root-mean-square gap between rating and truth, both centred on zero. 1,200 leagues per setting; standard errors are under 0.6 points.

drift per 100 gamesK=8K=16K=32K=64best fixed Kshrinking K
02637537922 (K=6)41
253239547932 (K=6)80
504645568044 (K=12)127
1007463658362 (K=24)178
20011898869286 (K=32)194
400160142125117117 (K=64)194

The shrinking K is 400/(games + 10). By game 1,000 its K is below 0.4, so the ratings barely move, and once drift is fast its error approaches 200, about what you'd get by rating everyone at zero. A floor fixes that: the same rule with K never allowed below 16 scored exactly like a fixed K=16 in every row, because after 15 games the floor is all that's left.

Ordering suffers too. At the best K, the share of neighbouring players in the right order went from 80% with no drift to 71% at 50 points per 100 games and 59% at 400, not much better than a coin flip.

Why the best K tracks the drift

The last post's argument gives the noise half: game-to-game luck keeps a rating's variance at about 87·K. Drift adds a lag half. Each game pulls the rating toward the truth by a fraction a = K·(ln 10/400)·p(1−p) of its error, so the rating trails a moving target, and the trailing adds a variance of G²/(2a). A bigger K shrinks the lag and grows the noise. The sum is smallest at

K* = G / √(p(1−p))

where p(1−p) is the average over games of win chance times loss chance, 0.17 in this league. That makes K* ≈ 2.4·G, or about a quarter of how far a player's skill wanders in 100 games.

drift per 100 gamespredicted K*best K measuredpredicted error at K*measured
256632.531.5
5012124644
10024246562
2004932–489286
4009764130117

The formula holds up to 100 points per 100 games, then overshoots. It treats the drift as an unbounded random walk, while here the pull toward the middle keeps every true rating within a few hundred points of zero. At 400 points per 100 games, a player's skill loses most of its memory within about 50 games, so lag matters less than the formula assumes, and a smaller K than predicted wins.

The error curve is flat near its bottom. At 100 points of drift, K=12 and K=48 (half and double the best) were 7% and 17% worse than K=24. Getting the drift rate roughly right is enough.

So what

A fixed K is a bet on how fast skill changes. Estimate how far a typical player's real strength moves over 100 games, divide by four, and use that as K. Common defaults like K=32 suit fast-changing players, about 130 points per 100 games. For players whose skill moves 40 points or less per 100 games, K=10 or below would rate more accurately, at the cost of following real changes more slowly.

If you shrink K with experience, as you should for players who aren't changing, floor it at the K your drift calls for. Without a floor, a veteran's rating stops responding just when their game changes.

Method: NumPy, vectorised over 400 leagues per run, three runs per setting, on one machine. The drift is a per-game autoregressive step: true rating ← ρ·true rating + G·noise, with ρ = √(1 − (G/200)²) so the spread stays at 200. Only the two players in a game drift at that game. Measured p(1−p) was 0.169 to 0.171 across all settings.