Библиотека сайта rus-linux.net

Спортивная аналитика на Linux: как из коэффициентов сделать data-проект

Знакомое чувство: хочется пет-проекта, где код встречается с реальным миром, а не перекладывает JSON из одного места в другое. Живые данные, своя модель, момент истины — угадал или нет. Обычно за этим лезут в крипту или погоду, но есть площадка поинтереснее, мимо которой проходят из-за рекламного шума — ставки на спорт.

Смотрите: есть событие с неизвестным исходом, есть букмекер, который оценил его шанс одним числом — и почти наверняка где-то ошибся. Ваше дело — написать код, который эту ошибку найдёт. Теория вероятностей, парсинг и статистика в одном флаконе, причём с мгновенной обратной связью: матч закончился — модель либо права, либо нет. А поверх математики цепляет простой азарт: через пару недель ловите себя на том, что в воскресенье ждёте матч сразу с двух сторон — и чем кончится игра, и как отработала ваша модель. Так код незаметно затягивает в спорт, даже если раньше он был побоку.

Ниже — на чём потренироваться, как это вообще считается и как собрать рабочий стенд на Linux за вечер.

Цель — модель, которая обыгрывает букмекера

Задача на словах простая: собрать модель, которая оценивает шансы матча точнее букмекера — стабильно, на дистанции, эффективно выжимая сигнал из данных. Для этого нужно три вещи:

  • данные — результаты, статистика, котировки и побольше истории, чтобы было на чём проверять;
  • признаки — то, что реально влияет на исход: форма, составы, xG, очные встречи, плотность календаря;
  • инструменты — чем всё это собирать, хранить и считать (вот тут Linux в своей стихии).

Сразу без иллюзий: будь это решаемо голой математикой, выпускники физтехов давно обанкротили бы контор. Не обанкротили — маржа зашита в кэф, да и в самих БК сидят сильные аналитики. Но это и не рулетка, где анализировать нечего в принципе: спорт — горы данных, на которых реально построить прогноз точнее рыночного.

На чём тренироваться: турниры ближайших месяцев

Живого потока данных в ближайшие месяцы хоть отбавляй:

  • 11 июня — 19 июля: Чемпионат мира по футболу. 48 сборных, сотни рынков, движение линий в реальном времени.
  • Лето — киберспорт. Мейджоры по CS2 и Dota 2 почти без пауз, данные структурированные.
  • С августа — регулярные футбольные лиги. АПЛ, Ла Лига, Бундеслига: новый срез статистики каждые выходные.

Парсить два десятка сайтов руками смысла нет — удобнее отталкиваться от агрегаторов, где линии контор уже сведены вместе. Например, в Беттинг-центре Legalbet на странице матчей видно, какие коэффициенты выставили букмекеры на Чемпионат мира.

Что вы на самом деле считаете

Коэффициент — это перевёрнутая вероятность: единица делённая на кэф даёт шанс события по версии конторы (2.00 → 50%, 4.00 → 25%). Сложите все исходы матча — выйдет больше 100%, и этот излишек и есть маржа. Условно, на кэфе 2.00 вы в нуле при 50% захода и в плюсе только, если заходит чаще. Значит, вся задача сводится к одному — находить матчи, где реальная вероятность выше зашитой в линию.

А вот её-то точно и не вычислить: формулы «хозяева побеждают на 63,4%» не существует. Есть только модель, которую вы кормите теми самыми признаками и проверяете на дистанции. Десять ставок подряд выиграет кто угодно наугад — это везение; а плюс на сотне-другой случайностью уже не объяснить, вот там и видно, работает модель или нет.

Откуда конкретно тянуть данные

Перед тем как лезть скрейпить сайты вручную, проверьте — почти всё уже отдают по API в чистом JSON. Два типа источников.

Статистика и результаты:

  • football-data.org — фикстуры, таблицы, составы по топ-лигам. Бесплатный тир щедрый, отдаёт готовый JSON;
  • API-Football — почти всё (события, статы, линейки, коэффициенты) по сотням лиг. Бесплатно ~100 запросов в день — для прототипа за глаза;
  • Understat — главное сокровище для моделей: xG, xA по топ-5 лигам с сезона 2014/15, есть Python-обёртка understat;
  • football-data.co.uk — CSV с результатами и историческими кэфами за 30+ лет. Идеально для бэктеста, качается без всяких ключей.

Коэффициенты:

  • The Odds API — линии 40+ контор по 70+ видам спорта, простой REST, есть бесплатный тир;
  • прямой скрейпинг агрегаторов и сайтов БК — крайний вариант, когда нужного рынка нет в API.

Про скрейпинг — честное предупреждение. У букмекеров и крупных агрегаторов парсинг почти всегда против правил, прилетает Cloudflare и баны по IP. Если без него никак: ставьте адекватные задержки между запросами, кэшируйте страницы локально, уважайте robots.txt и не долбите сайт в сто потоков. Сами котировки сравнивать нагляднее на готовых витринах вроде той же подборки выше — а свой парсер точить на источниках, которые сами зовут это делать (открытые API и CSV).

Ставим стек

Системные пакеты ставим через apt, а Python-библиотеки — в изолированное окружение (venv). На Debian 12+ и свежих Ubuntu пакеты в систему через pip уже не поставить — мешает PEP 668, да и держать проект в своём окружении просто чище.

# системные пакеты
sudo apt install python3-venv sqlite3

# окружение под проект
python3 -m venv ~/odds/venv
source ~/odds/venv/bin/activate

# библиотеки
pip install requests beautifulsoup4 pandas jupyterlab


  • requests + beautifulsoup4 — стянуть и распарсить страницу с котировками;
  • pandas — крутить выборки и считать;
  • sqlite3 — хранить историю без сервера БД (идёт в составе Python, отдельный пакет нужен только для CLI-утилиты);
  • jupyterlab — проверять гипотезы по шагам.

Парсим и считаем вероятность

Минимальный расчёт вероятностей из кэфов на pandas:

import pandas as pd

df = pd.DataFrame({ "odds": [2.10, 3.40, 3.60]}) # П1, X, П2
df["prob"] = 1 / df["odds"]
margin = df["prob"].sum() - 1
df["fair_prob"] = df["prob"] / df["prob"].sum() # вероятность без маржи

print(df)
print(f"Маржа букмекера: {margin:.1%}")

fair_prob — очищенная от комиссии оценка букмекера. Это самый простой способ снять маржу (делим пропорционально); для серьёзной модели есть точнее — например, метод Шина или odds-ratio, которые не размазывают комиссию поровну. Но для старта пропорционального хватает. Дальше сравниваете эту оценку со своей моделью и ищете, где расходится.

Автоматизируем сбор

Чтобы не дёргать парсер руками, вешаем его на cron. Открываем crontab -e и добавляем запуск раз в час. Два момента: cron не выполняет activate, поэтому бьём прямо в питон из venv (иначе скрипт не увидит библиотеки), и тильду cron не разворачивает — путь только полный, от /home :

0 * * * * /home/user/odds/venv/bin/python /home/user/odds/parser.py >> /home/user/odds/log.txt 2>&1

История копится в SQLite, пока вы занимаетесь своими делами. Через пару недель накопится выборка, на которой уже можно строить и проверять гипотезы — без истории любые выводы пустые.

Где тут ИИ

Грех на Linux игнорировать то, что половина рутины теперь делегируется. Парсер, чистка данных, каркас модели — отличная работа для терминального ИИ-агента: тот же Claude Code живёт прямо в консоли, читает ваш репозиторий, пишет и правит код, гоняет скрипт и показывает результат — не выходя из привычного окружения.

Но один нюанс перекрывает весь хайп: ИИ уверенно врёт цифрами. Спросишь у языковой модели статистику по матчам — и она с серьёзным лицом выдаст несуществующие. Поэтому код ему доверить можно, а факты и данные — только проверенные из источника. ИИ здесь второй пилот, а не оракул.

Куда расти

Когда цикл «спарсил → сохранил → посчитал» заработает, открывается простор: модель на Пуассоне для футбольных счётов, бэктест стратегий на накопленных данных, дашборд в Jupyter или Grafana, телеграм-бот с алертами на расхождения. Всё штатными средствами Linux, без единой проприетарной зависимости.

Что в сухом остатке: не касса, а живой data-проект — парсинг, база, модель, автоматизация. И бонусом спорт, который вдруг становится интересно смотреть через призму собственных чисел.



(C) В.А.Костромин, 1999 - 2026 г.
Яндекс цитирования Яндекс.Метрика