Поскольку в качестве цели я использую коэффициенты закрытия Pinnacle Sports, можно сказать, что я просто моделирую модель. Однако предполагается, что к моменту начала матча линия Пиннакл сдвинется достаточно сильно из-за того, что люди делают ставки на то, что шансы должны быть очень близки к истинной вероятности. Немного похоже на эффект мудрости толпы. Правильно ли это предположение…? Все, что я скажу, это то, что это не только хорошо работает, но и дает желаемый эффект, на который я надеялся, как я объясню позже.

Идея

В прошлом году я разработал модель ожидаемых целей (xG) - так же весело и немного по программированию на Python. Во многом это было вдохновлено двумя людьми, Майклом Кейли и Тедом Кнутсоном, за которыми я следую в Твиттере. xG, на мой взгляд, просто фантастика. Если вы хотите получить более подробную информацию, проверьте закрепленный твит Майкла. Однако, как и у всех аналитических инструментов футбола, у него есть свои недостатки. И снова Майкл рассматривает их более тщательно, но я собираюсь быстро перечислить их, чтобы понять, почему я решил сделать что-то другое. Во-первых, он не учитывает играющих игроков. Например, если бы Эден Азар отсутствовал в Челси (печальная реальность), вы, очевидно, ожидали бы, что xG Челси будет ниже, однако на самом деле нет способа учесть это перед началом игры. Во-вторых, в начале сезона, когда приходят новые игроки, xG не может измерить, какое влияние этот новый игрок окажет на команду. Наконец, мне еще предстоит увидеть модель xG, которая хорошо обобщалась бы во всех 5 лигах (это то, что я еще не пытался сделать со своей моделью, но это расширение, которое я пытаюсь реализовать в какой-то момент. ).

Я также очень опоздал с моей моделью xG - она ​​существует уже около 4 или 5 лет, поэтому моя модель не была чем-то, что кто-то не делал раньше. Я хотел попытаться создать что-то, что: а) могло бы предсказывать исход футбольных матчей, б) что я никогда раньше не видел и в) в котором использовались бы данные об игроках в той или иной форме. Я могу ошибаться, но я не видел много примеров того, как люди применяли нейронные сети для решения футбольных задач. Итак, имея в виду все вышесказанное, я решил написать что-нибудь в Tensorflow, чтобы попытаться предсказать исход футбольных матчей на основе стартовых 11 команд.

Данные

Самая очевидная система рейтинга игроков существует в играх FIFA EA Sport. Они обновляются ежегодно, они не зависят от лиги и являются достаточно точными (до такой степени, что я никогда не слышал, чтобы кто-то так критиковал). Я использовал только общие рейтинги, но, возможно, комбинация некоторых других рейтингов (защита, атака и т. Д.) Могла бы работать лучше. Я собирал рейтинги Premier League Ultimate Team на сайте https://www.fifaindex.com/ за последние 5 лет. Мне также нужно было знать, какие игроки начали какие игры. Для этого http://www.betstudy.com/ был отличным ресурсом. В нем указаны имена, номера и национальности каждого из 11 стартовых игроков для всех игр за последние 5 лет в Премьер-лиге. Имена из fifaindex не совпадали в точности с тем, что было видно в betstudy, поэтому я использовал комбинацию имени, номера, команды и национальности для сопоставления игроков. После того, как матч был проведен, у меня было 22 рейтинга (11 игроков дома и 11 игроков на выезде) в диапазоне от 50 до 100 для каждой игры в Премьер-лиге за последние 5 лет. Это было хорошее начало.

Однако, просто используя эти 22 числа, мы теряем потенциально жизненно важную информацию в форме формирования. Когда плохие команды играют с хорошими командами, они, как правило, припарковывают автобус, добавляя больше защитников - я хотел, чтобы моя модель учитывала такие вариации. Поэтому я решил смоделировать каждое стартовое число 11 вектором размера 18. В каждом 18-мерном векторе первый компонент предназначен для рейтинга вратаря, следующие шесть компонентов - для рейтингов защитников - если защитников всего четыре, два из этих компонентов оставлены равными нулю. Я включил диаграмму выше, чтобы попытаться визуализировать, как может выглядеть этот 18-мерный вектор, учитывая состав «Челси». По той же методике есть семь компонентов для полузащитников и четыре для нападающих. Такая структура входных данных должна позволить сделать некоторые выводы из формации. Например, если в игре участвует шесть защитников, вполне вероятно, что эта команда хочет припарковать автобус, и шансы должны быть рассчитаны соответствующим образом. По сути, формирование команды меняет, какие компоненты вектора остаются равными 0, и позволяет нейронной сети делать выводы из этого. Кроме того, когда мы передаем их в нейронную сеть, мы передадим их как один большой 36-мерный вектор: команда хозяев занимает первые 18 измерений, а команда гостей - последние 18 измерений. Используя эту структуру, сеть может также учитывать домашнее преимущество.

Наконец, выходом модели будет коэффициент совпадения 1X2. Я использовал коэффициенты Pinnacle Sports, которые на протяжении многих лет собирал Джозеф Бухдал на http://www.football-data.co.uk/.

Модель с потерей обучения и проверки

После того, как все данные были собраны и отформатированы, необходимо было определить внутреннюю структуру сети. Изначально я тренировал модель в сезонах Премьер-лиги 2013–2014, 2014–2015, 2015–2016 и 2016–2017, чтобы я мог протестировать ее в сезоне 2017–2018 годов. Из 1540 игр я отложил 50 для проверки. Затем я обучил модель, используя отсев и раннюю остановку, используя несколько различных сетевых структур. Наименьшая ошибка проверки была достигнута в сети с двумя скрытыми слоями: первый уровень с 16 узлами, а второй - с 8. Графики ошибок для обоих наборов для обучения и проверки показаны ниже с ранним остановом, обозначенным вертикальной линией. . Я не буду вдаваться в подробности нейронной сети, но весь код доступен на GitHub (ссылка внизу), если это кому-то интересно. После того, как я протестировал модель на исторических данных (я показываю некоторые результаты тестирования на истории ниже), я повторно обучил сеть на всех данных, включая сезон 2017–2018 годов, готовых к этому году.

Бэктестинг

Для тестирования на истории я начал с воображаемого банка на 100 фунтов стерлингов и использовал критерий Келли для определения размера ставки. Я не делал ставок с коэффициентом выше 3,2 и не делал ставок, в которых ожидаемое значение в соответствии с моделью было меньше 2%. В сезоне 2017–2018 модель достигает рентабельности инвестиций 11%. Это до смешного хорошо. Я повторно запускал его несколько раз, несколько раз переучивал модель и продолжал получать тот же результат. Так что я также посмотрел немного глубже в числа:

  • Я выиграл 50% своих ставок
  • Средние шансы Pinnacle составляли 2,37
  • Средний прогнозируемый коэффициент равен 2,01.
  • Среднее значение ставок составляло 7,23%, максимальное - 21,3%.

Такой большой ROI определенно является случайностью, но вышеприведенные наблюдения кажутся очень многообещающими, что в целом модель будет приносить прибыль. Я построил график ниже своего банкролла с течением времени, а также размеры ставок, и я могу рассказать больше о реальных ставках, если кому-то будет интересно.

Сезон 2018/19

Учитывая отличные результаты тестирования на истории, я переобучил модель, включая сезон 2017–2018 годов. Используя эту новую модель, я могу смоделировать целый сезон с некоторыми оговорками. Во-первых, я должен угадать наиболее вероятные составы для каждой команды (это нормально, но очевидно, что они будут меняться в течение сезона). А во-вторых, мне пришлось использовать рейтинги игроков EA за 2017–2018 годы, это не такая уж серьезная проблема, но есть игроки, такие как Салах, чьи рейтинги обязательно изменятся в FIFA 19 - я обновлю эту симуляцию новыми рейтингами и повторно запустите симуляцию, когда выйдет FIFA 19. Кроме того, сезон трансферных окон все еще открыт, что проблематично, потому что почти наверняка уходит несколько игроков, например, Азар. В любом случае, имея это в виду, я провел сезон 1 000 000 раз (на моем ноутбуке это занимает около 8 минут) и подсчитал среднее количество очков, побед, поражений и ничьих. Затем я подсчитываю процент от 1 000 000 сезонов, в которых команды финишируют 1, входят в четверку лучших и в зоне вылета. Результаты приведены ниже и соответствуют общим ожиданиям людей.

Двигаясь дальше, я могу начать немного возиться с командами. Например, предположим, что Азар уходит, а Челси играет вместо Виллиана. У Виллиана рейтинг 84 по сравнению с 91 Хазарда. Если поменять его местами в моделируемом сезоне, «Челси» потеряет примерно 4 очка! Мы можем сделать то же самое с «Манчестер Юнайтед», поменяв Де Хеа на Ромеро, они теряют в среднем около 3 очков. Эти различия в очках определенно совпадают с тем, чего вы ожидаете: «Челси» - худшая команда без Азара, а «Манчестер Юнайтед» хуже без Де Хеа. (Мне еще предстоит повторить это, включая все новые подписания «Ливерпуля», но это следующее, что я собираюсь сделать).

В целом я очень доволен тем, как это сработало. Очевидно, что это не идеальный способ моделирования футбольного матча. Необходимо учитывать так много факторов - менеджер, погода, усталость, конец сезона по сравнению с началом сезона и т. Д., Что такая модель вряд ли сможет уловить основное распределение. Тем не менее, это было забавно, и тот факт, что такие команды, как «Челси» теряют очки, когда вы убираете их звездного игрока, показывает, что это действительно работает так, как задумано. Следующими шагами обязательно будет увидеть, как изменятся прогнозы Ливерпуля, когда я добавлю их новых игроков. Затем я хочу настроить его для автоматического использования API Smarkets и автоматического размещения ставок. Наконец, когда я закончу университет, я хочу отработать его в течение последних 5 сезонов во всех 5 ведущих европейских лигах и посмотреть, смогу ли я создать «единую модель, которая подходит всем». Это также позволило бы мне использовать эту модель на таких вещах, как чемпионат мира и евро, что было бы очень интересно.

Изменить: я сделал быстрое веб-приложение, если вы хотите попробовать это сами - https://pl-predictor-tensorflow.herokuapp.com

Если вы нашли это где-нибудь, кроме Twitter - https://twitter.com/BradleyGrantham.

Если кому-то интересен реальный код, то все на GitHub - https://github.com/BradleyGrantham/fifa-stats-scraper