/softpro

Primary LanguageJupyter Notebook

Описание репозитория

Здесь собраны наработки по построению модели, которая восстанавливает вероятности исходов событий
футбольного матча. На вход модели подается 6 значений:

  1. Значение половинчатого тотала
  2. Кэф на тотал меньше (грязный)
  3. Кэф на тотал больше (грязный)
  4. Значение половинчатого гандикапа победы домашней команды
  5. Кэф на гандикап домашней команды (грязный)
  6. Кэф на противоположный гандикап выездной команды (грязный)

Структура репозитория

  • ./optimizers.py - поиск параметров распределений Пуассона и Скеллама
  • ./odds.py - моделирование букмекерской линии
  • ./tests/* - тестовые запуски отдельных подзадач

Алгоритм расчёта коэффициентов

  1. Очищаем входные кэфы от маржи, получаем вероятности исходов
  2. Из вероятности тотал меньше находим mu, используя PoissonOptimizer. Минимизируем абсолютное отклонение распределения Пуассона от входной вероятности. Алгоритм оптимизации Nelder-Mead.
  3. Из найденного mu и вероятности победы с гандикапом домашней команды находим mu1 и mu2, используя SkellamOptimizer. Минимизируем абсолютное отклонение распределения Скеллама от входной вероятности. Алгоритм оптимизации Nelder-Mead.
  4. Зная mu, mu1 и mu2, рассчитываем всю линию.

Эксперименты и выводы

  • ./experiments/margins.ipynb - итоговые формулы маржи, которые искались длительное время. Как оказалось, обе формулы дают одинаковые чистые вероятности из кэфов после очищения.
  • ./experiments/margin_exploration.ipynb - Исследования касательно маржи, различные графики, попытки найти зависимость ошибок и величины маржи. В процессе работы никаких чётких зависимостей не было обнаружено.
  • ./experiments/skellam_system_solver.ipynb - попытка добавить кэф на ничью как модификационный параметр, чтобы модельное распределение Скеллама лучше аппроксимировало именно ничейный исход.
  • ./experiments/pinnacle_test_data.ipynb - вычисление ошибок модели на данных пиннакла (3 excel файла).
  • ./experiments/different_bookmakers.ipynb - вычисление ошибок модели на кэфах разных букмекеров.
  • ./experiments/totals_hdp_polyfit.ipynb - попытка найти общие паттерны в изменениях кэфов между целыми, четвертичными и половинчатыми тоталами, а также сравнение вероятностей побед, взятых из MoneyLine и гандикапов. Успехом не увенчалась - каждый матч имеет уникальную зависимость, средняя ошибка разницы MoneyLine и гандикапов в районе 0.3% вероятности, имеются матчи с разницей вероятностей больше 1%. Получается, что даже если будет идеальная модель, которая предсказывает гандикапы максимально точно, ошибка на MoneyLine сохранится и будет ненулевой, так что неясно, как можно интерпретировать точность в данном случае. Как бы просто линия букмекерская сама содержит ошибки, поэтому не понимаю, насколько честно проверять модель на недостаточно точных данных.
  • ./experiments/new_margin_and_tests.ipynb - все описанное выше в одном ноутбуке. Его лучше не смотреть, т.к. что там происходит будет понятно лишь автору.

Если смотреть суммарно, то есть несколько причин, из-за которых не удается увеличить точность модели:

  1. Противоречивые вероятности на одни и те же исходы, но взятые из разных маркетов - уже здесь содержится ошибка, которую модель никак победить не сможет.
  2. Графики, полученные для тоталов и гандикапов в экспериментах. Особое внимание привлекает расположение значений вероятности исходов относительно модельных вероятностей (для гандикапов и тоталов). Нет какой-то систематической ошибки - модель для разных матчей может выдавать вероятность исхода как выше, чем в кэфе, так и ниже. В среднем, наши формулы повторяют тренды в изменениях кэфов, но повторить в точности не удается гипотетически из-за того, что нагрузка линии уникальная на каждый матч.
  3. Коэффициенты аппроксимирующего полинома, которые получаются при восстановлении зависимости между целыми, четвертичными и половинчатыми исходами (здесь). Для каждого матча эти коэффициенты получаются уникальными, и их не получается никак обобщить.
  4. Из хорошего - алгоритм Nelder-Mead не требует расчёта производной, что экспериментально обеспечивает более стабильную сходимость, меньше плюется warning'ами. Но значения mu, mu1, mu2, как правило, не сильно отличаются от старого алгоритма (BFGS).
  5. По поводу ML:

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

Вторая причина - нет исторических данных (не в плане истории линии, а каких-то других показателей, на основе которых можно предсказать вероятность событий). Данный подход очень похож на подход из этой статьи.

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

Гипотезы для проверки

  • Посмотреть матчи, в которых есть несколько половинчатых тоталов, и приближенно решить систему уравнений, чтобы понять, минимизируется ли Loss до нуля для этой системы. Если нет, то получается, что вероятности из разных тоталов принадлежат разным распределениям Пуассона, что опять даёт повод задуматься о возможности найти стабильно более точное решение.