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

Примеры этих альтернативных источников данных убедительны и кажутся бесконечными:

  • Швейцарская инвестиционная компания UBS Investment Research использует спутниковые снимки для оценки заполняемости парковок Walmart, экстраполируя квартальные продажи и таким образом получая полезную инвестиционную информацию. Например, постоянно пустые автостоянки могут сигнализировать о низкой посещаемости, указывая на то, что фонд может захотеть продать акции.
  • Thinknum, альтернативный поставщик данных, использует данные веб-скрейпинга для анализа инвентаризации транспортных средств в Carvana и CarMax. Фонды могут действовать на основе этих данных, чтобы прогнозировать предстоящие доходы этих компаний или даже оценивать спрос в более широкой автомобильной промышленности на автомобили таких производителей, как Tesla или Ford.
  • Two Sigma, количественный хедж-фонд с активами под управлением в размере 60 миллиардов долларов, имеет платформу Macro Alpha Capture, которая платит специалистам по инвестициям за представление торговых идей с указанием сроков, обоснования и уровня убежденности. Затем эта информация (предположительно) используется в различных моделях машинного обучения либо для совершения сделок, либо для предоставления информации управляющим фондами Two Sigma.

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

Прогнозируется, что к 2028 году ставки на спорт превратятся в индустрию стоимостью 140 миллиардов долларов, и, как оказалось, она созрела для использования, но недостаточно используемых наборов данных. В понятие ставки на спорт также входит киберспорт, в который входят такие игры, как CS:GO, League of Legends, Dota 2, Starcraft и другие (рис. 1).

Одна игра, которой нет в этом списке, но вполне может быть в будущем, — это Rocket League (RL). На данный момент это моя любимая игра, и объяснить ее довольно просто — это футбол, но с летающими машинами вместо людей. Если это звучит глупо, что ж, так оно и есть, но это красивая игра — упрощенная концепция в сочетании с непостижимо высоким потолком мастерства. И с почти 100 миллионами активных игроков в месяц не над чем смеяться. Нетрудно предположить, что в ближайшем будущем у RL появятся широко доступные формы ставок.

Помня об этом, моя цель начала вырисовываться: использовать общедоступные данные уникальным способом и попытаться предсказать исход матча Ракетной лиги, создав информационное преимущество для будущего сценария ставок на спорт.

Это упражнение служит отличной аналогией с более широким финансовым миром и использованием альтернативных наборов данных. Данные общедоступны? Конечно. Обладает ли среднестатистический розничный инвестор знаниями, навыками и капиталом для сбора, агрегирования и обработки этих данных в полезные идеи? Точно нет. О справедливости, кажется, не может быть и речи.

Следующие три раздела посвящены техническим деталям очистки и изучения набора данных и оценок моделей машинного обучения. Не стесняйтесь переходить к концу для «извлеченных уроков».

Альтернативные источники данных: парсинг в Интернете

Моя идея состояла в том, чтобы собрать данные о матчах RL 1v1 и игроках, участвующих в каждом из них. Для создания прогностической модели мне понадобились входные данные:

  • Статистика игрока 1 и игрока 2 — процент побед, общее количество побед, рейтинг подбора игроков (MMR), соотношение голов и бросков и т. д. (соотношение голов и бросков определяется как количество голов, забитых игроком, деленное на количество выстрелов, которое они делают, что является прокси-метрикой точности. Подробнее об этом позже.)

и выходные данные:

  • исход игры (победа или поражение, с точки зрения игрока 1).

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

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

  • Ballchasing.com, который позволяет пользователям загружать повторы собственных матчей и автоматически анализировать их. Отсюда я собрал информацию о матче и имена игроков — player1_name, player2_name и player1_outcome.
  • Rocketleague.tracker.network, который автоматически отслеживает профили игроков и по каждому создает сводную статистику. Отсюда я собрал статистику навыков для обоих игроков — общее количество побед, MMR и соотношение голов/выстрелов.

Код представляет собой крысиное гнездо, и даже я не знаю, как оно работает, но если вам по-садистски любопытно, вы можете проверить его на моем GitHub. Я опишу процесс на высоком уровне здесь:

  • У Ballchasing.com есть API. Используя пакеты Python, такие как JSON, requests и pandas, я получил доступ к данным JSON для 200 страниц веб-сайта и записал соответствующую информацию в словарь. , преобразовал его в DataFrame и сохранил как электронную таблицу Excel. В результате было получено около 40 000 точек данных, по одной для каждого совпадения.
  • Я взял эти данные и использовал их для разбора Rocketleague.tracker.network, у которого, к сожалению, не было общедоступного API. Я импортировал данные с Ballchasing.com, повторял каждое совпадение и создавал собственные URL-адреса для каждого игрока на основе его профиля в Steam или имени xbox/psn/psynet. Затем для каждого профиля я перенес статистику игрока в другую таблицу DataFrame и Excel.

Конечный результат показан на Рис. 2 ниже.

Исследовательский анализ данных и разработка функций

Следующим шагом является очистка данных и разработка некоторых новых функций для использования в качестве входных данных для модели машинного обучения. После удаления данных с нулевыми значениями (например, игроков с закрытыми профилями или удаленными учетными записями или простым тайм-аутом HTTP-запроса) я получил около 10 000 пригодных для использования точек данных.

Мне также нравится исследовать набор данных и выявлять любые интересные тенденции или взаимосвязи между переменными. Быстрый способ начать исследование — получить сводную статистику:

Из вышеизложенного выделяются несколько интересных моментов:

  • Игрок 1, который загрузил повтор на Ballchasing.com, в среднем одержал 5954 победы. Их средний MMR был 1240.
  • В частности, у одного игрока было 35 000 побед. Их зовут Scripts_RL, и хотя они входят в 0,1 % лучших игроков по общему количеству побед, они входят только в 40 % лучших игроков с точки зрения классифицировать. (Для справки: у меня около 3000 побед, и я вхожу в ~1% лучших игроков по рейтингу. Я не уверен, должно ли это быть источником гордости для меня или смирения для них.)
  • Если предположить, что продолжительность матча составляет около 7 минут, а процент побед составляет 50%, это соответствует 8000 часам игрового времени в матче. С момента выпуска RL в июле 2015 года это составляет почти четыре часа игры каждый день в течение шести лет подряд. Дикий.

Также важно проверить сбалансированность набора данных, что можно сделать довольно легко:

Затем я перешел к отношениям между различными функциями, такими как MMR и соотношение голов/выстрелов (Рисунок 3).

На графике мы видим четкую отрицательную корреляцию между MMR и соотношением голов/выстрелов. Имеет смысл, что этот показатель должен уменьшаться по мере повышения уровня мастерства, потому что опытный игрок отразит или заблокирует больше ударов по воротам, чем неквалифицированный игрок. Из-за этой взаимосвязи я могу исключить эту функцию из процесса обучения моей модели, чтобы избежать мультиколлинеарности.

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

Подбор модели и результаты

Я использовал две разные модели для прогнозирования исхода матча. Играть с различными моделями тривиально, когда у вас есть нерабочий код и статические данные, поэтому я решил реализовать как XGBoost, так и логистическую регрессию scikit-learn.

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

Логистическая регрессия — это контролируемый алгоритм классификации машинного обучения, который предсказывает вероятность того, что зависимая переменная равна 0 (в нашем случае — проигрыш) или 1 (выигрыш).

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

Результаты приведены ниже:

  • XGBoost показал точность 57%.
  • Логистическая регрессия также показала точность 57 %.

Что поднимает вопрос — какой уровень точности приемлем? В данном случае моя цель состоит в том, чтобы модель была более точной, чем человек, в предсказании победителя матча. Чтобы установить этот базовый уровень, я вручную классифицировал около 100 совпадений на основе тех же данных, на которых обучалась модель. Используя бутстрап-сэмплинг, я добился средней точности… 57,3%.

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

Есть несколько проблем с набором данных, которые я собрал, которые объясняют эту относительно низкую точность. Сначала взгляните на Рисунок 4 слева. Каждая точка на графике соответствует одному матчу между двумя игроками. Оранжевые точки означают, что игрок 1 выиграл, синие точки означают, что игрок 1 проиграл. Сможете ли вы сгруппировать данные в оранжевые или синие точки, просто взглянув на график? Я знаю, что не мог — нет четких тенденций или линейных контрольных точек, которые указывали бы, должен ли игрок 1 выиграть или проиграть. Мы также не должны ожидать, что модель машинного обучения сможет волшебным образом делать эти прогнозы.

Еще одна проблема возникает, когда мы рассматриваем то, что на самом деле выражает каждая функция, знание, которое, как многие могут сказать, требует «экспертизы в предметной области». Я решил очистить MMR игрока или рейтинг подбора игроков и использовать его для обучения модели ML. На первый взгляд это кажется хорошей идеей, но когда мы перестаем думать об этом, удобство использования MMR для прогнозирования исхода матча начинает разваливаться. Rocket League присваивает MMR, который обновляется после каждого матча в зависимости от разницы между вашим MMR и MMR соперников, а также от того, выиграли вы или проиграли. В общем, причина существования MMR заключается в том, чтобы сопоставлять игроков с другими игроками того же уровня. Из этого следует, что в большинстве матчей 1 на 1 игроки будут иметь одинаковый, если не равный MMR. Понимание, предоставленное моделью, довольно сложно разобрать — разница MMR не имеет легко различимой связи с исходом матча, если подавляющее большинство матчей составляются поровну.

Несмотря на относительно низкую точность моделей, они не могут быть полностью непригодными для использования. Оценить изменчивость производительности модели можно с помощью k-fold cross-validation. Если изменчивость для каждой модели низкая (например, точность каждой модели колеблется около одного и того же значения {57,5 %, 56,7 %, 57,2 % и т. д.}), то можно безопасно использовать модель в производственной среде для размещения реальных ставок. Чтобы уточнить, представьте, что вы на 95% уверены, что точность вашей модели составляет 57% плюс-минус несколько процентных пунктов. Это означает, что при достаточном количестве ставок ваши шансы быть правильными приближаются к 57%, поэтому вы будете выполнять ставки с положительным математическим ожиданием. И наоборот, если вы менее уверены в изменчивости выходных данных модели, вам следует остерегаться ее использования в любых реальных целях.

Уроки выучены

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

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

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

"Я в любой момент предпочту опытного C невежественному A".

Спасибо за прочтение!