Course
Предсказывать футбол сложно. Это малорезультативный вид спорта, где один рикошет может перевернуть исход, а заметная доля любого матча — это удача. Международный футбол ещё сложнее: сборные проводят всего несколько официальных игр в год, поэтому данных для обучения гораздо меньше, чем в клубных лигах.
И будто этого было мало, FIFA усложнила задачу ещё больше на нынешнем чемпионате мира. Расширенный турнир с 48 командами вводит новый формат: из двенадцати групп выходят две лучшие команды, а также восемь из двенадцати лучших, занявших третье место, что делает исходы группового этапа непредсказуемыми. Поскольку я люблю вызовы (и футбол), это как раз то, что я решил спрогнозировать.
Это продолжение моего проекта по прогнозам EURO 2024, практически полностью собранного заново. В прошлый раз я работал исключительно в блокнотах Jupyter и предсказывал единственно наиболее вероятный счёт для каждого матча. Теперь я построил сквозной конвейер MLOps, который забирает свежие результаты, переобучается сам и запускает Монте‑Карло-симуляцию всего турнира 10 000 раз, превращая поматчевые предсказания в вероятности прохода команд по стадиям.
В этой статье я на высоком уровне проведу вас по проекту: данные и признаки, практики MLOps для воспроизводимости, архитектура конвейера и то, какая модель лучше всего предсказывает футбол сборных. Полный код доступен в репозитории проекта. И, конечно, я скажу, кто, по мнению модели, победит. (Спойлер: ей нравятся Испания и Аргентина — примерно по 16%, но интереснее то, как она к этому приходит.)
Если вы уже прониклись духом турнира, рекомендую заглянуть на нашу неделю Data & AI World Cup — серию сессий о том, как данные и ИИ меняют футбол. Смотреть можно бесплатно в прямом эфире или в записи.
Коротко
- Это сквозной конвейер MLOps для прогноза ЧМ‑2026, который подтягивает свежие результаты сборных и автоматически переобучается в Google Cloud каждые два часа во время турнира.
- Данные из API-Football и рейтингов Elo проходят через медальонную архитектуру Bronze–Silver–Gold и версионируются с помощью DVC для полной воспроизводимости.
- Десять моделей из пяти семейств сравнивались на отложенной выборке из 347 матчей; с небольшим отрывом победил XGBoost, первая пятёрка почти неотличима, а разница Elo между командами выполняет основную предсказательную работу.
- Монте‑Карло-симуляция разыгрывает весь турнир 10 000 раз, превращая прогнозы по голам в шансы каждой команды на выход и победу.
- По состоянию на 10 июня 2026 года фавориты модели — Испания и Аргентина, примерно по 16% каждая. За живыми прогнозами можно следить на сопутствующей панели Streamlit, которая обновляется каждые два часа.
Данные для прогнозов
Качество прогноза определяется качеством входных данных, поэтому начнём с исходников. Модель обучается на двух живых источниках данных и превращает их в единую аккуратную таблицу признаков.
Откуда берутся данные
Всё строится на двух источниках. API-Football поставляет календарь и поматчевую статистику: кто с кем играл, когда и где, и чем всё закончилось. eloratings.net даёт рейтинги Elo для каждой национальной сборной.
Рейтинг Elo — это одно число, отражающее силу команды. Каждая команда занимает место на шкале, и после каждого матча рейтинг обновляется: обыграйте более сильного соперника — получите большой прирост; проиграйте более слабому — упадёте резко. Идея пришла из шахмат и хорошо ложится на футбол. Если хотите полную интуицию, эта предыдущая статья DataCamp разбирает подход на примере ЧМ‑2022.
Вместе эти два источника дают Gold‑датасет примерно из 6900 международных матчей с 2018 года для обучения.
Что предсказывает модель
Вот первый важный выбор дизайна. Вместо прямого предсказания исхода как победа/ничья/поражение модель предсказывает более детальную величину: количество голов каждой команды в матче. Распределение голов в футболе с хорошей точностью следует распределению Пуассона — стандартному способу моделировать, как часто относительно редкое событие происходит в фиксированном окне времени.
Именно прогноз голов, а не результата, делает возможным всё остальное. Как только модель может выдать правдоподобный счёт для любой пары соперников, вопросы, которые действительно всех волнуют — кто выйдет из группы и кто поднимет трофей — можно решать, многократно симулируя эти счёты.
Ключевые признаки
Каждый матч описывается небольшим, тщательно отобранным набором признаков:
- Разница Elo: разрыв в рейтинге между командами. Это с большим отрывом самый важный признак в модели — его важность примерно на два порядка выше следующего по силе. Это соответствует интуиции: разница в силе соперников говорит о вероятном исходе больше, чем почти что-либо ещё.
- Сумма Elo: сумма рейтингов, суррогат общего уровня матча. По разнице одной лишь Аргентину против Испании не отличить от Сан‑Марино против Андорры — оба матча равных соперников, но на совершенно разных уровнях. Сумма возвращает эту информацию.
- Скользящее изменение Elo (последние 5 матчей): насколько недавно сместился рейтинг каждой команды. Это отражает форму, уже учитывая силу соперников.
- Скользящие голы забитые и пропущенные (последние 5 матчей): недавняя атакующая и оборонительная продуктивность в абсолютном выражении для каждой команды.
- Контекст матча: уровень соревнования (матч ЧМ отличается по весу от отборочного или Лиги наций), нокаутный ли это раунд и нейтральное ли поле.
Каждый признак строго защищён от утечки — то есть использует только информацию, доступную до стартового свистка. Звучит очевидно, но это один из самых лёгких способов ненароком построить модель, блистательно выглядящую в тестах и разваливающуюся в реальности.
Идея, которая не прошла отсев: я планировал набор признаков «стиля игры», полученных кластеризацией команд по их внутриматчевой статистике — шаг обучения без учителя. На практике команды не разделились на осмысленные группы, и чтобы не кормить модель шумом, я отказался от этой ветки. Негативные результаты — тоже результаты.
Как обеспечить воспроизводимость данных
При непрерывном поступлении данных из двух источников путь от сырых файлов к признакам для модели должен быть идентичен каждый раз. Это обеспечивает медальонная архитектура. Она организует данные в три слоя:
- Bronze: сырые данные, ровно в том виде, в каком приходят, без изменений.
- Silver: очищенные и стандартизованные. Здесь я сопоставляю названия команд между источниками (они редко совпадают по написанию), валидирую схему, присоединяю рейтинги Elo к записям матчей и обрабатываю всё пропущенное или некорректное.
- Gold: слой моделирования — одна аккуратная строка на матч, с рассчитанными признаками, готовыми к обучению.
Каждый слой питает следующий, поэтому если что-то выглядит странно, я могу отследить проблему на шаг назад, а не распутывать всё сразу. Чтобы сделать весь путь воспроизводимым, я использую DVC (Data Version Control). Когда приходят свежие результаты, одна команда dvc repro пересобирает Silver и Gold из Bronze, переисполняя шаг только если изменились его входы, и версионирует итоговые датасеты, чтобы любую прежнюю версию можно было восстановить точно.
Выбор лучшей модели
Прогноз голов — хорошо изученная задача, и единственно очевидного инструмента для неё нет. Поэтому вместо того чтобы сразу выбрать один подход, я построил десять и устроил им соревнование.
Претенденты
Десять моделей охватывают пять семейств плюс простой базовый ориентир. Вникать в устройство каждой не обязательно; важнее, что они делают очень разные допущения о механике возникновения голов.
| Семейство | Модели | Суть идеи |
|---|---|---|
| Базовая | Средне-частотный Пуассон | Предполагает, что каждая команда просто забивает свою долгосрочную среднюю, игнорируя все признаки. Планка, которую остальным нужно превзойти. |
| Статистические | Двумерный Пуассон, Негативное биномиальное | Непосредственно моделируют два счётчика голов с помощью распределений для счетных событий. |
| Байесовские | Байесовский Пуассон (MCMC) | Та же счётная идея, но возвращает полный диапазон неопределённости вокруг оценки. Существенно тяжелее вычислительно: примерно в 100 раз дольше обучается. |
| Временные ряды | SARIMAX | Рассматривает результаты команды как последовательность во времени и экстраполирует её вперёд. |
| Машинное обучение | Ridge, Random Forest, XGBoost | Изучают шаблоны напрямую из признаков без жёсткого уравнения. |
| Глубокое обучение | LSTM, 1D CNN | Нейросети, ищущие последовательные и локальные паттерны в данных. |
Как их оценивали
При десяти кандидатах выбирать победителя «на глаз» бессмысленно. Вместо этого каждая модель проходит три стадии, и код решает, продвигается ли она дальше. Это и есть развёртывание, управляемое кодом: модели переводятся из одной среды в другую автоматическими проверками, а не ручной подгонкой, так что весь отбор остаётся воспроизводимым и удобным для аудита.
- Эксперимент. Каждая модель обучается только на международных матчах до ЧМ‑2022. Причём учитываются они не равновесно: более свежие игры и более важные турниры получают больший вес (временной спад и вес по важности матча), так что недавний официальный результат влияет на модель сильнее старого товарищеского. Затем гиперпараметры каждой модели настраиваются на минимизацию негативного логарифма правдоподобия Пуассона (NLL) с кросс‑валидацией. NLL — это по сути метрика соответствия предсказанных интенсивностей голов реальным забитым голам: меньше — лучше. Результат — наилучшим образом настроенная версия каждой модели.
- Контроль качества. Эти настроенные модели тестируются на невиданных ранее матчах: ЧМ‑2022 плюс шесть крупных турниров после него (EURO, два Кубка Африки, Кубок Америки, Кубок Азии и Золотой кубок) — всего 347 матчей. Здесь метрика сменяется на оценку ранжированной вероятности (RPS), которая измеряет качество вероятностного прогноза при естественном порядке исходов (поражение, ничья, победа) и поощряет уверенность в «примерно правильном направлении». Снова: меньше — лучше. Самая сильная модель здесь становится претендентом. RPS — верная линейка, потому что цель — предсказать, как далеко пройдут команды, а не только суммы голов.
- Ввод в эксплуатацию. Претендент сравнивается с действующим чемпионом. Если выигрывает, он повышается в статусе и дообучается на всех доступных матчах, чтобы войти в турнир с использованием максимума данных.
Кто победил
Итак, какой подход оказался лучшим? Вот полный лидерборд на отложенной выборке по RPS (меньше — лучше):
| Модель | Holdout RPS |
|---|---|
| XGBoost | 0.18289 |
| Байесовский Пуассон | 0.18316 |
| Негативное биномиальное | 0.18373 |
| Двумерный Пуассон | 0.18389 |
| Random Forest | 0.18392 |
| SARIMAX | 0.18583 |
| Ridge | 0.18813 |
| LSTM | 0.19299 |
| 1D CNN | 0.20916 |
| Средне-частотный Пуассон (база) | 0.22872 |
Из результатов бросаются в глаза четыре вещи:
- XGBoost победил, но едва‑едва. Топ‑5 (XGBoost, Байесовский Пуассон, Негативное биномиальное, Двумерный Пуассон и Random Forest) уложились в ~0.0011 RPS друг от друга. Когда пять очень разных подходов сходятся так близко, это обычно значит, что потолок задают данные и признаки, а не модель. Здесь разница Elo делает львиную долю работы, и выбор модели даёт минимальный прирост.
- Один признак доминирует. Разница Elo — самый важный предиктор с огромным отрывом, примерно в сто раз влиятельнее следующего признака. Это скорее обнадёживает, чем удивляет: в одном матче разрыв в силе действительно определяет почти всё.
- Глубокое обучение финишировало последним, не считая базы. 1D CNN и LSTM оказались слабейшими, кроме наивного ориентира. При ~7000 матчей для обучения данных просто недостаточно, чтобы кормить сети с множеством параметров; классические методы куда лучше справляются с малыми структурированными наборами.
- Переподгонки у классики не видно. Обычно на невиданных данных модель работает чуть хуже, чем на обучении. Здесь почти все модели (кроме LSTM) показали лучшие результаты на отложенных турнирах, чем на кросс‑валидации. Вероятная причина — турнирный футбол предсказуемее обычного международного календаря: высокие ставки, сильные и знакомые команды, нейтральные поля — всё это снижает долю случайности.
Вживую я не запускаю все десять. Я оставляю меньший состав: базовый средне-частотный ориентир как точку отсчёта плюс три лучших исполнителя. XGBoost и Байесовский Пуассон занимают две верхних строчки.
Третье место — фактически ничья: Негативное биномиальное и Двумерный Пуассон расходятся менее чем на 0.0002 RPS и меняются местами в зависимости от случайного зерна, поэтому между статистически неразличимыми моделями я выбрал Двумерный Пуассон — его формулировка сильнее укоренена в литературе по прогнозированию футбола (Karlis и Ntzoufras, 2004).
Итого в составе остаются XGBoost (машинное обучение), Двумерный Пуассон (классическая статистика) и Байесовский Пуассон (байесовский вывод). Далее — как эти модели запускаются, переобучаются и превращают прогнозы отдельных матчей в прогноз всего турнира.
Ввод в эксплуатацию
Модель, живущая в блокноте, полезна, только пока вы сидите перед ней. Чтобы предсказывать матчи на протяжении месячного турнира, всё должно работать само: подтягивать новые результаты, переобучаться, пересимулировать и обновлять прогноз без участия человека. Это задача конвейера.
Двухчасовой конвейер на GCP
Весь проект работает как одна плановая задача на Google Cloud Run. До турнира он просыпается раз в день; с матча открытия 11 июня — каждый второй час. Каждый запуск проходит один и тот же цикл:
- Проверка новых данных. Если с прошлого запуска завершённых матчей не было, делать нечего — задача завершается раньше.
- Загрузка и пересборка. Когда появились новые результаты, они подтягиваются из источников, и одна команда
dvc reproпересобирает слои Silver и Gold, чтобы признаки были актуальны. - Переобучение, прогноз, симуляция. Модели из состава обновляются (подробнее — ниже), предсказываются все предстоящие пары, и проводится полная симуляция турнира.
- Оценка. Как только матч завершён, сделанные для него прогнозы оцениваются, и это питает мониторинг, описанный далее.
Поскольку каждый шаг запускается кодом по расписанию, в ходе турнира не требуется ручного вмешательства. На вход приходят новые результаты — на выходе обновлённый прогноз.
Два режима: «замороженный» и «по раундам»
Здесь проект одновременно служит экспериментом. Во время турнира состав моделей работает в двух параллельных режимах, и различие между ними — это вопрос, на который я надеюсь ответить данными: Улучшают ли переобучения по мере развития турнира качество прогнозов?
- Замороженный. Модели фиксируются в момент стартового свистка и больше не переобучаются. На результаты они всё равно реагируют, потому что каждая симуляция стартует с обновлённой сетки, но параметры моделей не меняются.
- По раундам. Гиперпараметры (высокоуровневые настройки) остаются прежними, но обучаемые параметры переоцениваются на всех доступных данных после каждого тура группового этапа и каждого раунда плей‑офф, так что модели продолжают учиться по ходу турнира.
Параллельный запуск позволяет по итогам сравнить их по двум фронтам: по точности и по скорости сходимости неопределённости по мере сужения поля участников. Если выигрывает режим «по раундам», регулярное переобучение себя оправдывает; если «замороженный» держится на уровне, дополнительная сложность может быть излишней.
От прогнозов к турниру: Монте‑Карло
Предсказать один матч — это одно. Перевести это в «каковы шансы каждой команды выиграть турнир» — здесь пригодится симуляция Монте‑Карло.
Сначала — инференс. Вместо того чтобы предсказывать только уже известные пары, модель предсказывает все возможные сочетания среди 48 команд. Звучит избыточно, но в турнире любая команда может встретиться с любой другой в плей‑офф, значит, прогноз должен быть готов для каждой пары.
Далее нужно закодировать правила, а формат 2026 делает это особенно неудобным. Из 12 групп автоматически выходят две лучшие, но также восемь лучших из занявших третье место, и их позиции в сетке 1/16 зависят от того, из каких групп они пришли.
Есть 495 способов выбрать восемь «квалифицировавшихся» групп из двенадцати (двенадцать по восемь), и каждый ведёт к своему набору пар 1/16. Закрытой формулы нет; FIFA просто публикует таблицу. Поэтому я (точнее, мой очень способный коллега Cursor) закодировал все 495 комбинаций в отображение, используя официальную таблицу как источник.
"best_third_mappings": {
"EFGHIJKL": {
"74": "3F",
"77": "3G",
"79": "3E",
"80": "3K",
"81": "3I",
"82": "3H",
"85": "3J",
"87": "3L"
},
"DFGHIJKL": ...
Каждый ключ, например EFGHIJKL, перечисляет группы, из которых прошли команды, занявшие третье место, а значения расставляют каждую из этих команд (3E, 3F и т. д.) по конкретным номерам матчей 1/16. Это одна запись; полное отображение повторяет её 495 раз — по одной на каждую комбинацию.
Три страны‑хозяйки (США, Канада и Мексика) требуют отдельной обработки. Когда хозяин проводит матч в своей стране, симуляция добавляет поправку на фактор домашнего поля; остальная часть турнира считается нейтральной.
Имея прогнозы и правила, симуляция разыгрывает весь турнир 10 000 раз. В каждом прогоне выполняются шаги:
- Жеребьёвка счёта для каждого матча путём выборки голов хозяев и гостей из предсказанных распределений
- Розыгрыш группового этапа с реальными правилами начисления очков и тай-брейков
- Определение таблицы лучших третьих мест
- Заполнение сетки плей‑офф по отображениям выше
- Прохождение до единственного чемпиона.
По 10 000 симулированных турниров доля прогонов, в которых команда выходит в финал или поднимает кубок, становится её вероятностью. Один прогон — догадка; десять тысяч — прогноз.
Отслеживание в MLflow
Каждый описанный запуск, в обоих режимах, логируется в MLflow (развёрнутом на DagsHub). Трекинг экспериментов — это систематическая запись входов, настроек, результатов и артефактов каждого запуска, чтобы любой из них можно было сравнить с другими или воспроизвести точно. Несколько моментов, на которые стоит обратить внимание:
- Воспроизводимость. Симуляция использует фиксированное случайное зерно, зависящее от стадии турнира, и одинаковое зерно делят «замороженный» и «по раундам» режимы. Это означает, что различия между режимами возникают из‑за самих моделей, а не из‑за удачи в симуляции. Каждый запуск также логирует точный срез данных (число строк Gold и метку времени), чтобы результаты всегда можно было отследить до входов.
- Эксперимент. Каждый запуск помечается режимом (замороженный или по раундам) и стадией жизненного цикла — от экспериментального и QA до боевого инференса и дообучений — отражая поток продвижения из предыдущего раздела.
- Сравнение. В качестве метрики отбора логируется RPS на отложенной выборке, вместе со ссылкой на текущий «чемпионский» запуск для родословной. Также записывается время обучения — здесь и видно, что байесовская модель примерно в 100 раз медленнее остальных.
Обученные модели и сами файлы прогнозов (турнирные вероятности, положения в группах и поматчевые предсказания) сохраняются как артефакты запусков, и именно их читает живая панель. Кольцо замыкается: от сырых результатов — через обучение и симуляцию — к цифрам, которые вы видите онлайн.
Мониторинг дрейфа
Последний элемент включается по мере завершения матчей. По мере поступления реальных результатов сделанные для них прогнозы оцениваются и сравниваются с простым средне-частотным базовым ориентиром. Если полноценные модели начинают уступать модели, ничего не знающей о командах, — это сигнал о дрейфе: закономерности, выученные до турнира, могут уже не соответствовать тому, что происходит на поле.
Следить за этим — стандартная практика для любой системы живых прогнозов. Подробнее о том, как это обнаруживается, — в руководстве по дрейфу данных и моделей.
Итак, кто выиграет чемпионат мира?
После всей этой инженерии — вот зачем она нужна.
Фавориты
По состоянию на 10 июня 2026 года, за день до матча открытия, вердикт модели на вершине ясен, а сразу за ней плотная группа преследователей. Испания и Аргентина лидируют — у каждой примерно 16% шансов поднять трофей. То, что действующие чемпионы мира (Аргентина) и Европы (Испания) оказываются наверху, — хороший здравый чек, что модель приземлена в реальности.
За ними плотной группой идут Франция, Англия, Бразилия и Колумбия — они замыкают круг наиболее вероятных победителей. Эти цифры живые и начнут меняться, как только пойдут реальные результаты, так что относитесь к ним как к снимку на 10 июня, а не к высеченному пророчеству. Панель всегда показывает актуальные числа, с максимальной задержкой два часа.
Живая панель
К слову: все числа в статье приходят из живого приложения Streamlit, которое автоматически обновляется по мере работы конвейера. Открывайте wc2026-predictions.streamlit.app и следите за турниром. В нём четыре основных вида:
- Обзор турнира: как далеко, по ожиданиям, пройдёт каждая команда — одним взглядом.
- Положения в группах: для каждой группы — вероятность для каждой команды финишировать первой, второй, третьей (разделено на «третье и проход» и «третье и вылет» благодаря правилу лучших третьих) или четвёртой.
- Прогнозы матчей: для каждой игры группы — шансы на победу хозяев, ничью или победу гостей, а также наиболее вероятная сетка плей‑офф.
- Самые частые пары плей‑офф: сочетания, которые симуляция даёт чаще всего.
Одна особенность в виде матчей, о которой стоит упомянуть: пара команд может появляться сразу в двух возможных слотах 1/16. Это не баг. Так бывает, когда группа настолько ровная, что модель не может уверенно определить, какое место займёт команда. В сочетании с неопределённостью по лучшим третьим это приводит к разным слотам плей‑офф. В случае с Турцией это даже привело к их «двойному» присутствию в 1/8 финала.
Следующий график показывает финальные стадии (четвертьфиналы до финала), которые модель XGBoost проецирует перед стартом турнира:

Команда‑монетка: США
Соль такой модели — в командах, которые идут наперекор «глазомерному» ожиданию, и самый яркий пример — США. Если открыть обзор турнира на панели, вы сразу заметите, что США выделяются цветом.
Как соорганизаторы, играющие при поддержке домашних трибун, они будто бы должны начинать уверенно, но модель гораздо осторожнее: она даёт им лишь около 54,6% шансов выйти из группы — это 13‑й с конца показатель в целом поле (напомню, из групп выходит две трети команд!), потому что их группа с Австралией, Парагваем и Турцией необычайно ровная.
Интересное начинается дальше. Протиснувшись в плей‑офф, США затем балансируют примерно на подбрасывании монетки в каждом следующем раунде. Сложите эти «монетки» — и получится около 2% шансов выиграть весь турнир, что уже 13‑й результат сверху из 48 команд.
Команда, которая 13‑я снизу по шансам выйти из группы и 13‑я сверху по шансам выиграть турнир, — почти идеальное определение «команды‑монетки»: никогда не фаворит, но и никогда не списана.
Напоследок
Этот проект потребовал много работы и охватывает куда больше, чем умещается в одной статье. В репозитории осталось немало того, что сюда не вошло: полный набор кандидатных моделей, построение признаков и оркестрация, которая всё это держит в движении.
А пока модель сделала свой выбор, и судить будет турнир. Независимо от того, пришли ли вы ради MLOps или ради футбола, надеюсь, вам будет так же интересно наблюдать за его развитием, как и мне. Следите за живым прогнозом по мере поступления матчей и смотрите, насколько хорошо держатся предсказания.
Если хотите глубже разобраться в некоторых затронутых концепциях, рекомендую наш курс MLOps Concepts.