Сколько стоит минута: 200 тысяч партий Lichess о том, как часы съедают рейтинг

Игрок с рейтингом 2100+ в блице, у которого на часах больше минуты, ошибается примерно как игрок 2300. Когда на часах остается меньше пяти секунд, доля грубых ошибок у того же игрока такая, как у 1400 со спокойным запасом времени. Почти тысяча пунктов рейтинга теряется на последней минуте.
Эту цифру я получил на открытой базе Lichess и сначала ей не поверил. Ниже рассказываю, откуда она, где я сам ошибся по дороге и какая часть эффекта на самом деле приходится на сложность позиции.

Откуда данные
Lichess каждый месяц выкладывает все сыгранные рейтинговые партии в открытый доступ: database.lichess.org, файл за месяц весит около 30 ГБ в сжатом виде. Внутри обычный PGN. В комментариях к ходам есть две вещи, которые мне были нужны:
%clk 0:02:47: сколько времени осталось у игрока после хода;%eval 0.34: оценка позиции движком Stockfish, которую сервер Lichess посчитал, когда кто-то запросил анализ партии.
Оценка есть примерно у каждой десятой партии. Я читал поток базы за август и сентябрь 2026 года и оставлял только партии, где оценка стоит у 90% ходов и больше. Из 1 938 881 просмотренной партии таких набралось 200 000. В анализ пошли пуля, блиц и рапид: 195 035 партий и 5,8 млн ходов.
Скачивать весь файл не нужно. Поток распаковывается на лету и обрывается, когда набрано нужное число партий: 60 тысяч партий с оценками набираются меньше чем за минуту.
Что я считаю зевком
Оценка в пешках плохо подходит для сравнения: потерять пешку при равенстве и потерять пешку при лишней ладье это разные вещи. Поэтому я перевожу оценку в шанс на победу по той же формуле, что использует Lichess:
def win_chance(cp): # cp: оценка в сотых пешки
return 50 + 50 * (2 / (1 + math.exp(-0.00368208 * cp)) - 1)
Зевок: ход, после которого шанс на победу у сходившего падает на 15 процентных пунктов и больше. Это порог, при котором Lichess ставит ходу «??».
Еще три фильтра:
первые пять ходов не считаю, там дебют по памяти;
считаю только ходы из позиций, где перевес меньше трех пешек. В выигранной или проигранной позиции «зевок» почти ничего не значит;
время на часах беру перед ходом, то есть сколько было у игрока, когда он начал думать.
Весь подсчет в одном скрипте
Ниже скрипт, которым можно проверить главный результат за минуту. Ему нужен только Python 3.14 или новее: распаковка сжатых файлов там уже встроена, ставить ничего не надо. Он сам скачивает партии из базы Lichess, ничего не сохраняет на диск и печатает таблицу.
#!/usr/bin/env python3
# Сколько стоит минута: доля грубых ошибок в блице в зависимости от времени на часах.
# Нужен только Python 3.14+ (распаковка zstd встроена). Запуск: python3 minuta.py 20000
import math, re, sys, urllib.request
from compression import zstd
URL = "https://database.lichess.org/standard/lichess_db_standard_rated_2026-09.pgn.zst"
NEED = int(sys.argv[1]) if len(sys.argv) > 1 else 20000 # сколько партий с оценками собрать
MOVE = re.compile(r"\{ \[%eval (#?-?[\d.]+)\] \[%clk (\d+):(\d+):(\d+)\] \}")
BUCKETS = [(0, 5), (5, 10), (10, 20), (20, 30), (30, 60), (60, 10**6)]
def win_chance(cp):
"""Оценка в сотых пешки -> шанс на победу в процентах (формула Lichess)."""
return 50 + 50 * (2 / (1 + math.exp(-0.00368208 * cp)) - 1)
def to_cp(text):
"""'0.34' -> 34, '#-3' (мат) -> -1000."""
if text.startswith("#"):
return -1000 if "-" in text else 1000
return max(-1000, min(1000, round(float(text) * 100)))
stats = {b: [0, 0] for b in BUCKETS} # корзина времени -> [ходов, зевков]
games = 0
stream = zstd.ZstdFile(urllib.request.urlopen(URL))
event = ""
for raw in stream:
line = raw.decode("utf-8", "replace")
if line.startswith("[Event "):
event = line
if not line.startswith("1. ") or "Blitz" not in event or "%eval" not in line:
continue
moves = MOVE.findall(line) # (оценка, ч, м, с) после каждого хода
if line.count("{") - len(moves) > 1: # где-то нет оценки: пропускаем партию
continue
evals = [to_cp(m[0]) for m in moves]
clock = [int(m[1]) * 3600 + int(m[2]) * 60 + int(m[3]) for m in moves]
for i in range(40, min(80, len(moves))): # ходы с 20-го по 40-й
before, after = evals[i - 1], evals[i]
if i % 2 == 1: # ход черных: смотрим с их стороны
before, after = -before, -after
if abs(before) >= 300: # позиция уже решена
continue
blunder = win_chance(before) - win_chance(after) >= 15
seconds = clock[i - 2] # сколько было на часах перед ходом
for lo, hi in BUCKETS:
if lo <= seconds < hi:
stats[(lo, hi)][0] += 1
stats[(lo, hi)][1] += blunder
games += 1
if games >= NEED:
break
print(f"Партий блица с оценками: {games}")
for (lo, hi), (n, b) in stats.items():
label = f"{lo}+ c" if hi == 10**6 else f"{lo}-{hi} c"
print(f"{label:>9}: зевков {100 * b / n:5.1f}% (ходов {n})")
Что он делает, по шагам и без программистских слов:
Открывает файл Lichess за сентябрь как поток. Файл весит 30 ГБ, но целиком его никто не скачивает. Скрипт читает его кусками, как видео в интернете смотрят без скачивания, и останавливается, когда наберет нужное число партий.
Пропускает все лишнее. Берет только блиц и только партии, где у ходов есть оценка движка. Остальные девять партий из десяти просто пролистывает.
Вынимает из записи партии две вещи на каждый ход: оценку позиции после хода и сколько секунд осталось на часах. В файле это выглядит так:
{ [%eval 0.34] [%clk 0:01:47] }.Для каждого хода с 20-го по 40-й смотрит три вещи: сколько было на часах перед ходом, какой был шанс на победу до хода и какой стал после. Если шанс упал на 15 пунктов и больше, это зевок. Ходы из уже решенных позиций не считает.
Раскладывает ходы по корзинам времени: меньше 5 секунд, 5-10, 10-20 и так далее. В каждой корзине считает, сколько всего ходов и сколько из них зевков.
Печатает долю зевков в каждой корзине.
Запуск: python3 minuta.py 5000. На 5 тысячах партий блица у меня это заняло 6 секунд, и вышло так:
Партий блица с оценками: 5000
0-5 c: зевков 19.4% (ходов 216)
5-10 c: зевков 18.9% (ходов 808)
10-20 c: зевков 15.9% (ходов 1734)
20-30 c: зевков 15.4% (ходов 1740)
30-60 c: зевков 14.3% (ходов 5425)
60+ c: зевков 12.8% (ходов 30569)
Здесь все рейтинги вместе и выборка маленькая, поэтому цифры шумнее, чем в статье. Но картина та же: чем меньше времени, тем больше зевков. Таблицы в статье посчитаны тем же способом на 200 тысячах партий, с разбивкой по рейтингу и дополнительными проверками, о которых ниже.
Первый результат: кривая

На графике блиц, только ходы с 20-го по 40-й. Почему только они, объясню ниже.
Кривая растет у всех. Игроки 2100+ с запасом в три минуты и больше зевают на 7% ходов, а с остатком меньше пяти секунд на 16,3%. У игроков 1500-1799 рост с 12,7% до 20,3%. До 1200 доля зевков с 19,7% доходит до 33%, это каждый третий ход.
Дальше я сделал то, что дало заголовку цифру. Взял игроков, у которых на часах минута и больше, и построил зависимость «рейтинг → доля зевков» по сотням рейтинга. Получилась гладкая убывающая кривая: 1200 зевают на 17,7% ходов, 1800 на 12,1%, 2300 на 7,2%. По ней любую долю зевков можно перевести обратно в рейтинг. Так получился график в начале статьи: игрок 2100+ с минутой и больше на часах похож на 2320, с 10-20 секундами на 1820, с 5-10 секундами на 1710, с остатком меньше пяти секунд на 1380.
У других групп то же самое. Игроки 1800-2099 с остатком меньше пяти секунд зевают как 1080 со спокойным временем, игроки 1500-1799 как 1090.
Где я ошибся в первый раз
В первой версии таблицы я считал все ходы с 6-го. Результат был еще эффектнее, но неправильный. Запас в три минуты бывает в начале партии, а остаток в пять секунд в конце. Начало партии проще: позиция знакомая, фигур много, угрозы видны. Получалось, что я сравниваю не «мало времени против много времени», а «конец партии против начала».
Поэтому все цифры выше посчитаны только по ходам с 20-го по 40-й. Это середина партии, где встречаются и те, кто в цейтноте, и те, кто нет.
Второй подвох: цейтнот случается в трудных позициях
Даже в середине партии остается проблема. В цейтнот попадает тот, кто долго думал. А долго думают в сложных позициях, где и без всяких часов ошибиться легче. Может быть, в последние секунды зевают не из-за часов, а из-за позиции, которая к ним привела?
Проверить это помог простой прием. В шахматах соперники ходят по очереди, и два соседних хода делаются почти в одной и той же позиции. Я взял пары соседних ходов, где у одного игрока на часах меньше 10 секунд, а у его соперника минута и больше. Рейтинги соперников отличаются не больше чем на 150. Сложность позиции у них общая, а время разное.
Здесь я ошибся второй раз, и это поучительнее первой ошибки. Для контроля я взял пары, где у обоих игроков запас времени. Второй ход в паре зевал в два раза чаще первого: 9,7% против 5,0%. Таких чудес не бывает. Оказалось, виноват мой же фильтр: я выбрасывал ходы из уже решенных позиций. Если первый игрок зевнул, позиция часто становилась решенной, и ход второго выпадал из выборки. Пары, где первый зевнул, отсеивались, и первый игрок выглядел аккуратнее, чем есть.
После исправления (фильтр стоит только перед первым ходом пары, второй ход берется всегда) контроль стал симметричным: 12,4% и 12,6%. Теперь результат:

В обычной позиции, когда у обоих есть время, зевков 12,5%.
В позиции, где один из игроков в цейтноте, его соперник с запасом времени зевает на 14,2-14,8% ходов. Позиции действительно труднее обычных.
Игрок в цейтноте в той же позиции зевает на 17,7-18,2% ходов.
Пар с цейтнотом в блице 12 166, интервалы не пересекаются. Из прироста примерно в 5,5 пункта около двух дает сложность позиции, около трех с половиной сами часы. Так что честная формулировка заголовка такая: на последней минуте игрок теряет в качестве ходов сотни пунктов рейтинга, и примерно две трети этой потери приходятся на нехватку времени, а треть на позицию, в которой он оказался.
Странная таблица: кто дольше думал, тот чаще зевал
Попутно я посмотрел, связана ли доля зевков с тем, сколько секунд игрок потратил на ход. Брал только ходы, когда на часах было от 30 секунд до 3 минут, то есть цейтнота еще нет.
Потратил на ход | меньше 1 с | 1-3 с | 3-10 с | 10-30 с | 30 с и больше |
|---|---|---|---|---|---|
Блиц, доля зевков | 3,1% | 5,8% | 10,5% | 15,5% | 19,8% |
Если читать в лоб, выходит «не думай, ходи сразу». Это та же ловушка, что в предыдущем разделе, только в чистом виде. Быстро ходят в простых позициях: взятие в ответ на взятие, единственный ход, заготовка. Долго думают там, где трудно. Время на ход здесь показывает сложность позиции, а не помогает и не мешает. Хорошая иллюстрация того, почему без парного сравнения выводы о часах делать нельзя.
Флажок упал, а позиция была выиграна
Отдельно я посмотрел на партии, проигранные по времени: какая оценка была на доске у того, у кого упал флажок, по последней оценке перед концом.

всего поражений по времени | выигрывал (+3 и больше) | лучше (+1…+3) | примерно равно | хуже или проигрывал | |
|---|---|---|---|---|---|
Пуля | 27 095 | 33,2% | 3,7% | 10,6% | 52,5% |
Блиц | 17 093 | 21,7% | 3,8% | 14,6% | 59,9% |
Рапид | 5 535 | 17,7% | 3,2% | 13,6% | 65,5% |
В блице каждое пятое поражение по времени случается в позиции, где у проигравшего было три пешки перевеса и больше. Еще 18% в равной или чуть лучшей позиции. Всего 40% флажков падают у тех, кто на доске не проигрывал.
Еще одна деталь. Сильные игроки попадают в цейтнот чаще слабых. В блице до остатка меньше 10 секунд хотя бы раз за партию доходят 13% игроков до 1200 и 23% игроков 2100+. Слабые партии чаще заканчиваются раньше, грубой ошибкой. Сильные доигрывают до конца, и часы для них становятся отдельным соперником.
Помогает ли добавление
Lichess позволяет играть с добавлением: например, 3+2 означает 3 минуты на партию и 2 секунды за каждый ход. Я сравнил популярные контроли:
Контроль | партий | закончились по времени | доля зевков при остатке меньше 10 с |
|---|---|---|---|
3+0 | 27 735 | 25,1% | 15,5% |
3+2 | 18 659 | 21,7% | 14,3% |
5+0 | 18 042 | 19,8% | 19,1% |
5+3 | 13 240 | 19,1% | 18,1% |
Разница есть, но меньше, чем я ожидал. С добавлением партии реже заканчиваются флажком, а качество ходов в цейтноте почти то же. Добавление не делает последние секунды спокойными, оно только дает их больше.
Ограничения
Отбор партий. Оценка движка есть только там, где кто-то запросил анализ. Я сравнил такие партии с остальными на другой выборке Lichess (60 тысяч партий за четыре месяца, из них около 27 тысяч блиц). В блице средний рейтинг 1639 против 1627, длина почти та же, до остатка меньше 10 секунд доходят одинаково (29% и 29%). Ничьих среди проанализированных чуть меньше, 3,7% против 4,5%: ничьи реже разбирают.
Оценки посчитал сервер Lichess, на ограниченной глубине. Для порога «потерял 15 пунктов шанса» этого хватает, для тонких ошибок нет.
«Рейтинговый эквивалент» сравнивает только долю грубых ошибок. Это не значит, что игрок 2100 в цейтноте понимает шахматы как 1400: о понимании позиции метрика ничего не говорит.
Рапид в цейтнот почти не попадает. Ходов с остатком меньше 10 секунд там мало, поэтому выводы в основном про блиц.
Даже парный тест убирает не все. Соседние ходы делаются в почти одинаковых позициях, но все же не в одной и той же. И игроки в паре разные.
Что из этого следует
Если перевести на практику:
Минута на часах дороже, чем кажется. У игрока 2100+ разница между «30-60 секунд» и «меньше 5 секунд» в доле грубых ошибок, как между 2180 и 1380. Потратить 40 секунд в дебюте на ход, который знаешь, значит заплатить за это в конце.
Выигранную позицию надо доигрывать на часах, а не на доске. Каждое пятое поражение по времени в блице приходится на позицию с перевесом в три пешки и больше. Простой ход сейчас лучше сильного через 20 секунд.
Не делайте выводов «думай быстрее» из своей статистики. Время на ход в первую очередь показывает, насколько трудной была позиция. Вредно ли раздумье само по себе, эти данные не говорят.
Короткий скрипт выше повторяет главный результат. Остальные скрипты (разбивка по рейтингу, парный тест, графики) такие же небольшие. Если будет интерес, выложу их на GitHub целиком.
Я делаю бесплатный разбор шахматных партий с тренером, dumayhodom.ru. Отсюда и интерес к тому, где именно любители теряют очки.
KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.