Как проверить свою стратегию на архиве
Подготовка архива данных: источники, форматы, очистка
Начните с сырой базы: линии закрытия топ-бирж и Pinnacle, финальные счета, xG, травмы и стартовые составы. Собирайте всё это в CSV или Parquet, а любые изменения фиксируйте через Git или DVC. Версионирование — ваша страховка: если алгоритм дал сбой, вы всегда откатитесь к прошлой версии данных и поймёте, где ошиблись в очистке. Дальше — нормализация. Переведите все временные метки в UTC, чтобы не путаться в часовых поясах. Каждой игре нужен уникальный ID, иначе матч «Реал»–«Сити» из Кубка и чемпионата сольётся в один. Коэффициенты округляйте до 3–4 знаков, а дубликаты и явные выбросы (например, кэф 100.0 на фаворите) удаляйте или помечайте флагом. Зафиксируйте окно теста: например, сезоны 2022–2025. Чётко пропишите, какие лиги и рынки (тоталы, форы, 1X2) вы берёте. Отдельно отметьте отрезки с низкой ликвидностью — праздники, первые туры после трансферного окна, конец сезона. Там котировки «гуляют», и тест на этих данных будет искажать реальность.Чек-лист нормализации
- UTC для всех дат и времени.
- Единый ID матча по всем таблицам.
- Коэффициенты: 3–4 знака после запятой.
- Фильтр: удалить дубли, проверить лимиты Pinnacle.
Формализация правил стратегии: вход, выход, размер ставки
Триггер входа должен быть однозначным, как формула. Никаких «кажется, команда в форме». Записывайте условие через операторы И/ИЛИ/НЕ и пороги. Например: (xG_дома > 1.8) И (xGA_гости > 1.4) И (H2H_тотал_средний > 2.8) И (кэф_П1Бэктест на истории: движок, комиссии, налоги, лимиты
Движок теста должен считать от линии закрытия за вычетом маржи биржи. Если на закрытии кф 2,00, а комиссия 2%, ваш рабочий кф — 1,96. Условный пример: ставка 1000 ₽, исход зашёл. Выплата 1960 ₽, грязная прибыль 960 ₽. Далее — налоги: для физлиц в РФ удерживается НДФЛ 13% с чистой прибыли за год, а у легальных букмекеров налог на выигрыш до 15 000 ₽ часто удерживается при выплате. Заложите это в P&L: 960 ₽ минус 13% = 835,2 ₽ «на руки». Лимиты тоже важны: режьте объём, если симулированная ставка превышает типичный максимум на рынке в день матча.
Симулируйте реальность, а не идеальную кнопку. Добавляйте задержку приёма 5–60 секунд: берите цену не закрытия, а из потока с поправкой на среднее смещение линии за это время. Проскальзывание моделируйте как случайный сдвиг −0,5%…−3% для ликвидных рынков и до −5% для смол-маркетов. Исключайте матчи с отменами, техническими поражениями и возвратами: если рынок рассчитали возвратом, в тесте это нулевой P&L и фиксация причины.
Логируйте каждую итерацию, иначе выводы будут фантазией. Минимум полей: дата-время, лига, рынок, кф на закрытии, эффективный кф после комиссии, размер, исход, P&L до налога, P&L после налога, задержка, проскальзывание, причина входа или пропуска. Для пропусков фиксируйте триггер: лимит, отсутствие ликвидности, конфликт расписания. Храните лог в таблице — так легко посчитать винрейт, дисперсию и просадки.
| Поле | Пример | Зачем |
|---|---|---|
| Дата, лига | 02.11.2026, РПЛ | Сезонность, ротации |
| Рынок, кф_close | ТБ 2.5, 2,00 | База расчёта |
| k_eff, размер | 1,96; 1000 ₽ | Комиссия учтена |
| P&L до/после налога | +960 ₽; +835,2 ₽ | Реальный доход |
| Задержка/проскольз | 22 с; −1,2% | Проверка устойчивости |
| Причина | Сигнал + ликвидность | Аудит дисциплины |
Ключевые метрики: ROI, CLV, просадка, размер выборки
Считайте ROI (доходность к обороту) и Yield (к банку): ROI = (P&L / сумма всех ставок) × 100%. Для 2000 ставок по 1000 ₽ и прибыли 180 000 ₽ ROI = 9%. CLV — сравнение ваших коэффициентов с линией закрытия. Если брали 1.95 при закрытии 1.85, CLV ≈ +5.4% — рынок признал вашу цену выгодной. Это не гарантия, но сильный сигнал. Фиксируйте средний кф и hit-rate: при кф 2.00 для нулевого ROI нужен hit-rate 50%, при 1.80 — уже 55.6%.
Оцените статистическую значимость. Стандартная ошибка для ROI при hit-rate p и среднем кф μ: SE ≈ sqrt(p(1−p))/ (μ·sqrt(N)). Для 800 ставок, p=0.52, μ=1.95 SE ≈ 1.1%. 95% доверительный интервал — ROI ± 1.96·SE. Если ноль вне интервала, результат вряд ли случайность. Минимальная выборка — 500–1000 ставок; до этого числа любые проценты — шум.
Постройте кривую эквити и гистограмму P&L. Нужен плавный рост без «ступенек» от одной серии и симметричное распределение без тяжёлых левых хвостов. Проверьте устойчивость: посчитайте ROI по лигам и диапазонам кф. Опасно, если всё съедает один турнир или узкий коридор 2.20–2.60. Разбейте выборку на блоки по 200–300 ставок и сравните ROI — сильный разброс говорит о нестабильности.
| Метрика | Зачем | Как считать |
|---|---|---|
| CLV | Оценка «цены» входа | (Ваш кф / Закрытие − 1) × 100% |
| Max DD | Риск по счёту | Пик − Дно, в % от пика |
| SE ROI | Погрешность | sqrt(p(1−p)) / (μ·sqrt(N)) |
Борьба с подгонкой: кросс-валидация, walk-forward
Самый частый самообман — «подгонка» под историю. Чтобы не попасться, жёстко делите архив на три части: обучающую (train), проверочную (validation) и финальную (test). На train ищете параметры, на validation — отсеиваете переобученные варианты, а test открываете один раз, когда правила уже высечены в камне. Заглядывать в тест до финализации — табу: иначе вы невольно подстроитесь под будущее.
Далее проверьте стабильность на разных срезах. Простой k-fold: разбейте train на 5 частей, 4 используйте для подбора, 1 — для проверки; повторите 5 раз, усредните результат. Для ставок лучше скользящее окно (walk-forward): обучились на 2023–2024, валидировали на 2025; сдвинули окно — 2024–2025 обучаем, 2026 валидируем. Если параметры «плывут» от окна к окну — стратегия хрупкая.
Регуляризируйте всё, что настраиваете. Избегайте узких порогов: вместо «берём только 1.87–1.91» оставьте коридор шире и проверьте чувствительность. Комиссии и задержки — фиксируйте едиными на всём горизонте: маржа 4–5%, расчёт по close, лаг клиринга 10–15 секунд. Не меняйте правила «для одного турнира» — это скрытая подгонка.
| Метод | Зачем | Сигнал тревоги |
|---|---|---|
| k-fold | Оценка разброса метрик | СКО ROI > 30% среднего |
| Walk-forward | Проверка во времени | Параметры меняются в 2 раза между окнами |
Условный пример: на train ROI 8%, на validation 7%, на тесте 6% при той же просадке — приемлемо. Если train 20%, validation 5%, test −10% — вы переобучились. Оставляйте только те настройки, которые «выживают» при сдвиге окон и разумном шуме входов.
Анализ ошибок и устойчивость: стресс-тесты и фильтры
Стресс-тесты показывают, выживет ли идея в реальности, а не только в таблице. Сдвиньте коэффициенты на −10–20% от архивных, добавьте +1–2% комиссии и удвоенную задержку приёма. Если после этого просадка растёт вдвое, а ROI падает до нуля — модель хрупкая. Условный пример: средний кф 1,90 превращается в 1,52; при прежней проходимости 55% маржа и задержка съедают почти всю дистанцию.
Проверьте чувствительность к порогам. Чуть сместили тотал или фору — и проходимость рухнула? Значит, вы сидите на пике переобучения. Ищите «плато»: коридор значений, где метрики меняются слабо. Например, для тотала 215,5 протестируйте 214,5–216,5 и шаг 0,5; устойчивый подход даёт ровную линию, а не один резкий всплеск.
| Порог | ROI | Ставок |
|---|---|---|
| −1,0 | 3,2% | 1 200 |
| 0,0 | 2,8% | 1 850 |
| +1,0 | 2,5% | 1 600 |
В примере плато от −1 до +1: метрики стабильны, выборка достаточна. Пик только в −1 — тревожный сигнал.
Исключите утечки будущего. Не берите линии, открывшиеся после уже известных составов и травм; отсекайте послематчевые котировки и «мусорные» рынки, где расчёт идёт по ходу игры. Фильтруйте явные выбросы: кэфы, которые жили меньше 30–60 секунд, и матчи с последующей отменой или переносом. Для тенниса убирайте смену покрытия в архиве, для баскетбола — бэк-ту-бэки без ротации.
Финальная проверка — «тихая» симуляция: прогон на следующем месяце вне обучения. Если плато сохранилось, а стресс-тесты в пределах допуска — стратегия годна к малой полевой доле. Нет — возвращайтесь к правилам и фильтрам.
Форвард-тест на бумаге и микролимиты
После бэктеста не спешите грузить банк. Сначала — «бумага»: две–четыре недели ставите по линии открытия или прематч, но деньги не трогаете. Фиксируйте каждую позицию в таблице: время входа, кф, кф на момент приема, маржа, итог. Важная деталь — берите фактический кф, который дал букмекер при приеме, а не тот, что «нарисовали» в модели. Если котировка ушла — пропускайте, не додумывайте.
Затем переходите на поле, но малым шагом: 10–20% от целевого номинала. Задача — проверить CLV в реальности. Считайте разницу между вашим кф входа и кф закрытия линии (средневзвешенным по нескольким БК на момент после ставки). Если бэктест давал CLV +3%, а на деле выходит −1% — модель переоценивает терпимость рынка. Условный пример: номинал 1000 ₽, вход 2.10, закрытие 2.00 — CLV отрицательный; вход 2.10, закрытие 2.22 — CLV плюсовой, и это добрый знак.
Остановка — не поражение, а гигиена. Два триггера: расхождение ключевых метрик с бэктестом более чем на 20% (ROI, CLV, доля прохода при схожем кф) или просадка выше вашего лимита (например, −15% от тестового банка). В этот день торги закрываете, эмоции — в сторону. Возвращаетесь к правилам: проверьте фильтры, окно времени, требования к кф, влияние маржи и лимитов. Часто «дырка» — поздний прием или игнор движения линии.
| Этап | Срок | Ставка | Что фиксировать | Стоп |
|---|---|---|---|---|
| Бумага | 2–4 недели | 0 ₽ | кф входа/приема, время, причина пропуска | — |
| Микро | до сигнала | 10–20% номинала | CLV к закрытию, комиссии, фактические лимиты | метрики >20% или просадка > лимита |
Выводы: критерии запуска и план мониторинга
Стартуем только при трёх зелёных флажках: CLV стабильно положительный, ROI на тесте держится в коридоре без «лесенки», просадка контролируется правилом 1–2% номинала на ставку. CLV считаем как (средний коэффициент закрытия / средний ваш коэффициент − 1). Если он ниже нуля или скачет — не запускайте: вы покупаете завышенную цену. ROI ниже 2–3% при высокой дисперсии — это шум, а не преимущество. Просадка: при банке 100 000 ₽ и 1% — риск 1000 ₽; серия из 10 минусов −10 000 ₽, и вы не вылетаете из игры.
Поставьте алерты на деградацию процесса, а не только на минус по балансу. Контролируйте: падение CLV на 5–7% неделю к неделе; рост задержек приёма >200–300 мс; сужение лимитов или изменение маржи на 0,5–1 п.п. Ежемесячно сверяйте данные: источники, кэфы закрытия, расчёт комиссии и налогов, исключения по отменам. Ведите реестр версий: дата, изменения фильтров, ожидаемое влияние на ROI/CLV.
- CLV: алерт при скользящем среднем −5% за 7 дней.
- Задержки: алерт при p95 > 300 мс.
- Маржа/лимиты: алерт при росте маржи на 0,5% или урезании лимитов на 30%.
- Аудит: раз в месяц — сверка источников, комиссий, налогов, пропусков.
Журнал решений — ваш чёрный ящик. Записывайте: матч, время входа, ваш кэф, кэф закрытия через 5/15/60 минут, причину, версию стратегии, размер. При деградации двух из трёх метрик (CLV↓, ROI↓, просадка↑) — стоп и откат к предыдущей версии. Если после отката метрики не возвращаются за 2–3 недели — заморозка и ретест на свежем окне.
Условный пример: банк 100 000 ₽, риск 1% (1000 ₽), средний кэф 1.90. План на месяц — 150 ставок, целевой CLV +3%, лимит просадки −15 000 ₽. Пробили лимит или CLV ушёл в −5% неделю — стоп, аудит, откат.
Частые вопросы
1. Как проверить стратегию на архиве матчей и не допустить подгонки?
Используйте только данные, которые были доступны до матча, и фиксируйте правила входа и выхода без исключений. Разделите данные на обучающую (train) и тестовую (test) выборки, не меняя логику стратегии при переходе. Проверяйте устойчивость на разных лигах, сезонах и уровнях коэффициентов, чтобы убедиться, что результат не случаен.
2. Какие метрики реально показывают прибыльность: ROI, CLV или hit-rate?
Ключевая метрика — ROI (доходность на оборот), но без учёта дисперсии она обманчива; дополняйте её максимальным спадом (max drawdown) и Z-score. CLV (закрытие линии) показывает, есть ли у вас теоретическое преимущество относительно рынка, но не гарантирует итоговую прибыль. Hit-rate (процент прохода) без контекста коэффициентов бесполезен: 55% при среднем кэфе 1.30 хуже, чем 45% при 2.20.
3. Как учесть комиссии биржи, налоги и проскальзывание в бэктесте?
Вносите поправки на каждом этапе: для биржи вычитайте комиссию из чистой прибыли (например, 2–5%), а для ордеров используйте цену худшего исполнения в пределах ожидаемого спреда. Налоги применяйте к итоговому финрезультату по правилам вашей юрисдикции, а не к каждой ставке. Проскальзывание моделируйте как фиксированный сдвиг коэффициента (например, −0.02–0.05) или как процент от оборота — это ближе к реальности.
4. Сколько ставок нужно для значимого результата и как делить данные на train/test?
Для первичных выводов ориентируйтесь на 500–1000 ставок или 2–3 полных сезона, чтобы сгладить дисперсию; для уверенного подтверждения — 2000+. Делите данные хронологически: первые 70–80% событий — train, последние 20–30% — test, либо используйте сезонную кросс-валидацию. Если на тесте ROI падает менее чем на 20–30% от трейна, а просадка растёт несильно — это хороший знак.
5. Когда переходить с бумажного теста на реальные деньги и каким номиналом?
Переходите после успешного форвард-теста в реальном времени не менее 4–8 недель, когда вы можете исполнять ставки по заявленным коэффициентам. Начните с 0.25–0.5% от банка на ставку и увеличивайте номинал ступенчато после каждых +20–30% к банку, не превышая 1–2%. Если просадка достигает 25% от стартового банкролла на реальном счёте — остановитесь и пересмотрите модель.