In late 2023, the chess world was gripped by controversy when Grandmaster Hikaru Nakamura achieved an astonishing 45-win, 1-draw streak in online Bullet chess. Accusations of foul play quickly surfaced, driven by the sheer improbability of such a run. However, a rigorous 2025 statistical analysis by University of Toronto statistics professor Jeffrey Rosenthal concluded that the accusations were mathematically unfounded [1].
This raises a critical question for the everyday player: if a 45-game win streak isn't proof of cheating, what does "statistically suspicious" performance actually look like?
To answer this, we analyzed a dataset of over 12,800 Lichess Bullet games across rating bands from 800 to 1900 (adjusted to Chess.com equivalents). By examining centipawn loss, perfect-game rates, and win-streak probabilities, we can demystify the markers used by anti-cheat algorithms and provide a roadmap for how human players actually improve.
The Myth of the "Perfect" Game
A common misconception is that playing a game with zero blunders and a near-zero Average Centipawn Loss (ACPL) is a definitive sign of engine assistance. Our data reveals a surprising truth: "perfect" games happen all the time, even at the beginner level.

As the chart above demonstrates, a player in the 800-1000 Chess.com rating band produces a sub-5 ACPL game (with zero blunders or mistakes) in roughly 5.8% of their games. Why? Because Bullet chess is fast and chaotic. Many games end in quick checkmates, early resignations, or timeouts before either side has the opportunity to make a mathematically significant error.

When a game is short, the ACPL remains artificially low. A single "perfect" game is statistically meaningless in Bullet chess. Anti-cheat systems look for sustained perfection across long, complex games, not isolated brilliancies.
Visual Evidence: The Short "Perfect" Game
Consider this textbook opening trap. If a game ends here, the winner will have a near-zero ACPL, despite playing entirely standard, memorized moves.
A standard opening sequence that results in a "perfect" engine evaluation if the game ends quickly.
The Reality of Human Error
If perfect games aren't suspicious, what does normal human play look like? The answer lies in the distribution of errors.

Remarkably, the mean ACPL barely moves as ratings increase from 800 to 1900. The average Bullet game is inherently sloppy, hovering around 110-115 ACPL regardless of the player's skill level. The difference between an 800-rated player and a 1500-rated player isn't that the 1500 plays like an engine; it's that the 1500 blunders slightly less often and capitalizes on their opponent's mistakes more efficiently.

Visual Evidence: The Human Blunder
Real human errors in Bullet often involve catastrophic, single-move blunders under time pressure.
A typical beginner blunder (red arrow) where a massive advantage is thrown away in a single move. The engine's preferred move (green arrow) maintains the advantage.
What Does a Cheater Actually Look Like?
Anti-cheat algorithms, such as those developed by Ken Regan and utilized by major platforms, do not rely on single-game ACPL [2]. Instead, they analyze the distribution of a player's moves over time, comparing them to the top choices of a chess engine (T1 match rate).

In Bullet chess, a high T1 match rate is surprisingly common across all rating bands, again due to forced sequences and short games.

However, a true cheater's distribution looks fundamentally different from a human's.

A human's ACPL distribution has a long, fat tail, representing games where they tilted, blundered heavily, or got crushed in the opening. A player using an engine will have an ACPL distribution tightly clustered near zero, lacking the natural variance of human play. It is the absence of bad games, rather than the presence of good ones, that flags a cheater.
Visual Evidence: The Engine-Tier Move
In long, complex games, humans inevitably make sub-optimal moves. An engine, however, will consistently find the absolute best continuation, even in obscure positions.
In a 113-move game, maintaining a sub-5 ACPL requires finding obscure, precise moves (green arrow) consistently, rather than natural human continuations (red arrow).
The Mathematics of a 45-Game Win Streak
Returning to Nakamura's controversial streak: how likely is a 45-game unbeaten run? Using a Monte Carlo simulation based on our dataset, we modeled the probabilities for different player profiles over a 200-game session.
| Profile | Expected Score | P(No-Loss ≥ 45) | Median Longest Win Streak |
|---|---|---|---|
| Elite (3000) vs 2700 | 0.872 | 17.4% | 21 |
| Strong (2500) vs 2300 | 0.789 | 0.67% | 14 |
| Club (1700) vs 1500 | 0.789 | 0.76% | 14 |
| Beginner (1100) vs 1100 | 0.527 | 0.0% | 6 |

The results are striking. For an elite player like Nakamura (rated ~3000) playing against a pool of strong but significantly weaker opponents (rated ~2700), a 45-game no-loss streak occurs in roughly 17.4% of 200-game sessions.
Far from being a statistical impossibility, such a streak is a regular occurrence for a player of his caliber against that specific opponent pool. As Rosenthal's paper concluded, the streak was entirely consistent with Nakamura's established skill level and the rating differential [1].
Actionable Advice for Climbing the Ranks
Based on the data, here is a roadmap for improving your Bullet rating:
- 800 - 1000: Focus entirely on board vision and avoiding one-move blunders. The data shows this band averages nearly 2 blunders per game. Simply not hanging your queen will win you games.
- 1000 - 1200: Speed is key. Your ACPL won't improve much, but your ability to flag opponents will. Practice playing simple, solid moves quickly rather than searching for the perfect tactic.
- 1200 - 1400: Start reducing mistakes (100-200 cp losses). This means improving your tactical awareness and not falling for simple forks or pins in the midgame.
- 1400 - 1600: The blunder rate finally starts to drop here. To break through, you need to capitalize on your opponent's inaccuracies while maintaining a solid time advantage.
- 1600+: At this level, the game becomes about positional understanding and endgame technique under extreme time pressure. The margins are smaller, and consistent, sub-optimal but fast play often beats slow, perfect play.
Data and Methodology
This analysis was conducted using a dataset of 12,803 Lichess Bullet games, collected via the Lichess API. Ratings were adjusted to approximate Chess.com equivalents for clarity. The Monte Carlo simulation modeled 20,000 independent 200-game sessions for each player profile.
View full data →band_label lichess_band_lo lichess_band_hi chesscom_band_lo chesscom_band_hi site color elo opp_elo result time_control eco opening ply_count moves avg_cpl median_cpl blunders mistakes inaccuracies zero_cpl_moves perfect_move_pct near_perfect_move_pct max_cpl CC 800-1000 (Lichess 1100-1300) 1100 1300 800 1000 https://lichess.org/2G7BliMp W 1150 1148 1-0 60+0 C40 Elephant Gambit 49 25 163.48 172 12 3 1 7 28.0 28.0 609 CC 800-1000 (Lichess 1100-1300) 1100 1300 800 1000 https://lichess.org/2G7BliMp B 1148 1150 1-0 60+0 C40 Elephant Gambit 49 24 173.29 235 12 3 2 6 25.0 25.0 600 CC 800-1000 (Lichess 1100-1300) 1100 1300 800 1000 https://lichess.org/dfcgwEAd W 1243 1269 0-1 60+0 C46 Three Knights Opening 42 21 38.62 0 1 2 3 13 61.9 61.9 217 CC 800-1000 (Lichess 1100-1300) 1100 1300 800 1000 https://lichess.org/dfcgwEAd B 1269 1243 0-1 60+0 C46 Three Knights Opening 42 21 39.9 0 1 3 3 14 66.67 66.67 239 CC 800-1000 (Lichess 1100-1300) 1100 1300 800 1000 https://lichess.org/qMdwNkpY W 1223 1234 1-0 180+0 B00 Nimzowitsch Defense: Kennedy Variation, Linksspringer Variation 35 18 117.94 62 5 3 1 6 33.33 33.33 1272
View full data →band_label lichess_lo lichess_hi chesscom_lo chesscom_hi n_player_games mean_cpl median_cpl p10_cpl p90_cpl mean_zero_cpl_move_pct n_perfect_like_games perfect_like_rate_pct CC 800-1000 (Lichess 1100-1300) 1100 1300 800 1000 2502 115.2 99.19 9.02 245.38 41.21 189 7.554 CC 1000-1200 (Lichess 1300-1500) 1300 1500 1000 1200 2446 114.58 104.65 9.45 239.74 41.03 164 6.7048 CC 1200-1400 (Lichess 1500-1700) 1500 1700 1200 1400 2485 115.53 101.24 9.65 242.57 40.55 193 7.7666 CC 1400-1600 (Lichess 1700-1900) 1700 1900 1400 1600 2600 110.99 96.62 10.53 233.56 41.35 185 7.1154 CC 1700-1900 (Lichess 1800-2000) 1800 2000 1700 1900 2770 109.7 96.72 10.24 238.85 41.87 183 6.6065
View full data →band sub5_acpl_pct sub10_acpl_pct blunder_free_pct n_player_games 800-1000 5.758 9.301 18.356 2032 1000-1200 5.154 7.9 17.63 2076 1200-1400 5.086 9.006 19.879 2143 1400-1600 5.21 8.168 18.146 2265 1700-1900 4.72 7.382 18.637 2479
View full data →band threshold_pct share_pct n k 800-1000 60 36.909 2032 750 1000-1200 60 33.574 2076 697 1200-1400 60 34.064 2143 730 1400-1600 60 32.583 2265 738 1700-1900 60 33.32 2479 826
View full data →profile rating_self rating_opp session_games sessions_simulated expected_score_per_game draw_prob_per_game p_no_loss_streak_ge_45 p_win_streak_ge_45 p_no_loss_streak_ge_30 p_no_loss_streak_ge_20 median_longest_win_streak p99_longest_win_streak max_observed_win_streak max_observed_no_loss_streak Elite (3000), opp 2700 [Nakamura-like] 3000 2700 200 20000 0.8723 0.0668 0.17405 0.00925 0.642 0.97215 21 44 76 143 Strong (2500), opp 2300 2500 2300 200 20000 0.7888 0.0911 0.00665 5e-05 0.11895 0.59675 14 28 45 71 Club (1700), opp 1500 [CC ~1500] 1700 1500 200 20000 0.7888 0.0911 0.00755 0.0 0.11895 0.59405 14 28 44 98 Beginner (1100), opp 1100 [CC ~800] 1100 1100 200 20000 0.5272 0.1198 0.0 0.0 0.0 0.00185 6 12 22 29
Chess Coach 2026-04-17
References
[1] Rosenthal, J. S. (2024). A Statistician Analyzes a World Champion's Games. Harvard Data Science Review. https://hdsr.mitpress.mit.edu/pub/ex6vbavk/release/2 [2] Chess.com. (n.d.). Chess.com Fair Play. https://www.chess.com/cheating