Бот спортивной аналитики: как я проверил модель и признал, что рынок точнее
Бэктест на 4150 матчах дал 51,3% попаданий против 47,3% у правила «всегда хозяева», но линия контор угадывает 53,8% против 51,5% у модели. Я признал, что рынок точнее, и перестроил продукт на поиск лучшей цены.
Коротко (TL;DR)
- Заказчик хотел бота, который считает вероятности исходов матчей, ищет цену лучше линии, раскладывает бюджет по экспрессу на 15 матчей и ведёт банк с журналом.
- Я собрал модель на Python без сторонних библиотек, на открытых данных по футболу, НХЛ и КХЛ, и проверил её бэктестом по времени: обучение только на прошлом, проверка только на будущем.
- На 4150 матчах модель угадала 51,3% исходов против 47,3% у стратегии «всегда хозяева». Но на 9911 матчах линия контор угадывает 53,8%, модель — 51,5%. Рынок точнее, и продукт я перестроил с «угадывания» на поиск лучшей цены.
- Бэктест — это история, а не гарантия. Ставки остаются риском, и в этом кейсе речь о модели и о честной проверке её точности, а не о способе заработать.
Этот кейс не про ставки. Он про то, что происходит, когда статистическую модель честно проверяют на истории, а результат оказывается не таким, как хотелось. Мне кажется, это самая полезная часть проекта, и именно поэтому я её не прячу.
Задача
Заказчик пришёл с понятным списком. Бот должен считать вероятности исходов матчей, искать цену лучше линии, раскладывать бюджет по экспрессу на 15 матчей, вести банк и журнал всех решений. То есть не просто присылать прогнозы, а быть рабочим инструментом с учётом денег и истории.
За этим списком стоял вопрос, который заказчик вслух не задавал: а модель вообще умеет что-то, чего не умеет рынок? От ответа зависело, каким получится продукт. Поэтому с него я и начал, а интерфейс оставил на потом.
Что я сделал
Модель написал на Python, только на стандартной библиотеке языка, без сторонних пакетов. Это сознательное решение: такой код проще проверить глазами, его нечем сломать при обновлении зависимостей, и он запускается на любом сервере без подготовки.
Данные взял из открытых источников по трём направлениям: футбол, НХЛ и КХЛ. Каждый источник пришлось приводить к одному виду, чтобы модель видела матчи одинаково, откуда бы они ни пришли.
Дальше собрал вокруг модели то, о чём просил заказчик:
- сравнение с коэффициентами закрытия, то есть с последней ценой перед началом матча;
- консенсус нескольких контор, чтобы видеть не одну линию, а общую картину рынка;
- режим «уверенные прогнозы», где остаются только случаи с высокой уверенностью модели;
- раскладку бюджета по экспрессу на 15 матчей, учёт банка и журнал.
За ботом стоит живой оператор с консолью ответов: вопросы, которые бот сам не закрывает, уходят человеку, и он отвечает из одного окна. Вход в бота — по кодовому слову, чтобы доступ был только у тех, кому его дали.
Как я проверял модель
Главная ловушка любой прогнозной модели — подглядывание в будущее. Если при обучении модель хоть краем видит матчи, которые потом же и предсказывает, цифры получаются красивыми и ничего не значат. Поэтому бэктест я сделал строго по времени: модель учится только на прошлом и проверяется только на матчах, которые идут после.
Первая проверка — на 4150 матчах. Модель угадала 51,3% исходов. Сама по себе цифра мало что говорит, поэтому я сравнил её с простой базой: стратегия «всегда ставить на хозяев» даёт 47,3%. Модель лучше наивного правила на четыре пункта. Это хороший знак, но ещё не ответ на главный вопрос.
Вторая проверка — сравнение с рынком на 9911 матчах. Здесь линия контор угадывает 53,8%, а модель — 51,5%. То есть рынок точнее модели. Не на погрешность, а заметно.
Почему я перестроил продукт
Можно было сделать вид, что второй цифры нет. Показать 51,3% против 47,3%, красиво подать и запустить бота, который «угадывает». Но это был бы продукт, построенный на неправде: если рынок точнее, то пользоваться моделью как угадывателем — значит пользоваться худшим инструментом при наличии лучшего.
Поэтому я перестроил логику. Модель больше не пытается переугадать рынок. Её задача — искать места, где цена отличается от консенсуса в лучшую сторону. На истории такой подход дал +7% ROI. Отдельно проверил режим уверенных прогнозов: одинарные исходы при уверенности модели от 60% на 594 случаях дали 74,6% попаданий.
И здесь важно сказать прямо: всё это цифры на прошлых матчах. Бэктест — это история, а не гарантия. Прошлое распределение исходов не обязано повториться, рынок меняется, а ставки остаются риском потерять деньги. Этот текст — не совет делать ставки и не обещание выигрыша.
Что было сложно
Техническая сложность — данные. Открытые источники по разным видам спорта отдают матчи в разном виде, с разными названиями команд и разной полнотой. Прежде чем модель что-то считает, эти данные нужно собрать в одну таблицу без дублей и дыр.
Методическая сложность — не обмануть себя. Бэктест по времени медленнее и скучнее случайного разбиения, и цифры в нём всегда хуже. Но только он показывает, как модель вела бы себя в реальности, где будущего никто не знает.
Самая сложная часть — не техническая. Признать, что рынок точнее модели, и сказать об этом заказчику до запуска, а не после. Это меняет продукт, меняет подачу и убирает самый продающий аргумент. Зато оставляет честный.
Когда бот увидел первый живой пользователь, он нашёл 3 ошибки. Все три я закрыл в тот же час. Это обычная история: сколько ни проверяй сам, человек со стороны нажимает не туда, куда ты ожидал.
Что получилось
| Проверка | Выборка | Результат |
|---|---|---|
| Модель против «всегда хозяева» | 4150 матчей | 51,3% против 47,3% |
| Модель против линии контор | 9911 матчей | 51,5% против 53,8% |
| Поиск лучшей цены | история | +7% ROI |
| Одинарные при уверенности от 60% | 594 случая | 74,6% попаданий |
Все строки таблицы — результаты на прошлых матчах. Они описывают, как модель вела себя на истории, и не обещают, как она поведёт себя дальше.
В итоге у заказчика бот с моделью на открытых данных, консенсусом контор, режимом уверенных прогнозов, банком, журналом и живым оператором за ним. А главное — понимание, что именно этот инструмент умеет, а что нет.
Что дальше
Дальше модель проверяется уже не на истории, а на живых матчах, и журнал это фиксирует. Если живые цифры разойдутся с бэктестом, это будет видно по журналу, а не по ощущениям. Именно для этого журнал и нужен: чтобы решения принимались по записям.
Частые вопросы
Модель угадывает лучше рынка?
Нет. На 9911 матчах линия контор угадывает 53,8%, модель — 51,5%. Поэтому модель используется не как угадыватель, а как инструмент поиска цены, которая отличается от консенсуса.
Что такое бэктест по времени?
Проверка, в которой модель учится только на матчах из прошлого, а оценивается на матчах, которые были после. Так она не может подсмотреть ответ и показывает честную точность.
Значит ли +7% ROI, что бот приносит деньги?
Нет. Это результат на истории. Бэктест — это история, а не гарантия. Будущие матчи могут вести себя иначе, и ставки остаются риском потерять деньги.
Почему на Python без сторонних библиотек?
Такой код легче читать и проверять, его не ломают обновления зависимостей, и он запускается на любом сервере без установки пакетов.
Зачем за ботом живой оператор?
Не на каждый вопрос бот отвечает сам. Такие вопросы уходят человеку в консоль ответов, и пользователь не остаётся без ответа.
Коротко о главном
Модель на открытых данных по футболу, НХЛ и КХЛ обыгрывает наивное правило «всегда хозяева», но уступает рынку. Я это измерил, сказал об этом заказчику и перестроил продукт под то, что модель умеет на самом деле: искать лучшую цену, а не угадывать.
Главный вывод кейса шире спорта. Измерить свою модель и признать, что рынок сильнее, ценнее любых красивых обещаний. Хорошая проверка иногда убирает самый продающий аргумент, зато оставляет продукт, которому можно верить.
Если у вас есть прогнозная модель, расчёт или гипотеза, которую нужно честно проверить на истории и понять, работает ли она лучше простого правила, я могу собрать такую проверку и бота вокруг неё. Напишите в Telegram, MAX или VK.
Что я делаю для бизнеса
- Боты в Telegram, MAX, VK
- Автоматизация процессов и CRM
- Аналитика и дашборды
- Сайты и лендинги под ключ
Бесплатно: чек-лист «Готов ли ваш бизнес к 152-ФЗ»
12 пунктов, которые проверяют готовность за час: данные, согласия, уведомление в РКН, локализация, защита. Отметьте, что уже сделано, и увидите дыры, за которые сейчас штрафуют.
Готовы обсудить вашу задачу?
Бесплатная консультация — разберём, как внедрить это в вашем бизнесе под ключ. Без форм, пишите напрямую.
Разборы, кейсы и практика — без воды. Выходит регулярно, читать 3–5 минут.


