Как проверять прогнозы на истории
Сбор данных и подготовка выборки
Начни с чётких рамок: рынок, период и тип коэффициентов. Для футбола бери топ-лиги за 3 сезона, для тенниса — только турниры ATP/WTA 250 и выше. Ключевое правило — использовать коэффициенты закрытия (closing odds) без заглядывания в будущее: фиксируй котировку ровно в момент ставки, а не после гола или удаления. Если твоя модель выдала прогноз в 18:42 по Москве, бери линию на 18:42, а не итоговую за минуту до свистка. Дальше — жёсткая фильтрация матчей. Отсекай всё, что искажает статистику: товарищеские игры, резервные составы и кубковые встречи с неясной мотивацией. Обязательно ставь порог ликвидности: например, не менее 50 000 ₽ в паре на бирже или наличие коэффициента у пяти и более контор. Перенесённые матчи удаляй или переноси их метки времени, иначе нарушится хронология. Синхронизация времени — частая ловушка. Сервер логов может писать по UTC, букмекер — по Лондону, а ты — по Москве. Приводи всё к одному поясу, например UTC+3, и сохраняй метку с точностью до секунды. Фиксация котировки до ставки означает: записывай цену в момент генерации сигнала. Если ты ставишь в 19:00:15, а к 19:00:30 коэффициент упал — в базу идёт 19:00:15.| Ошибка | Последствие |
|---|---|
| Смешение котировок | Завышенная проходимость на бумаге |
| Игнор ликвидности | Нереальная сумма ставки в тесте |
Формализация прогноза и сигнала
Прогноз — это не «думаю, победит Спартак», а жёсткий набор условий. Для входа в рынок модель должна выдать вероятность не ниже порога, например 58% на исход. Коэффициент букмекера при этом обязан попадать в коридор: для 58% минимальный кэф — 1/0,58 ≈ 1,72, а максимальный — 1,90, чтобы запас на маржу и погрешность оставался. Если модель даёт 62%, диапазон шире: от 1,61 до 2,00. Ниже порога или вне коридора — пропуск без обсуждений. Банкролл дробим единообразно. Самый надёжный старт — флэт 1% от стартового банка, без догона. Когда вы на серии из 500+ ставок и ROI стабилен (например, 3–5% на дистанции), подключайте мягкое масштабирование: 1,25% при просадке не глубже 10% от пика, 1,5% при уверенном плюсе. Резко повышать долю после пары побед — верный путь к сливу. Каждая сделка — строка в журнале. Фиксируйте: доматч или инплей, источник данных (API букмекера, статистика лиги), версия модели (v3.2), причина входа (переоценка тотала из-за травм) и метка риска (низкая/высокая ликвидность рынка). Без этих пометок вы не поймёте, где именно течёт вода: в данных, в пороге или в управлении банком.| Вероятность модели | Мин. кэф | Макс. кэф |
|---|---|---|
| 55% | 1,82 | 1,95 |
| 58% | 1,72 | 1,90 |
| 62% | 1,61 | 2,00 |
Механика симуляции без заглядывания вперёд
Главный принцип честной симуляции — запрет на заглядывание в будущее. Разделите историю на блоки: обучайте модель на «окне» N месяцев, проверяйте на следующем месяце, затем сдвигайте оба окна вперёд без наложения. Это и есть walk‑forward. Альтернатива — rolling window: окно фиксированной длины скользит по календарю шагами, каждый раз переобучаясь и валидируясь на строго следующем отрезке. Перекрытие периодов — грубейшая ошибка: оно «кормит» алгоритм данными из будущего и завышает результат. Политика коэффициента должна быть жёсткой. Берите цену, которая была доступна до матча, а не по факту старта. Если симулируете вход за 2 часа до начала — используйте максимум котировки в этом окне; если за 10 минут — берите цену на 9-й минуте десятиминутки. Отмены и возвраты: рассчитывайте исход по правилам букмекера (например, теннисный отказ — возврат или расчёт по кэшу). Сдвиги линии учитывайте через проскальзывание: если ваш сигнал 2,10, а реальный максимум 2,06 — считайте по 2,06. Для агрессивных входов закладывайте 1–3% «трения» на цену. Комиссии и маржа — то, что медленно «съедает» кривую. На каждую ставку накладывайте издержки: налог или комиссия на ввод/вывод, маржа в линии (отрицательное EV среднего рынка). Лимиты моделируйте честно: если средний максимум на ваш исход — 3000 ₽, не ставьте 10 000 ₽ «на бумаге». Доступность котировки тоже лимит: часть входов будет закрыта из‑за лимитов или снятия маркета — такие попытки помечайте как пропущенные, а не как минусовые.| Параметр | Как моделировать |
|---|---|
| Цена входа | Максимум в окне до старта, минус проскальзывание |
| Отмены/возвраты | Правила БК по виду спорта и рынку |
| Лимиты | Кап по реальному максимуму маркета |
| Издержки | Комиссии и налог — минус от чистой выплаты |
Расчёт метрик эффективности
Базовые метрики — это язык, на котором вы спорите с результатами. ROI показывает возврат к банку: (чистая прибыль / сумма всех ставок) × 100%. YIELD — возврат к оборотам: (чистая прибыль / сумма номиналов) × 100%. CLV (closing line value) — сравнение вашего коэффициента с закрывающим: если стабильно берёте выше закрытия, вы бьёте рынок. На дистанции 500+ ставок YIELD 3–5% — уже крепкий результат; CLV > 0 подтверждает, что это не везение.
Дисперсия — главный обманщик на короткой выборке. Чтобы отличить навык от шума, ориентируйтесь на 500–1000 ставок одной размерности. Стройте доверительный интервал для YIELD: YIELD ± 1,96 × σ/√n, где σ — стандартное отклонение доходностей. Если ноль не попадает в интервал, сигнал статистически значим. Условный пример: 800 ставок, средний ROC 0,8%, σ=5,5% → интервал примерно 0,2–1,4%.
Просадки важнее «плюса на бумаге». Drawdown — максимальная потеря от пика до дна в банке. Смотрите не только глубину, но и длительность. Коэффициент Шарпа: (средний ROC − безрисковая ставка) / σ; Сортино штрафует только за «плохую» волатильность (падения). Медиана ROC защищает от перекоса из-за пары удачных «прессов». Для каппинга разумная цель — Sharpe 0,3–0,6 на выборке 800+; медиана ROC должна быть положительной и близкой к среднему.
| Метрика | Что показывает | Ориентир на 800+ ставок |
|---|---|---|
| YIELD | Доход на оборот | 3–5% — крепко |
| CLV | Бьёте ли закрытие | Систематически выше — плюсовой сигнал |
| Max DD | Худшая просадка | До 20–25% — рабочий риск |
| Sharpe | Доход/риск | 0,3–0,6 — реалистично |
Проверка на устойчивость и смещения
Разбейте историю на срезы, чтобы найти уязвимости. Сравните сегменты: футбол РПЛ и еврокубки, теннис ATP и ITF; коэффициенты до 1.80, 1.80–2.20 и выше; время до старта — прематч за сутки и за 2 часа; источники — линия открытия и закрытия. Если плюс только на высоких кэфах или в одном турнире — это не система, а локальная аномалия. Считайте ROI и просадку отдельно по каждому «ящику». Искажения ломают честную оценку. Backfill — это когда старые прогнозы «дорисовали» под результат: исключайте всё, что появилось после стартового свистка. Селективная публикация — показывают только выигрыши: фиксируйте каждую идею в журнале до матча. Survivorship bias — анализ только выживших турниров или команд: храните реестр лиг и исключённых событий, чтобы не терять «павших». Инфоблок: источники и смещения- Backfill: прогноз после гола — в утиль.
- Селективность: обязателен журнал всех сигналов.
- Survivorship: учитывайте закрытые лиги и снявшиеся команды.
| Сценарий | Средний кэф | Винрейт | ROI |
|---|---|---|---|
| База | 2.00 | 52% | +4.0% |
| Кэф −3% | 1.94 | 52% | ~0% |
| Маржа +2% | 1.96 | 52% | ~+1% |
Журнал и воспроизводимость теста
Любой тест без журнала — это байка у подъезда. Заведи таблицу, где каждая строка — одна симулированная сделка. Минимум полей: дата события, лига и тур, рынок (П1/тотал/фора), коэффициент, размер ставки в долях банка, исход (выигрыш/проигрыш/возврат), комментарий (почему сигнал «щёлкнул», были ли дисквалификации, погода, поздние новости). Без комментария ты не вспомнишь логику через месяц.
Фиксируй «окружение» теста. Присвой версии датасета и кода номера (v1.2_data, v0.9_model), сохрани seed генератора случайных чисел и все гиперпараметры. Если кто-то повторит запуск с теми же входами, он должен получить ту же последовательность сделок и те же метрики до копейки. Условный пример: seed=20261026, window=90 дней, комиссия=0,03, фильтр по рынку=тотал.
- Seed и параметры — в отдельном файле config.yaml.
- Хеш датасета (sha256) — в логе теста.
- Ветка кода и коммит — рядом с результатами.
Ревью коллегой — не формальность. Отдай партнёру только лог, код и config без твоих выводов. Пусть он проверит по чек‑листу и подпишет протокол.
- Нет заглядывания вперёд: дата входа всегда строго до времени фиксации линии.
- Коэффициенты и лимиты соответствуют историческим окнам; нет «подтянутых» к закрытию.
- Банк и доли совпадают с заявленными; нет скрытых догонов.
- Дубли и отмены (push) учтены верно; возвраты не считаются выигрышем.
- Метрики пересчитаны независимо: ROI, yield, дисперсия сходятся до 1e-6.
Выводы
Решение о запуске принимайте по двум осям: метрики и время. Ориентир — винрейт и ROI на уровне не ниже 55% и 3–5% при коэффициенте около 1.90–2.00, просадка не выше 15–20% и минимум 500–700 симулированных ставок на пилоте. Длительность — 6–8 недель реального времени, чтобы захватить разные рынки и дни недели. Если выборка меньше, вы ловите шум, а не сигнал. План мониторинга держите коротким и регулярным. Раз в неделю фиксируйте CLV — разницу вашей цены закрытия и входа: стабильный плюс к CLV подтверждает качество линии. Смотрите долю ставок, взятых лучше закрытия, и средний «edge» в процентах. Проводите короткое ревью: объём, ROI по рынкам, просадка, частота ставок, пропуски сигналов. Если CLV уходит в минус две недели подряд — сигнал деградирует.- Еженедельный срез: объём, ROI, CLV, просадка, винрейт по диапазонам коэффициентов.
- Контроль расписания: нет ли перекоса в «удобные» дни и турниры.
- Проверка лимитов: выдерживаете ли заявленные суммы без сильного сдвига цены.
Частые вопросы
1. Сколько ставок нужно для проверки прогноза на истории
Для статистической значимости требуется выборка от 500 до 1000 независимых ставок, чтобы сгладить влияние дисперсии. На меньших выборках (например, 100 ставок) результат часто определяется случайностью, а не качеством модели. Если вы используете низкодоходную стратегию, ориентируйтесь на верхнюю границу в 1000+ ставок для уверенного вывода.
2. Как учитывать маржу букмекера при бэктестинге
Маржа — это комиссия, заложенная в коэффициенты, и её нужно вычитать из вашей вероятности события перед сравнением. Для расчёта переведите коэффициент в вероятность (1/коэффициент), сложите вероятности всех исходов и вычтите 100% — это и есть маржа. В симуляции всегда используйте «справедливый» коэффициент без маржи, чтобы понять, есть ли у вашего прогноза реальное математическое преимущество.
3. Что такое CLV и как он доказывает качество прогноза
CLV (Closing Line Value) — это ценность линии закрытия, то есть разница между коэффициентом, по которому вы взяли прогноз, и финальным коэффициентом перед началом события. Если ваш средний коэффициент стабильно выше линии закрытия (например, вы берете 2.10, а закрытие 1.95), это доказывает, что ваш прогноз точнее рынка. Положительный CLV на дистанции в 500+ ставок является главным индикатором того, что стратегия будет прибыльной после учёта маржи.
4. Как делать walk‑forward тест без заглядывания в будущее
Разделите исторические данные на обучающую выборку (in-sample) и тестовую (out-of-sample), например, 2 года обучения и 6 месяцев теста. Настройте параметры модели только на первых двух годах, затем проверьте её на следующих шести месяцах, не меняя параметры «задним числом». Сдвигайте окно: после теста добавьте эти 6 месяцев к обучающим данным и снова протестируйте следующие полгода, повторяя цикл.
5. Какой drawdown считать допустимым для стратегии
Допустимый максимальный дроудаун (просадка) зависит от вашего банка и психологической устойчивости, но безопасным считается уровень в 15–25% от пика. Если стратегия показывает исторический дроудаун в 40%, будьте готовы к тому, что в реальности он может достичь 50–60% из-за неучтённых факторов. Размер ставки (флэт или процент от банка) должен рассчитываться так, чтобы даже при удвоении исторического дроудаунa вы не потеряли более 20–30% капитала.