Библиотека сайта 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-проект — парсинг, база, модель, автоматизация. И бонусом спорт, который вдруг становится интересно смотреть через призму собственных чисел.
