Нейросеть для прогнозов на футбол на Python: где взять данные, как обучить и проверить точность
Пошагово: какие данные нужны модели прогнозов, где их взять через SportAPI, как обучить нейросеть на Python и честно проверить её точность против рынка.

Своя нейросеть для прогнозов на футбол — это не столько архитектура сети, сколько данные и честная проверка. Модели нужны три вещи: история результатов для обучения, актуальные матчи для прогноза и коэффициенты как ориентир, с которым сравнивается точность. В SportAPI всё это есть: API результатов отдаёт итоги матчей с историей за 20 лет и статистикой, а API линии — предстоящие матчи и коэффициенты от $30 в месяц за вид спорта. Остальное делается на Python с pandas и scikit-learn.
Сразу о главном: ни одна модель не гарантирует выигрыш. Хорошая модель отличается от плохой не громкими обещаниями, а тем, что её вероятности на проверочных данных точнее рыночных. Ниже — как к этому прийти по шагам.
Какие данные нужны модели прогнозов
| Данные | Зачем | Где взять в SportAPI |
|---|---|---|
| История результатов: дата, команды, счёт | Обучение модели | API результатов, история за 20 лет |
| Статистика матчей: удары, угловые, карточки | Дополнительные признаки | API результатов, дополнительные показатели |
| Предстоящие матчи | Ежедневный прогноз | Календарь матчей в API линии |
| Коэффициенты | Признак и эталон для сравнения | API линии, prematch |
Одна честная оговорка: исторических коэффициентов в SportAPI нет. Поэтому сохраняйте коэффициенты с первого дня подключения — через несколько месяцев у вас будет собственная история, на которой модель можно проверять против рынка.
Шаг 1. Соберите данные в таблицу
Модель учится на одной таблице, где одна строка — один матч. Минимальный набор столбцов:
date, home, away, home_goals, away_goals, odds_home, odds_draw, odds_away
Результаты прошлых матчей загрузите из API результатов, а коэффициенты начните сохранять ежедневно. Этот скрипт раз в день берёт сегодняшние матчи из календаря API линии и дописывает коэффициенты П1 / Х / П2 в файл:
import csv
from datetime import date
import requests
API = "https://YOUR_API_DOMAIN/v1"
HEADERS = {"Package": "YOUR_SPORTAPI_KEY"}
url = f"{API}/events/1/0/sub/50/line/0/0/ru"
response = requests.get(url, headers=HEADERS, timeout=10)
response.raise_for_status()
with open("odds_history.csv", "a", newline="", encoding="utf-8") as file:
writer = csv.writer(file)
for tournament in response.json()["body"]:
for match in tournament["events_list"]:
odds = {
outcome["oc_name"]: outcome["oc_rate"]
for group in match.get("game_oc_list", []) if group["group_name"] == "1x2"
for outcome in group["oc_list"]
}
writer.writerow([
date.today(), match["game_id"], match["game_start"],
tournament["tournament_name"], match["opp_1_name"], match["opp_2_name"],
odds.get("П1"), odds.get("Ничья"), odds.get("П2"),
])
Запрос /events/1/0/sub/50/line/0/0/ru — это все футбольные матчи сегодняшнего дня из календаря матчей. Поставьте скрипт на ежедневный запуск, и история коэффициентов будет копиться сама.
Шаг 2. Подготовьте признаки
Сеть не понимает названия команд — ей нужны числа. Простые и полезные признаки:
- форма: средние забитые и пропущенные голы в последних 5 матчах;
- дома или в гостях: у большинства команд результаты дома и в гостях заметно различаются;
- вероятности рынка: коэффициенты, пересчитанные в вероятности без маржи;
- статистика: средние удары и угловые за последние матчи — если загружаете дополнительные показатели.
Главное правило: в признаки попадает только то, что было известно до начала матча. Если форма считается с учётом самого матча, модель «подсматривает» ответ и на проверке показывает фантастическую точность, которой в реальности не будет.
Шаг 3. Обучите нейросеть
Для табличных данных не нужна сложная сеть: начните с небольшого многослойного перцептрона из scikit-learn. Код ниже считает форму команд без подсматривания, пересчитывает коэффициенты в вероятности и обучает модель на первых 80% матчей по времени:
import numpy as np
import pandas as pd
from sklearn.metrics import log_loss
from sklearn.neural_network import MLPClassifier
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
df = pd.read_csv("matches.csv", parse_dates=["date"]).sort_values("date").reset_index(drop=True)
df["match_id"] = df.index
df["result"] = np.select(
[df.home_goals > df.away_goals, df.home_goals < df.away_goals], ["H", "A"], default="D"
)
# Форма: средние голы в 5 прошлых матчах команды, без текущего матча
columns = ["match_id", "date", "team", "scored", "conceded"]
home = df[["match_id", "date", "home", "home_goals", "away_goals"]].set_axis(columns, axis=1)
away = df[["match_id", "date", "away", "away_goals", "home_goals"]].set_axis(columns, axis=1)
games = pd.concat([home.assign(side="home"), away.assign(side="away")]).sort_values(["date", "match_id"])
for col in ["scored", "conceded"]:
games[f"{col}_form"] = games.groupby("team")[col].transform(
lambda s: s.shift().rolling(5, min_periods=3).mean()
)
form = games.pivot(index="match_id", columns="side", values=["scored_form", "conceded_form"])
form.columns = [f"{side}_{name}" for name, side in form.columns]
df = df.join(form, on="match_id").dropna()
# Вероятности рынка без маржи
inverse = 1 / df[["odds_home", "odds_draw", "odds_away"]]
market = inverse.div(inverse.sum(axis=1), axis=0)
market.columns = ["p_home", "p_draw", "p_away"]
X = pd.concat([df[form.columns], market], axis=1)
y = df["result"]
split = int(len(df) * 0.8)
model = make_pipeline(
StandardScaler(),
MLPClassifier(hidden_layer_sizes=(32, 16), early_stopping=True, max_iter=500, random_state=42),
)
model.fit(X[:split], y[:split])
model_proba = model.predict_proba(X[split:])
market_proba = market[split:][["p_away", "p_draw", "p_home"]].to_numpy()
print("Нейросеть, log loss:", log_loss(y[split:], model_proba, labels=model.classes_))
print("Рынок, log loss:", log_loss(y[split:], market_proba, labels=["A", "D", "H"]))
Модель возвращает вероятности трёх исходов: H — победа хозяев, D — ничья, A — победа гостей. Это удобнее, чем «угадал или нет»: вероятность можно сравнить с коэффициентом.
Шаг 4. Проверьте точность честно
Большинство «точных» моделей из интернета проваливаются именно здесь.
- Делите данные по времени, а не случайно. Модель обучается на прошлом и проверяется на будущем — как в реальной жизни. Случайное перемешивание даёт завышенную точность.
- Не смотрите только на долю угаданных исходов. Модель, которая всегда ставит на хозяев, угадывает почти половину матчей и при этом бесполезна.
- Используйте log loss и Brier score. Они оценивают качество вероятностей: чем меньше, тем лучше.
- Сравнивайте с рынком. Коэффициенты — сильнейший бесплатный прогноз. Если log loss модели не ниже рыночного, модель знает о матчах меньше, чем линия.
- Проверьте калибровку. Из матчей, где модель даёт 60%, должно выигрываться около 60%.
Только после этого имеет смысл моделировать ставки на исторических данных — с фиксированной суммой и с учётом маржи. Результат такого теста — оценка, а не обещание будущей прибыли.
Шаг 5. Прогнозы на реальные матчи каждый день
Когда модель прошла проверку, работа становится ежедневным процессом:
- Утром скрипт берёт матчи дня из календаря API линии.
- Считает признаки по последним результатам и текущим коэффициентам.
- Модель выдаёт вероятности и сохраняет прогнозы.
- После матчей итоги подтягиваются из API результатов, а статистика точности обновляется автоматически.
Прогнозы можно публиковать в Telegram-канале — как настроить автопостинг, мы разобрали в статье о спортивном канале на автопилоте.
Ошибки, которые портят модель прогнозов
- Утечка данных из будущего. Форма, рейтинг или статистика, посчитанные с учётом самого матча.
- Случайное разделение выборки. Модель видит будущие матчи при обучении.
- Переобучение. Слишком большая сеть на нескольких тысячах матчей запоминает шум. Начните с маленькой и сравните с логистической регрессией.
- Игнорирование маржи. Вероятности из коэффициентов в сумме больше 100% — нормализуйте их.
- Мало данных. Модель на одном сезоне одной лиги почти ничего не знает. Берите несколько сезонов и лиг — история результатов в SportAPI охватывает 20 лет.
Если строить модель самому некогда
SportAPI разрабатывает спортивные стратегии под ключ: формализует ваши правила отбора матчей или создаёт модель с нуля, подключает данные, считает результаты на истории и отправляет сигналы в Telegram, на почту или через вебхук. А если прогнозы нужно продавать, на тех же данных можно запустить сайт прогнозов с платным доступом.
Частые вопросы
Можно ли сделать нейросеть для прогнозов на спорт без больших данных?
Можно начать с нескольких тысяч матчей и простых признаков, но точность будет ограниченной. Чем больше сезонов и лиг, тем стабильнее модель. История результатов за 20 лет в SportAPI решает проблему объёма.
Что лучше для прогнозов: нейросеть, логистическая регрессия или Пуассон?
На табличных данных простые модели часто работают не хуже нейросети. Правильный путь — обучить несколько моделей и выбрать ту, у которой лучше log loss на проверочных матчах.
Где взять исторические коэффициенты?
В SportAPI исторических коэффициентов нет. Начните сохранять текущие коэффициенты из API линии ежедневно — скрипт из этой статьи делает это автоматически.
Как понять, что модель работает?
Её log loss на матчах, которых она не видела при обучении, ниже рыночного, а вероятности хорошо откалиброваны. Доля угаданных исходов сама по себе ничего не доказывает.
Можно ли проверить данные до оплаты?
Да. Тестовый доступ на 2 дня позволяет посмотреть линию, коэффициенты и формат данных и запустить скрипт сбора коэффициентов.
С чего начать сегодня
- Получите тестовый ключ SportAPI и запустите скрипт ежедневного сбора коэффициентов.
- Загрузите историю результатов нескольких сезонов в таблицу.
- Посчитайте форму команд без подсматривания и вероятности рынка.
- Обучите небольшую нейросеть и сравните её log loss с рынком.
- Если модель лучше рынка на проверке — запускайте ежедневные прогнозы.
Напишите менеджеру SportAPI в Telegram, какие лиги и виды спорта нужны вашей модели, — вы получите тестовый доступ к API спортивной линии и коэффициентов и сможете собрать первые данные уже сегодня.