Взлом НБА, максимальное увеличение составов DFS с помощью машинного обучения

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

Я фанат Nuggets, но мои модели не зависят от команды. Это просто означает, что мои эмоции не повлияют на результат. Надеюсь, вам понравится резюме так же, как мне понравилось работать.

Давайте перейдем к тому, как я это делаю.

Я использовал Python, в частности pulp и pandas, для редактирования данных. Я использовал экспорт csv-файлов линейки FanDuel для ежедневных соревнований, и я использовал python «ball-reference-web-scraper »для извлечения информации в свои собственные наборы данных. Для последующего анализа единственные данные, которые необходимо извлечь, - это csv дневного состава FanDuel. Ниже приводится краткое изложение моей модели MAX, которую я участвовал в конкурсах FanDuel около двух месяцев.

Ежедневный фэнтези-баскетбол

Для тех из вас, кто не знает, как работает фэнтези-баскетбол. Я представлю краткую разбивку. Игроки получают очки за забитые корзины, подборы, перехваты и блоки. Они теряют баллы за совершение оборотов.

В ежедневном фэнтези-баскетболе вы создаете новый состав для каждой серии игр. Список игр предназначен для тех игр НБА, которые состоятся в этот вечер. В результате у вас есть доступ к Леброну Джеймсу как к игроку в одну ночь, но, возможно, не в следующую. Все зависит от того, когда они играют. У игроков есть зарплата, связанная с использованием их в вашем составе, и вы должны заполнить определенные должности, чтобы создать состав. Вы ограничены общим потолком зарплаты, и каждая вакансия должна быть заполнена. В FanDuel, откуда будут взяты следующие данные, общий потолок заработной платы составляет 60000 долларов США, а должности, которые вы должны заполнить, следующие:

  • 2 разыгрывающих (PG)
  • 2 стрелка (SG)
  • 2 малых нападающих (SF)
  • 2 силовых форварда (PF)
  • 1 Центр (C)

Чтобы дать вам пример игрока, которого можно включить в состав, Леброн Джеймс - научный сотрудник, и он стоит 11200 долларов, чтобы включить его в ваш состав. Цены предоставлены FanDuel и изменены / основаны на внутренних алгоритмах FanDuel.

Соревнования в FanDuel организованы в виде турниров разного размера с разной структурой бай-ина / выплат. Я тестировал все свои модели в ежедневном выпуске NBA Piggy Bank Shot. Размер этого турнира составляет около 280 000 человек, с бай-ином 5 центов и выплатой 30% лучших. Люди могут входить в состав до 150 составов, поэтому важно отметить, что 280 000 уникальных людей не играют одновременно.

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

  1. В идеале, каждую ночь попадая в топ-30%
  2. Набирая очки в более высоком процентиле, когда выплаты увеличиваются время от времени, модель для достижения этого может попытаться взять игроков с подъемом / спадом и играть с ними ночь за ночью, чтобы дождаться, пока звезды сравняются.
  3. Выбирая, когда ставить больше денег, это сработает, если я смогу определить риск и соответственно размер своих ставок.

Модель MAX

Я называю эту модель МАКС. Это очень просто, я максимизирую фэнтезийные очки за игру (FPPG) за счет заработной платы, используя функцию pulp - LPMaximize.

Объяснение очень высокого уровня - у вас есть несколько линейных ограничений. Эти ограничения изображены на графике, и существует возможная область, в которой существуют все решения. Максимальная точка в пределах допустимой области найдена, и это будет вашим окончательным решением. Пример функции, которую мы построим на графике в этом случае, будет: PG1 + PG2 + SG1 + SG2 + SF1 + SF2 + PF1 + PF2 + C1 ≤ 60000 долларов, где каждая позиция представляет собой зарплату. Об этом ограничении по заработной плате упоминалось ранее.

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

Я делаю некоторые предположения / корректировки с набором данных, предоставленным FanDuel, перед запуском функции максимизации.

  1. Командная защита не имеет значения, я имею в виду, что эта модель предполагает, что игрок набирает в среднем одинаковое количество очков независимо от соперника, которого он играет. Это внутреннее предположение модели, которое, вероятно, неверно, но мне придется создать другую модель, чтобы проверить это.
  2. Средние показатели игроков неизвестны, пока они не сыграют 10 игр. Я выбрал 10 игр без особой на то причины. Я смогу определить хорошее ограничение, выбрав приемлемое стандартное отклонение и посмотрев на игры, в которые играли, когда они достигнут этого отклонения. Идея здесь в том, что чем больше игр они играют, тем меньше отклонение. Теоретически это сработает, но у меня есть подозрение, что либо мне придется выбрать большое отклонение, либо им придется сыграть слишком много игр, чтобы их можно было включить. Обратной стороной моей отсечки на 10 игр является то, что моя модель не учитывает звездных игроков, которые были травмированы.
  3. Любые травмы удаляют игрока из моего набора данных. Сюда входят игроки, у которых есть решение по игровому времени (GTD). Это чисто для снижения риска. Я бы предпочел потерять пару очков, чем взять ноль, потому что я не могу достоверно проверить свои составы прямо перед игрой.

Анализ

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

Как вы можете видеть, МАКСИМАЛЬНАЯ ЧАСТЬ повсюду, а также есть небольшая тенденция к росту советника по мере прохождения сезона. Должен отметить, что игроки, не пропускавшие игры, в этом сезоне сыграют около 50 игр.

Следующий график показывает MAX и ITM в сравнении с советником. Это еще один способ посмотреть на производительность по сравнению с ожидаемым средним значением.

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

  • МАКС: 291,69
  • ITM: 311,96
  • EA: 311.32

Приведенный выше график и средние значения также показывают, что даже при создании советника не факт, что я буду ITM.

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

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

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

Хороших игроков недооценивают

Раньше в этом сезоне Лука Дончич, главный герой Mavericks, и Андре Драммонд, обладатель C для Pistons, имели разумные цены за полученные ими фэнтезийные очки, и оба они были включены в мои модели почти каждую ночь. Поскольку у них была хорошая игра за хорошей игрой, их зарплата выросла до той отметки, которую они иногда включают. Я не думаю, что это влияет на мой общий счет в составе, это просто означает, что есть игроки с лучшим соотношением цены и качества.

Игроки, которые не заслуживают участия

FanDuel не присваивает ценность игрокам исключительно на основе их среднего значения за сезон, однако мой алгоритм максимизации использует только это. Благодаря этому методу вы получаете таких игроков, как Дарио Сарич, PF for the Suns. В среднем он набирает менее 10 очков FPPG на длинных отрезках, а затем проходит несколько партий, набирающих гораздо больше очков, чем в среднем за сезон - 24. Из-за этого он очень дешев, поэтому модель каждый раз выбирает его для игры. Это определенно влияет на конечный результат, потому что другой игрок с аналогичной ценой может пожертвовать парой очков ради гораздо меньшего риска.

Некоторые игроки не могут попасть в игру из-за травм

Такие игроки, как Энтони Дэвис, профессиональный игрок в составе «Лейкерс», или Кайри Ирвинг, главный игрок в «Нетс», встречаются редко. Стабильно они очень хорошо набирают очки, но так же постоянно у них есть метка решения игрового времени. Из-за тега GTD они не попадают в разворачивание. Это влияет на модель. Много раз эти игроки обязательно будут играть, и по ним можно пропустить большие игры. Я мог бы удалить тег перед запуском модели, но опять же, если по какой-то причине они не играют, мой состав получит ноль на этом месте игрока.

Более дешевые универсальные плееры

Эти игроки появляются в каждой игре, набирают в среднем одни и те же очки в каждой игре и стоят примерно одинаково в каждой игре. Примером игрока, который появляется в каждой игре, является Харрисон Барнс, SF для Kings. Он набирает 25–30 очков за игру и стоит около 4500-5000 долларов. На модель это не влияет. Однако, если вы пытаетесь получить очень высокие баллы ITM, когда турнирные выплаты больше, тогда он не тот игрок, который вам нужен, потому что его потолок ограничен.

Заключение и дальнейшие действия

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

  1. Средний балл EA и средний балл ITM очень близки друг к другу, так как по мере того, как будет играть больше игр, я ожидал, что среднее значение MAX будет сходиться с EA.
  2. С некоторыми пулами игроков, похоже, больше шансов на победу.

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

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

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

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