Я создал алгоритм ставок на спорт, который позволил мне увеличить свой банкролл в шесть раз всего за два месяца - до того, как Covid-19 внезапно остановил все спортивные лиги.

NB: эта статья носит несколько сжатый характер и отображает только самую важную информацию. За исчерпывающими подробностями обращайтесь к полной статье, которую я написал [1], содержащей все этапы построения и математические основы. В этой статье я только развиваю процесс программы NBA, так как программы других видов спорта также описаны в документе.

История проекта

Мне, как 22-летнему спортивному энтузиасту, всегда нравилась спортивная аналитика, и я в течение многих лет сосредотачивался на изучении множества различных статистических данных НБА.

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

Как это работает?

Идею конвейера можно резюмировать как «Мы стремимся создать оценку вероятностей выигрыша с помощью машинного обучения, чтобы сравнить эти вероятности с рыночными шансами, а затем вывести из этого сравнения прибыльные стратегии ставок».

После того, как я задокументировал себя по этому поводу, я понял, что многие из подобных проектов рассчитаны только на создание наиболее точной модели. Однако в большинстве случаев они не могли использовать свою модель для получения прибыли при размещении ставок на спорт, потому что маржа букмекеров по-прежнему компенсировала хорошую точность их моделей.

Затем я попытался выяснить, как этому противостоять, начал создавать свои собственные модели, а затем, наконец, подумал о способе выявления предвзятости в шансах букмекеров. Весь конвейер можно резюмировать следующей схемой, основные этапы которой кратко описаны в этой статье:

В этой статье я опишу следующие шаги:

I - Сбор данных: создание алгоритма веб-скрейпера на Python

II - Вычисление переменных: создание прогнозных переменных для использования в моделях машинного обучения

III - Анализ главных компонентов (PCA): уменьшение отклонений в процессе подбора за счет создания нового набора ортогональных компонентов

IV - Подбор нескольких моделей машинного обучения с разными настройками гиперпараметров

V - Создание прибыльных стратегий ставок благодаря оригинальной эвристике (личное творчество)

VI. Как насчет результатов?

I - Сбор данных: создание алгоритма веб-скрейпера на Python

Первым шагом был сбор необработанных исторических данных, для этого я создал веб-скребок python для сбора данных на www.oddsportal.com. Я опубликовал свой пакет на своей странице GitHub (страница GitHub [2], репозиторий [3]). Пакет удобен в использовании и позволяет любому выиграть любую лигу практически в любом виде спорта.

Единственными необработанными данными, с которых мне нужно было начать, был набор исторических данных, который содержал результат каждой игры, а также названия команд и коэффициенты закрытия, предложенные букмекерской конторой Bet365. Коэффициенты закрытия - это коэффициенты, доступные непосредственно перед началом матча. Очень важно иметь эти конкретные данные, потому что шансы могут сильно колебаться между временем открытия и закрытия, в основном, чтобы адаптироваться к травмам игроков и когда игроки делают ставки на ту или иную команду.

II - Вычисление переменных: создание прогнозных переменных для использования в моделях машинного обучения

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

Я решил кодировать общие переменные, используемые в спортивной аналитике, такие как показатели атаки и защиты (количество набранных / набранных очков), рекорд сезона, количество дни отдыха с момента последней игры, а также ряд других показателей (см. рисунок 5).

Кроме того, я также использовал некоторые метрики, полученные на основе шансов в качестве прогнозных переменных: я рассчитал рентабельность инвестиций (ROI) для каждой команды, когда мы ставим их на победу или поражение, когда они играют дома. или на выезде, средний коэффициент при выигрыше / проигрыше, самый большой коэффициент, полученный в этом сезоне, и т. д. Эти показатели дают ценную информацию об оценке силы команд букмекерами, так как затем мы можем определить, показывает ли команда превосходящие результаты в этом сезоне или в другом случае, если команда проигрывает по оценке букмекеров.

Я также рассчитал статистику с учетом предыдущих сезонов, чтобы модели машинного обучения также учились на долгосрочной динамике. Подводя итог, можно сказать, что прогнозные переменные можно сгруппировать в: переменные записи (W / L), переменные производительности (набранные средние баллы, против и т. д.…), рыночные (например ROI команды), рейтинговые переменные (ELO). Затем эти переменные вычисляются для нескольких периодов (5 и 10 игр, сезон, когда-либо) и для нескольких условий (дома, на выезде, личные встречи и т. Д.). Всего существует 133 прогнозных переменных.

III - Анализ основных компонентов (PCA): уменьшение отклонений в процессе подбора за счет создания нового набора ортогональных компонентов

После правильного вычисления и проверки 133 прогнозных переменных мы можем сначала взглянуть на матрицу корреляции Пирсона.

В качестве общего утверждения мы можем заметить, что многие переменные полностью некоррелированы, что может быть хорошим признаком, поскольку это будет означать, что мы можем зафиксировать различные статистические закономерности в наборе данных. Это также может означать, что в наборе данных есть шум.

Затем я применил Анализ главных компонентов (PCA), чтобы отфильтровать потенциально зашумленную информацию в наборе данных, а также уменьшить дисперсию в процессе подбора. Фактически, все вновь созданные основные компоненты ортогональны, что повышает производительность моделей машинного обучения.

NB: PCA должен соответствовать только обучающей выборке, чтобы избежать проблем с причинно-следственной связью при тестировании и будущих прогнозах.

PCA - это очень мощный метод улучшения отношения сигнал-шум (SNR), потому что затем мы можем выбрать первые компоненты, которые будут соответствовать моделям, чтобы собрать большую часть информации в ограниченном объеме. количество предикторов. Как правило, это может быть огромным преимуществом для нашего исследования, потому что многие переменные, тем не менее, коррелированы.

На следующем рисунке мы можем идентифицировать четкую модель «изгиба» на графике Суммарная доля объясненной дисперсии (кумулятивная PVE), которая может указывать на то, что большая часть информации будет содержаться в первых 15 ПК (т.е., что разница в последних ПК не так велика). Однако мы будем выполнять перекрестную проверку при построении моделей (с nPCs = 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 80), для сравнения результатов, полученных на разных наборах ПК. Конечная цель - определить оптимальное количество компьютеров, чтобы компромисс смещения / дисперсии был как можно лучше с точки зрения точности.

IV - Установка нескольких моделей машинного обучения с разными настройками гиперпараметров

Я решил подогнать несколько типов моделей к вновь созданным основным компонентам и подогнать их с различными настройками гиперпараметров. Я использовал четыре типа моделей: Случайные леса, Машины опорных векторов (SVM), усредненные нейронные сети (avNNet) и Дискриминантный анализ. (LDA / QDA).

Эти модели были обучены предсказывать исход игры бинарным образом: либо команда хозяев поля («H»), либо команда гостей («A») может стать победителем. Я также приспособил модели для вывода оценочных вероятностей победы. Все модели были обучены с использованием «точности» в качестве метрики, даже с учетом различных критериев, таких как gini, энтропия или площадь под кривой (AUC) можно было бы использовать в этом случае двоичной классификации.

Набор для тестирования всех моделей был составлен из самого последнего сезона на тот момент (сезон 2018/2019 - 1230 игр), то есть я оставил 9 сезонов для обучения моделей. Представленные ниже результаты показывают небольшое преобладание моделей avNNet в отношении точности прогнозов. Лучшие модели выделены темно-зеленым цветом, а лучшие модели по типу модели - светло-зеленым.

NB: В течение периода тестирования фаворит Bet365 выигрывал в 67,64% случаев. Там внизу видно, что мои лучшие модели за период тестирования перевыполнили свои оценки.

V - Создание прибыльных стратегий ставок с помощью оригинальной эвристики (личное творчество)

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

[ИЗМЕНИТЬ 17.02.2021] Не вдаваясь в подробности из соображений конфиденциальности, я создал метрику, которая позволяет нам выявлять предвзятость в оценке коэффициентов букмекеров.

После того, как мы определили наши прибыльные стратегии, мы просто вычисляем прогнозы для будущих игр, определяем игры, которые относятся к прибыльным стратегиям, и отправляем предстоящие ставки по электронной почте. В случае конфликта между стратегиями (т.е. стратегия A говорит делать ставку Home, а стратегия B говорит делать ставки Away), мы выбираем лучшую стратегию прогноз.

Voilà! Нам нужно только делать ставки, чтобы получить прибыль.

Результат в RStudio выглядел следующим образом (теперь он отправляется по электронной почте в виде .csv):

VI. Как насчет результатов?

NB: конвейер постоянно развивался, поэтому первые ставки были сделаны с использованием алгоритма, который намного менее сложен, чем финальная версия, представленная в этой статье. Можно даже заметить, что прибыль растет с каждым неделей.

Благодаря этому конвейеру я смог применить инструкции по ставкам, основанные на этом алгоритме, и смог заработать 856 евро благодаря играм НБА. Лига НБА, безусловно, моя лучшая программа, что приятно, учитывая тот факт, что в течение 6-месячного сезона проводится много игр. Вот несколько графиков, показывающих путь к получению этой суммы:

Затем мы сможем посмотреть на результаты, включая записи о ставках других лиг.

По состоянию на 13 марта 2020 года применение описанной стратегии в сочетании со стратегией ставок, в соответствии с которой я делал больше ставок на хорошо выступающие лиги, такие как НБА и итальянская футбольная лига Серия А, позволил мне получить чистую прибыль в размере 1284,33 евро с начальным банкроллом в 250 евро в период с 31 декабря по 13 марта с рентабельностью инвестиций на игру (ROI) 7,42%, что идеально соответствовало моим ожиданиям - это определенно высококонкурентная рентабельность инвестиций:

Полный текст статьи содержит исчерпывающую информацию о значимости этих результатов ставок, в частности, с помощью моделирования Монте-Карло.

Заключение

В общем, мы можем быть очень довольны этим конвейером. В нем смешались мой аппетит к аналитике данных с моей страстью к спорту. Кроме того, я надеюсь, что эта статья может быть полезна людям, которые хотят начать свои собственные стратегии ставок на основе данных.

Не стесняйтесь обращаться ко мне для получения дополнительной информации / помощи по вопросу программных ставок на спорт. Я также построил аналогичные конвейеры для различных видов спорта и лиг (сейчас создано 76 различных программ! - см. Полный документ и обширную документацию по проекту [1]).

Не стесняйтесь оставлять отзывы / вопросы / хлопки или связываться со мной для получения дополнительной информации. Я доступен для коммерческих обсуждений: личное использование, коммерческое использование, права собственности.

Контакт: [email protected]

Другая статья: «I. Готовый код Python для создания набора данных прогнозирования запасов | Себастьен Караро | Аналитика Видхья | Декабрь, 2020 | Середина"

Ссылки:

[1] Полный текст статьи: Paper_Exploiting_bookmakers_biases.pdf (seb943.github.io)

[2] Страница GitHub: Seb943 (github.com)

[3] Репозиторий ScrapeOP: Seb943 / scrapeOP: пакет Python для очистки oddsportal.com (github.com)

Используемое программное обеспечение:

Я написал все с нуля в R 3.6.0. Программа очистки веб-страниц была разработана на Python 3.6.2 с использованием среды Pyzo.

Обоснование названия: Через 73 дня мы умножили на 1534,33 / 250, так что за 366 дней мы могли бы умножить на r = (1534,33 / 250) ^ ( 366/73) = 8926,64. Итоговый банкролл составил бы 250 * r = 2 231 660 €. Очевидно, название предназначалось для запоминания, а не для реальной оценки.