AI-система предсказания результатов матчей
Предсказание спортивных результатов — классическая задача ML с богатой историей академических исследований. Практические применения: букмекерские конторы, fantasy sports, журналистика. Ключевое ограничение: спорт содержит существенную случайность, которую нельзя устранить точностью модели.
Постановка задачи
Варианты таргета:
- Победа/ничья/поражение (3-class classification)
- Победа/поражение (без ничьей, для систем с overtime)
- Предсказание счёта (regression) → исход выводится из счёта
- xG-предсказание → результат через симуляцию
Важное ограничение EMH для спорта: Цены букмекеров содержат агрегированную информацию. Превзойти closing line Pinnacle сложнее, чем кажется — sharp money уже учтено.
Данные для футбольной модели
Team strength features:
team_features = {
# Recent form
'points_last_5': sum(results_last_5_games),
'goals_scored_pg_last_10': avg_goals_last_10,
'goals_conceded_pg_last_10': avg_conceded_last_10,
'xg_scored_pg_last_10': avg_xg_for, # OPTA/StatsBomb данные
'xg_conceded_pg_last_10': avg_xg_against,
# Shots quality
'shots_on_target_pct': shots_on_target / total_shots,
'conversion_rate': goals / shots_on_target,
# Fatigue
'days_since_last_match': rest_days,
'travel_distance_km': travel_to_venue,
'matches_in_last_14d': fixture_congestion
}
Player availability: Травмы и дисквалификации ключевых игроков — один из наиболее значимых предикторов:
# Injury impact score: взвешенный по рейтингу отсутствующих игроков
injury_impact = sum(player_ratings[player] for player in injured_players) / squad_rating
Head-to-head history: Психологический фактор и тактические паттерны между конкретными командами. Ограничение: при смене тренерского штаба — история менее релевантна.
Poisson Goal Model
Dixon-Coles (1997): классика футбольного предсказания.
from scipy.stats import poisson
def dixon_coles_probabilities(home_attack, away_attack, home_defence, away_defence, home_advantage=1.1):
"""
lambda_home = exp(home_attack + away_defence + home_advantage)
lambda_away = exp(away_attack + home_defence)
P(score h:a) = Poisson(h, lambda_home) × Poisson(a, lambda_away) × correction_factor
"""
lambda_home = np.exp(home_attack - away_defence + home_advantage)
lambda_away = np.exp(away_attack - home_defence)
max_goals = 10
score_matrix = np.zeros((max_goals, max_goals))
for h in range(max_goals):
for a in range(max_goals):
# Dixon-Coles low-score correction для 0-0, 1-0, 0-1, 1-1
correction = dc_correction(h, a, lambda_home, lambda_away)
score_matrix[h, a] = poisson.pmf(h, lambda_home) * poisson.pmf(a, lambda_away) * correction
p_home = score_matrix[score_matrix > 0].sum(where=range(max_goals)>range(max_goals))
return score_matrix, p_home_win, p_draw, p_away_win
ML Ensemble
Modeli в ансамбле:
- Dixon-Coles Poisson: статистическая базовая модель
- LightGBM on features: нелинейные взаимодействия фич
- Elo/Pi-rating system: рейтинговая модель (Chess-style для футбола)
- Market-implied probability (от Pinnacle): cleaning через margin removal
Stacking:
meta_model = LogisticRegression()
meta_model.fit(
X=np.column_stack([poisson_preds, lgbm_preds, elo_preds, market_preds]),
y=actual_results
)
Оценка качества модели
Log Loss: штрафует за неуверенность неправильных предсказаний.
log_loss_score = log_loss(actual_results, predicted_probabilities)
# Baseline: uniform predictions (log_loss ≈ 1.099 для 3-class)
# Рыночный baseline: log_loss ≈ 0.95
# Хорошая модель: < 0.93
RPS (Ranked Probability Score): для ранжированных исходов (поражение < ничья < победа).
Calibration: Predicted probability 70% должна соответствовать выигрышу в 70% случаев:
from sklearn.calibration import calibration_curve
fraction_pos, mean_predicted_value = calibration_curve(y_true, y_prob, n_bins=10)
Ограничения и честность
Структурная непредсказуемость: Лучшие модели достигают 55-60% точности по трёхзначным исходам. Это значительно выше случайных 33%, но далеко от 100%.
xG-based модели: используют более глубокую статистику (xG, давление, PPDA), но исторически не намного превосходят простые Elo-модели. Причина: random variance в конверсии xG высока.
Информационный горизонт: события дня матча (последние новости о составе, мотивация) часто важнее исторической статистики — доступны только betting синдикатам.
Сроки: Dixon-Coles baseline + LightGBM для одного вида спорта — 3-4 недели. Ensemble с market calibration, injury impact и multi-sport coverage — 8-10 недель.







