Skip to content
Chessblood

Accuracy · Analysis · Engine

What Is Chess Accuracy? The Formula Behind the Percentage

How chess accuracy is calculated from win probability, why 90% is not a perfect game, and why the same number can mean different things in different games.
Author
Chessblood Team
Published
Reading time
6 min read

After every analyzed game, Chessblood shows an accuracy percentage for each player. It is the most quoted number in a game review and the least understood. Accuracy is not the share of moves that matched the engine, and it is not 100 minus your average centipawn loss. It is a specific calculation built in three steps, and once you have seen the steps you will read the number very differently.

The method follows the approach Lichess published for its own accuracy metric, and the coefficients below are the ones in Chessblood's open code. Credit for working out and publishing the model belongs to the Lichess team.

Step 1: From centipawns to win probability

An engine score such as +1.50 is a measurement in centipawns, where 100 centipawns was historically one pawn. The problem with centipawns is that they are not linear in meaning. Going from 0.00 to +1.00 changes a game a great deal; going from +8.00 to +9.00 changes nothing. So the first step converts every evaluation into a probability of winning:

win% = 50 + 50 * (2 / (1 + exp(-0.00368208 * cp)) - 1)

The score is clamped to plus or minus 1500 centipawns first, and a forced mate counts as 100% or 0%. Here is what the curve looks like at a few points:

EvaluationWin probability
0.0050.0%
+0.5054.6%
+1.0059.1%
+2.0067.6%
+3.0075.1%
+5.0086.3%
+8.0095.0%
+10.0097.5%
+15.00 and beyond99.6%

Two things stand out. A full pawn of advantage is only a 59% expectation, which matches the experience of anyone who has failed to convert a pawn-up position. And the curve flattens quickly: the difference between +8 and +10 is about two points, because both positions are simply winning.

Step 2: From the drop to a move accuracy

Each move is judged by how much win probability the mover gave up. If a move loses nothing, its accuracy is 100. Otherwise:

accuracy = 103.1668 * exp(-0.04354 * (winBefore - winAfter)) - 3.1669

The result is clamped to the range 0 to 100. The shape of this curve is what makes accuracy feel harsh:

Win probability lostMove accuracy
0 points100.0
1 point95.6
2 points91.4
5 points79.8
10 points63.6
20 points40.0
30 points24.8

A worked example: you are a pawn up in an equal structure, the engine says +1.00, and you play a move after which it says -1.00. Your win probability went from 59.1% to 40.9%, a loss of 18.2 points. That single move scores 43.5% accuracy. In classification terms it is a mistake, one step short of a blunder, and the accuracy figure reflects that.

Notice that a move only loses points relative to the best move available. If the position was already lost and you played the best defense, your accuracy for that move is 100 even though the evaluation stayed terrible. Accuracy measures how well you played the hand you had, not how good the hand was.

Step 3: From moves to a game

The obvious way to combine move accuracies is to average them. Chessblood does not do that, because a plain average hides single disasters: a game of forty excellent moves and one blunder would average above 98. Instead the game figure is the mean of two numbers:

  1. A volatility-weighted average. Each move is weighted by how much the evaluation was swinging around it, measured as the standard deviation of win probability over a sliding window of positions, clamped between 0.5 and 12. Moves in sharp, swinging phases of the game count for more than moves in a dead-level ending, because that is where precision was needed.
  2. The harmonic mean of the move accuracies. The harmonic mean is dragged down hard by small values, so one move at 40 pulls it far below what a plain average would show.

Book moves and forced moves are left out, since neither says anything about your play. The final number is the average of the two figures, rounded to one decimal.

Take the worked example above and put it in a 30-move game where White's other 29 moves lose nothing. The plain average of White's move accuracies is 98.1. The harmonic mean is 95.9. The volatility-weighted average is about 89, because the window around the blunder is where the evaluation moved. The final figure is the mean of those last two: 92.6, not 98. That is the design working as intended.

Why 90% is not a perfect game

Ninety percent sounds like an A grade. In accuracy terms it is a game in which, on average, each graded move cost you a little over two points of win probability, which is one inaccuracy every few moves, or one real mistake balanced by a run of precise play. Players who win a clean game and see 90% are often puzzled, and the explanation is usually a stretch of the middlegame where several "fine" moves were each a point or two off the engine's choice.

The reverse also happens. A lost game can score 85% if it was decided by one blunder in an otherwise accurate performance. Accuracy describes the whole game; the result describes one moment.

Why the same number means different things

Accuracy is not comparable between arbitrary games, for several reasons:

  • Position type. In a sharp position with one good move, every decision is high stakes, so both players tend to score lower. In a quiet, symmetrical structure most moves lose nothing, and two club players can both show 95% in a game neither of them would call well played.
  • The opponent. If your opponent never creates problems, your moves never lose probability. A high accuracy against a weak opponent is cheap. A moderate accuracy in a game where you were under pressure for forty moves can be a fine performance.
  • Game length and phase. A 25-move game with a mistake on move 20 shows a lower figure than a 70-move game with the same mistake, because the mistake is a bigger share of the whole.
  • Engine depth. Accuracy is measured against what the engine considers best. At a deeper search the engine finds more precise moves, so your figure typically drops by a few points when you re-run a game at a higher depth. Compare accuracies only when they were produced at the same depth with the same engine.

Accuracy versus average centipawn loss

Older reviews report average centipawn loss (ACPL): the mean, over your moves, of how many centipawns each move cost, usually clamped so that a single catastrophe does not dominate. ACPL is simple and useful, but it has the linearity problem described above. Losing 100 centipawns from +0.3 is a real mistake; losing 100 from +8 is noise, and ACPL counts them the same. It also inflates in winning positions, where the evaluation moves in large jumps that mean little.

Accuracy fixes both problems by working in probability space. The two measures agree on who played better in most games, and Chessblood shows both, but when they disagree, trust accuracy. The accuracy calculator applies these exact formulas and shows the per-move figures, so you can see which moves pulled the number down.

What a good accuracy is

There is no fixed target. Accuracy rises with rating and with time control: the same player will score noticeably higher in classical than in blitz, and higher in blitz than in bullet, because precision takes time. Figures from different sites are not interchangeable, since each uses its own engine depth and thresholds. The useful comparison is your own trend over the last twenty or thirty games at one time control on one tool. If that line is going up, you are improving, whatever the absolute number is.

A single game's accuracy is a weather report. The average over a month is the climate. Train against the climate.

To see where your points go, run a game through the game review and look at the move classifications for the moves below 80. For the engine side of the story, how the evaluations themselves are produced and why they change with depth, see how Stockfish evaluates positions.

Chessblood Team

Written by the people who build Chessblood. Everything we describe about evaluations, accuracy and move classifications refers to the open method used by the analysis on this site; where we quote formulas they are the ones in the code.

About the project · Corrections and suggestions