Русский
Русский
English
Статистика
Реклама

Ставки на спорт

Как победить букмекеров с помощью ИИ опыт студентов магистратуры Наука о данных

06.05.2021 14:05:14 | Автор: admin

Привет, Хабр! Сегодня хотим представить вам проект студентов магистратуры Наука о данных НИТУ МИСиС и Zavtra.Online (подразделении SkillFactory по работе с университетами) созданный на внутреннем хакатоне, который прошел в марте. Команда поделится решением выбранной задачи предсказание победителя-бойца турнира UFC. Задача отличалась от прочих тем, что после написания модели из неё можно сделать целый продукт, оформив модель в приложение, готовое к использованию конечными пользователями, например теми, кто захочет обыграть букмекеров.


Гипотеза и её проверка

Для нашего проекта мы сформулировали гипотезу, что на победу бойца влияют:

  • физические параметры бойца (его рост, вес, размах рук и ног);

  • возраст бойца (всё-таки со временем физически мы слабеем);

  • разница в опыте соперников (вряд ли какой-то новичок без опыта одолеет Хабиба);

  • характер поведения бойца на ринге (чаще обороняется или чаще нападает);

  • географические параметры (вдруг наш боец не успел адаптироваться к другому часовому поясу).

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

Принцип разделения прост: мы случайным образом разбиваем свои данные примерно на 70 %, используемых для обучения модели, и 30 % для тестирования модели. Однако есть нюанс... Для предсказания результата боя UFC важно, чтобы тренировочная выборка была раньше тестовой во временном периоде.

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

Разработка проекта

В ходе работы над проектом мы просидели в зуме, а затем в дискорде более 10 часов. Углубились во все тонкости предобработки данных, сделали немного занимательной визуализации и обучили нашу модель.

Примерно 90 % времени мы потратили на обработку данных и остальные 10 % на обучение модели. Пайплайн подготовки данных верхнеуровнево выглядел следующим образом: мы очистили датасет от пропусков и выбросов и обогатили его новыми признаками.

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

Сбор данных и статистика

Ментор предоставил нам спарсенные данные по истории Боёв UFC и статистику по бойцам. Данные и Jupyter Notebook с бейзлайном модели можно найти по этой ссылке на Kaggle. В связи с тем что сроки у нас были ограничены, мы решили не заниматься дополнительным парсингом фичей, а уделить большое внимание обработке имеющихся данных и генерации новых признаков.

Также в процессе обработки мы собрали немного занимательной статистики по боям: например, на этом бублике можно увидеть распределение боев по категориям, из которой можно увидеть, что мужских боёв гораздо больше, чем женских (увы).

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

Предобработка данных

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

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

Вторым шагом был сбор фичей с кумулятивной статистикой по всем предыдущим боям для каждого из соперников и генерации из получившейся накопленной суммы новых важных признаков, таких как серия побед, сумма побед нокаутами, сумма чистых побед, точность ударов, среднее время боя, KO/TKO и т. д. Это перечень важных показателей по уже проведённым боям, которые обычно публикуются на сайте UFC до начала боя. Затем мы посчитали разницу по физическим характеристикам бойцов, удалили коррелированные между собой величины и законсервировали данные в pkl-файл.

Случайный лес, стекинг, бэггинг и итоговая модель

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

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

Процент точности прогноза победы варьировался от 75 до 82%! Но какая разница, если обучение было неправильным?.. Модель не должна смотреть в будущее, как это было у нас. Решить эту проблему удалось достаточно просто: мы вернули даты для нашего датасета и поделили на тренировочные и тестовые по датам: данные до 2018 года взяли за тренировочные, данные после 2018 года за тестовые, и вуаля, точность упала в среднем на 5 %, однако теперь мы в ней хотя бы уверены.

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

Посмотреть на модель можно на GitHub.

Для того чтобы модель предсказала победителя на новых данных, нужно эти данные обработать таким же образом, как мы это делали в нашем ноутбуке (Jupyter Notebook) DeepOverfitting-DataPreparing, после этого просто подать эти строчки данных для двух бойцов в predict функцию нашей модели и получить предсказание, либо 0, либо 1, 0 победил 2 боец, 1 победил первый боец.

Итоги

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

Поэтому мы наметили следующий план:

  1. Улучшим точность предсказаний путем более кропотливой настройки модели.

  2. Проверим нашу текущую модель на предстоящих боях.

  3. Попробуем применить нейронные сети и глубокое обучение.

  4. Разработаем приложение, которое будет в удобном виде показывать, сколько и куда ставить.

  5. Станем кем-то кроме букмекера, кто заработает на ставках. И, конечно, будем писать на Хабре про дальнейшее развитие проекта. Букмекеры, берегитесь, мы идём за вами.

Состав команды работавшей над проектов:

  • Евгения Шикина (г. Видное)

  • Оксана Евсеева (г. Барселона)

  • Максим Щиколодков (г. Москва)

  • Михаил Стриженов (г. Москва)

  • Лев Неганов (г. Москва)

  • Кирилл Плотников (г. Екатеринбург)

Узнать больше про магистратуру можно на сайтеdata.misis.ruи вTelegram канале.

Ну и конечно не магистратурой единой! Если вы хотите узнать больше про data science, машинное и глубокое обучение заглядывайте к нам на соответствующий курсы, будет непросто, но увлекательно.

Узнайте, как прокачаться и в других специальностях и навыках или освоить их с нуля:

Другие профессии и курсы
Подробнее..

Заработать на ставках Миф или реальность? Можно ли заработать на букмекерских вилках?

28.08.2020 10:04:17 | Автор: admin
Привет, хабр! Сегодня я вам расскажу про свой опыт ставок на спорт с использованием простой математики и базовых знаний в программировании.

Всё началось в августе 2019 года, когда мой хороший знакомый рассказал мне про человека, который зарабатывает ставками на спорт. Для удобства, этого человека будем называть Никитой. Никита живёт в одном из городов Украины и, как вы уже догадались, занимается ставками и, по рассказам моего друга, сделал целое состояние на них. Сейчас у Никиты есть крутой дом, крутые тачки, и он ни в чём себе не отказывает. Я естественно спросил, в чём его секрет, а друг ответил арбитраж.




Арбитраж

Что ж такое арбитраж? Сам термин пришёл к нам из экономики, суть его заключается в том, что в разных местах на один и тот же товар имеются разные цены, которые позволяют купив товар в одном месте тут же перепродать его в другом месте с некоторой прибылью.

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

Рассмотрим такие примеры:

1. П1 П2 ставка на победителя в баскетбольном матче;

2. Тотал больше 2.5 Тотал меньше 2.5 количество голов в футбольном матче

Вилки образовываются по нескольким причинам:

1. Конкуренция букмекеров они выставляют высокие коэффициенты, чтобы привлечь клиентов;

2. Разное мнение у крупных контор, которые собственными силами выставляют линию;

3. Прогруз линии ситуация, когда изменение коэффициентов вызвано не какими-либо объективными причинами, а большим объемом ставок на один из рынков событий.

Рассмотрим такой пример: баскетбольный матч Даллас Майами, букмекер PariMatch предлагает коэффициент 2.1 на победу Даллас, в тоже время, букмекер 1xbet предлагает коэффициент 2.1 на победу Майами. Если мы поставим на Даллас 100 USD и на Майами 100 USD на PariMatch и на 1xbet соответственно, то мы уйдём в плюс на 10 USD, вне зависимости от исхода матча, при вложенных 200 USD. Если оставить капитал в 200 долларов и коэффициенты были б 1.5 и 3.5 на победу Даллас и Майами соответственно, то это тоже была букмекерская вилка. Только теперь на победу Даллас надо будет поставить 140 долларов(140 * 1.5 = 210 прибыль при победе первой команды), а на победу Майами 60(60 * 3.5 = 210 прибыль при победе второй команды). Опять уходим в плюс на 10 USD при вложенных 200.

Первая попытка

Теперь вы знаете, что такое букмекерская вилка. Пожалуй, продолжу историю. Узнав секрет Никиты я подумал, а чем я хуже? Я тоже хочу дом, машины. В этот же день создал проект на C#(ибо я его изучал в своей шараге) и начал гуглить, а как же мне это все реализовать. Во-первых, надо считать информацию с сайта, подумал я. Ребята со Stack Overflow посоветовали использовать CSS-селекторы и XPath в HTML документе.

В то время я таких слов знать не знал, пришлось разобраться. Я посмотрел несколько гайдов в интернете и спустя некоторое время научился обрабатывать все матчи на футбол с букмекерской конторы(БК) Pinnacle, правда это очень долго работало. Одновременно с моим успехом начался учебный год, а именно 11 класс. Мне надо было готовиться к ЗНО и олимпиадам, поэтому работу с вилками пришлось отложить.

Между первой и второй

И вот, прошло около 8 месяцев, на дворе май, в школе всё сдал, олимпиады закончились, к ЗНО более-менее подготовился, заняться нечем и я решил вернуться в игорный бизнес. Рассказал про это друзьям, и мой хороший друг Миша, который отлично знает математику, решил присоединиться.

К середине июня мы могли в течении 10 минут получить всю линию на футбол на Pinnacle,1xbet, PariMatch, BetfairSB и возникла проблема, как же сопоставлять одинаковые матчи? Миша предложил простое и в то же время гениальное решение сравнивать похожесть двух строк(название матчей) и сравнивать день и месяц начала матча. Осталось только выбрать алгоритм для сравнения и подобрать константы, это всё было сделано за один день. По итогу был выбран Dice Coefficient.

После этого опять небольшая проблема, на разных конторах могут по разному называться события, например вместо Total Over 2.5 может быть Over 2.5. Было решено перевести из формата конкретной БК к какому то общему, например для тоталов переводилось все в формат Total Over 2.5.

К слову, для вилок мы использовали только нецелые форы, тоталы и победу/поражение и все вилки выводили в Telegram-канал с помощью бота. Когда программа была готова, мы запустили её на тестирование. За день работы было найдено 10 15 вилок с прибылью 1 2 процента и миллион вилок с прибылью меньше процента. В скором времени мы добавили настольный теннис и киберспорт и были приятно удивлены

Появилось много вилок в прибылью более 2 процентов, даже было штук 5 вилок с прибылью более 3 процентов. Скорее всего, это связано с тем, что на настольный теннис и киберспорт не так много ставят, как на тот же футбол. Поэтому чтобы прогрузить линию надо поставить меньшую сумму, чем на более популярный вид спорта.

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

Начали искать, где подешевле, и наткнулись на такую вещь, как AWS(Amazon Web Sevices), при регистрации можно получить бесплатный пробный период на пользование их сервисом и деньги, который можно потратить на создание виртуальной машины(сервера). И мы подумали жизнь в шоколаде, вилки есть, бесплатный сервер есть, что ещё надо работяге?

Последнее, что осталось обсудить это какой процент от баланса ставить, ибо если ставить всё и сразу, то надо будет часто переводить деньги между конторами, что вызовет подозрение, да и на комиссии при переводах будет теряться вся прибыль. Мы пришли к выводу, что ставить около 10 % от суммы балансов на всех БК оптимальное решение. И ещё, поскольку 1xbet пользуется дурной репутацией среди букмекеров, то мы решили на этой конторе ставить только круглые суммы(1, 2, 3 евро, никаких 1.25, 2.6), а на пинакле ставить всё остальное.

И вот, настал день Х, я открыл счет на этих БК от имени своего отца, ибо на тот момент мне было 17, закинул по 20 евро на обе конторы и начал ставить. Прошло 3 дня, мы заработали около 4 евро и средняя вилка была 3.5 %, в день ставился весь капитал. По нашим подсчетам, используя формулу сложных процентов, за 21 день можно удвоить вложенный капитал.

Учитывая издержки, такие как поставил на одном БК, а на другом уменьшились коэффициенты или за день не была поставлена вся сумма, то можно ожидать удвоения капитала за месяц.
Максимальная ставка в среднем около 300 евро. И поэтому с начальным капиталом в 1000(500 на пинакле, 500 на 1xbet), можно каждый месяц получать по 1000, 500 на человека. Для первокурсника просто сказка, а если процесс ставок ещё и автоматизировать, то вообще огонь. Но это всё в теории.

Четвертый день, какого то черта, все ставки на пинакле сыграли, и на 1xbet баланс стал равен нулю. Закинули на 1xbet ещё 20 евро, и на пятый день баланс опять ноль, что ж за невезение, подумали мы. Шестой день, закинули 30 евро на 1xbet, и что то произошло.

Подводные камни

День начался как обычно, врубил прогу, пью чай, жду вилок. Вилки в телеграм-канал выводить, а когда собираешься ставить коэффициенты на сайтах не те. Мы поначалу думали, что так быстро изменяются коэффициенты, но мы моментально сверяли информацию с телеграм-канала и сайтами БК. С пинаклом всё совпадало(коэффициент в телеграме с коэффициентом на сайте), а значит проблема должна быть со второй конторой. Я для интереса открыл какой то матч в режиме инкогнито (чтобы я был не залогинен в аккаунт) и открыл тот же матч в обычном режиме, где у меня выполнен вход в мой аккаунт. После этого увидел страшное коэффициенты, когда я залогинен, уменьшены на процентов 7, поэтому ни о каких вилках речи и идти не может.

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

После этого инцидента мы почитали отзывы про другие БК и оказывается, что никто не любит вилочников(удивительно) и почти все конторы либо уменьшают максимальную ставку в 1000 раз, либо уменьшают коэффициенты. Как же БК вычисляет вилочников? Изучив информацию с некоторых сайтов и применив здравый смысл, можно прийти к заключению, что они тоже видят вилки своей БК с другими (либо у них свой сканер, либо пользуются каким то в интернете) и обладая этой информацией, можно написать несложный алгоритм. Получая информацию о прибыли, количестве ставок, количестве видов спорта, на которых были сделаны ставки, на размеры ставок и, наверное самое важное, сколько денег было поставлено на вилки, алгоритм делает вывод, применять ли к аккаунту какие либо ограничения или нет. Естественно БК используют ещё какие то параметры, я перечислил основные. Несомненно у них ещё есть способы определения нечестных игроков.

Вы неверное спросите, почему мы не изучили отзывы раньше? А я вам отвечу, мой знакомый так уверенно рассказывал про Никиту и что это большой секрет, что мы даже и подумать не могли, что может такое произойти. Есть только несколько букмекеров, которые не применяют ограничения к вилочникам(самых известных около трех). Я быстренько написал для них парсер и запустил программу вилок почти нету, только две три микровилки по 0.5 процента. Мы были подавлены, но руки не опустили. Спустя некоторое время я узнал, что такое биржа ставок.

Вилки в Live

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

Я решил посмотреть на одну из самых популярных. На ней можно ставить и предлагать ставки во время игры(InPlay). И я вот подумал, что будет происходить с коэффициентами во время игры и можно ли ловить вилки на самой бирже, ведь предлагают коэффициенты на события обычные люди. Оказывается, у этой биржи есть API, которое позволяет получать информацию о состоянии рынка, но оно стоит около 300 фунтов, а покупать его, не протестировав как минимум глупо. Однако есть и бесплатное API, через которое можно делать ставки.

Мы начали думать, можно ли без их API считывать данные. Спустя несколько дней мне удалось написать парсер, который каждые 80 мс мог получать информацию по ставками на один матч. Был ещё один нюанс, для не зарегистрированных пользователей и для тех, кто никогда не вносил депозит, коэффициенты устаревшие на 0 120 секунд, а это неприемлемо для ставок в режиме live.

Я опять таки открыл счет на своего отца, закинул 30 евро и запустил на тестирование. Вилок вида Тотал больше 2.5 и Тотал меньше 2.5 не было, но были вилки такого типа: если текущий счет 0:1, можно поставить на точный счет 0:1 и тотал больше 1.5.

Таких вилок было достаточно много, с прибылью больше 1.5 процента было около 5 за день, а это очень круто, ибо выплата идёт сразу после матча. Тогда можно за день поставить несколько таких вилок, и опять таки, используя формулу сложных процентов, получаем удвоение капитала за месяц, но это всё опять в теории. Поскольку у людей не безгранично денег, то они не могут заключать пари в лайве на миллионы евро, поэтому максимальная ставка в среднем около 100 евро. Я подумал, что это замечательно, можно с вложенных 100 получать 100 каждый месяц, 50 на каждого, это конечно не 500, но тоже замечательно. Спустя неделю тестирования я обнаружил, что все вилки в футболе идут после второго тайма, обычно после 70 минуты. Используя этот факт можно значительно оптимизировать программу благодаря рассматриванию только матчей после 70 минуты.

И опять настал день Х, я разобрался как ставить через их API и запустил программу. Первые три дня всё было как по маслу, ну почти всё Бот не успевал ставить, даже с частотой в 80 мс. Коэффициенты изменялись слишком быстро. Поэтому поставленные вилки были либо с нулевой прибылью, либо немного убыточные. Почти сто процентов кто то написал бота, который работает эффективнее нашего. Несмотря на конкурентов, за три дня бот принес нам небольшую прибыль в размере 0.5 евро(1.6 процента от вложенного капитала).

Ещё один подводный камень

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

Немаловажной причиной этого было то, что как то это всё слишком просто, по сути зарабатывать деньги с воздуха. Скорее всего умные люди уже это всё сделали лет 10 назад, когда такие биржи только появились, и, не обладая достаточным количеством ресурсов, простым ребятам там не заработать. С вилками у букмекеров такая же ситуация, они легко могут вычислить тех, кто планирует забрать у них деньги. Они борются с вилочниками уже лет 20 и явно выработали некоторые методики против таких умников. Но означает ли это, что на вилках нельзя заработать?

Олигарх Никита

Вы наверное помните Никиту из начала статьи, который зарабатывает деньги на ставках. Богатые люди не любят раскрывать свои секреты, но мой знакомый, который знает Никиту лично, рассказал мне часть схемы. Поскольку Никита заблокирован во всех букмекерских конторах мира он ставить вилки не может, но другие люди могут, такие как друзья Никиты или его работники. По всему миру есть люди, которые по звонку телефона могут выйти на улицу и поставить в местной букмекерской конторе круглую сумму(в живую, не путать с онлайном). Рано или поздно этих ребят тоже забанят, но что мешает нанять новых? Это только маленькая часть схемы, я уверен, что у него ещё есть много способов заработка на спорте, но этим он делится, само собой, не хочет.

Заключение

Не обладая достаточным количеством ресурсов или уникальной стратегией заработать на ставках скорее всего не получится. Так что либо придумайте что-то крутое, либо станьте олигархом.

P.S. Про детали реализации я рассказал в своей первой статье.
Подробнее..

Организуем собственный мини-тотализатор на матчи ЧЕ 2020 по футболу

07.06.2021 10:04:02 | Автор: admin

Через несколько дней начнется чемпионат Европы по футболу - второй по значимости турнир среди сборных. Как и в любом другом турнире в нем будут как интересные, так и достаточно проходные для нейтрального болельщика матчи вроде Дания - Финляндия или Польша - Словакия. Смотреть такие матчи не всегда интересно, поэтому мы придумали в офисе игру, благодаря которой всегда есть за кого болеть, что значительно добавляет интерес просмотру. Мы играли в нее во время каждого крупного футбольного турнира, и правила игры претерпели ряд изменений по сравнению с первоначальными, чтобы сделать ее более интересной.

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

Механика

Суть игры заключается в том, что участники должны делать ставки на каждый матч, по результатам которого между участниками делятся очки пропорционально баллам. За угаданный счет дается 3 балла. За правильную разницу голов - 2 балла, а за угаданный результат - 1 балл.

Пример

За матч дается 100 очков, и он завершился победой хозяев со счетом 3:1. Один участник поставил на счет 3:1, еще 2 участника на счет 2:0 и 4:2, и еще 3 участника на счет 1:0, 4:1 и 5:1. В сумме они набрали 10 баллов (1 * 3 + 2 * 2 + 3 * 1). Таким образом первый участник получит 30 очков (100 / 10 * 3), а другие по 20 и 10 очков, соответственно.

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

Также мы решили сделать, чтобы количество очков за матч возрастало к концу турнира, чтобы у аутсайдеров не терялся интерес. Так за групповой раунд мы начисляли 100 очков, за финала - 200, четвертьфинал - 300, полуфинал - 400, а финал стоил 500 очков. Благодаря такой схеме, самая жара начиналась именно к концу турнира, и иногда, даже с последнего места, за несколько последних матчей кто-то вырывался на первые места.

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

Чтобы сделать игру более азартной можно организовать внутренний банк, куда все участники скинут какую-то сумму, а затем он будет поделен между победителями всего турнира. Можно, например, чтобы победитель забирал 50% всего банка, второе место - 30%, а третье - 20%. Количество призовых мест можно увеличить, если участников много, чтобы в конце турнира был интерес для тех, кто находится внизу таблицы.

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

Организация турнира

Итак, что нужно, чтобы организовать у себя в офисе турнир ? Прежде всего нужна программа с веб-интерфейсом. Ее мы быстро сделали на открытой и бесплатной платформе lsFusion. Нельзя сказать, что там просто идеальный пользовательский интерфейс, но для организации игры нам было достаточно. Программу можно установить как на своем сервере (но нужно, чтобы она была доступна извне, так как матчи обычно проходят в нерабочее время), так и воспользоваться уже установленной программой на нашем выделенном сервере. Второй вариант не требует никаких дополнительных действий, поэтому я сначала расскажу именно про него.

Точка доступа в программу находится по адресу : https://euro.lsfusion.org. В ней можно одновременно проводить сколько угодно турниров. Заходить в систему можно как с настольного компьютера, так и с мобильного или планшета.

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

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

Таким же образом должны зарегистрироваться все остальные участники. После регистрации участника организатор может добавить его в свой турнир нажав кнопку Добавить игрока на форме Таблица :

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

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

Форма "Ставки"Форма "Ставки"

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

Форма "Таблица"Форма "Таблица"

Здесь участник может посмотреть итоговую таблицу по набранным очкам в режиме реального времени.

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

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

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

Установка на собственный сервер

Для установки потребуется виртуальный сервер под Linux с 2ГБ памяти.

Сначала нужно установить платформу lsFusion, как указано в этой инструкции.

Затем создать в папке /var/lib/lsfusion файл с именем Euro2020.lsf и поместить туда следующий код :

MODULE Euro2020;REQUIRE Authentication, Time;CLASS Team 'Команда';name 'Название' = DATA ISTRING[50] (Team) IN id;FORM team 'Команда'    OBJECTS t = Team PANEL    PROPERTIES(t) name        EDIT Team OBJECT t;FORM teams 'Команды'    OBJECTS t = Team    PROPERTIES(t) READONLY name    PROPERTIES(t) NEWSESSION NEW, EDIT, DELETE         LIST Team OBJECT t;CLASS Match 'Матч';dateTime 'Начало матча' = DATA DATETIME (Match) NONULL IN id;started (Match m) = dateTime(m) < currentDateTime();CONSTRAINT CHANGED(dateTime(Match m)) AND PREV(dateTime(m)) AND NOT DROPPED(m IS Match) MESSAGE 'Запрещено изменять время начала матча';homeTeam 'Хозяева' = DATA Team (Match) NONULL;nameHomeTeam 'Хозяева' (Match m) = name(homeTeam(m)) IN id; awayTeam 'Гости' = DATA Team (Match) NONULL;nameAwayTeam 'Гости' (Match m) = name(awayTeam(m)) IN id; homeScore 'Результат (хозяева)' = DATA INTEGER (Match);awayScore 'Результат (гости)' = DATA INTEGER (Match);homeScore 'Ставка (хозяева)' = DATA INTEGER (Match, CustomUser);awayScore 'Ставка (гости)' = DATA INTEGER (Match, CustomUser);home 'Победа (хозяева)' (Match m) = (GROUP SUM 1 IF homeScore(m, CustomUser c) > awayScore(m, c)) IF started(m);   tie 'Ничья' (Match m) = (GROUP SUM 1 IF homeScore(m, CustomUser c) = awayScore(m, c)) IF started(m);away 'Победа (гости)' (Match m) = (GROUP SUM 1 IF homeScore(m, CustomUser c) < awayScore(m, c)) IF started(m);startedHomeScore 'Ставка (хозяева)' (Match m, CustomUser c) = homeScore(m, c) IF started(m);  startedAwayScore 'Ставка (гости)' (Match m, CustomUser c) = awayScore(m, c) IF started(m);  hasBet 'Сделана ставка' (Match m, CustomUser c) = homeScore(m, c) AND awayScore(m, c);countBets 'Кол-во ставок' (Match m) = GROUP SUM 1 IF hasBet(m, CustomUser c); CONSTRAINT DROPPED(Match m IS Match) AND PREV(countBets(m)) MESSAGE 'Запрещено удалять матч, по которому сделаны ставки';CONSTRAINT CHANGED(homeScore(Match m, CustomUser c)) AND started(m) MESSAGE 'Запрещено изменять результат начавшегося матча';CONSTRAINT CHANGED(awayScore(Match m, CustomUser c)) AND started(m) MESSAGE 'Запрещено изменять результат начавшегося матча';CONSTRAINT CHANGED(homeScore(Match m)) AND NOT started(m) MESSAGE 'Запрещено изменять счет матча до начала матча';CONSTRAINT CHANGED(awayScore(Match m)) AND NOT started(m) MESSAGE 'Запрещено изменять счет матча до начала матча';currentHomeScore 'Ставка (хозяева)' (Match m) = homeScore(m, currentUser()); currentAwayScore 'Ставка (гости)' (Match m) = awayScore(m, currentUser());changeCurrentHomeScore (Match m)  {     FOR CustomUser u = currentUser() DO        INPUT =homeScore(m, u) CHANGE;}changeCurrentAwayScore (Match m)  {     FOR CustomUser u = currentUser() DO        INPUT =awayScore(m, u) CHANGE;}// Расчет очковcost 'Стоимость' = DATA INTEGER (Match);correctScore (Match m, CustomUser c) = homeScore(m, c) == homeScore(m) AND awayScore(m, c) == awayScore(m); correctScore 'Правильный счет' (CustomUser c) = GROUP SUM 1 IF correctScore (Match m, c); correctDelta (Match m, CustomUser c) = homeScore(m, c) - awayScore(m, c) == homeScore(m) -  awayScore(m); correctDelta 'Правильная разница' (CustomUser c) = GROUP SUM 1 IF correctDelta (Match m, c);correctResult (Match m, CustomUser c) = (homeScore(m, c) - awayScore(m, c)) * (homeScore(m) -  awayScore(m)) > 0 OR                                       (homeScore(m, c) == awayScore(m, c) AND homeScore(m) == awayScore(m)); correctResult 'Правильный результат' (CustomUser c) = GROUP SUM 1 IF correctResult (Match m, c);points 'Кол-во баллов' = CASE                                            WHEN correctScore(Match m, CustomUser c) THEN 3                                            WHEN correctDelta(m, c) THEN 2                                            WHEN correctResult(m, c) THEN 1;points 'Кол-во баллов' (CustomUser c) = GROUP SUM points(Match m, c); points 'Кол-во баллов' (Match m) = GROUP SUM points(m, CustomUser c);pointsStarted 'Кол-во баллов' (Match m) = points(m) IF started(m); score 'Кол-во очков' (Match m, CustomUser c) = NUMERIC[16,4](cost(m) * points(m, c) / points(m));  score 'Кол-во очков' (CustomUser c) = GROUP SUM score(Match m, c); FORM match 'Матч'    OBJECTS m = Match PANEL    PROPERTIES(m) cost, dateTime, nameHomeTeam, nameAwayTeam, homeScore, awayScore    EDIT Match OBJECT m;DESIGN match {    GROUP(,m) {        columns = 1;    }}backgroundScore = RGB(255, 224, 224);backgroundBet = RGB(224, 224, 255);backgroundOwn = RGB(224, 255, 224);FORM matches 'Ставки'    OBJECTS m = Match    PROPERTIES(m) READONLY cost, dateTime, nameHomeTeam, nameAwayTeam    PROPERTIES(m) BACKGROUND backgroundScore() READONLY homeScore, awayScore, pointsStarted    PROPERTIES(m) BACKGROUND backgroundBet() countBets, home, tie, away    PROPERTIES BACKGROUND backgroundOwn() currentHomeScore(m) ON CHANGE changeCurrentHomeScore(m),                                           currentAwayScore(m) ON CHANGE changeCurrentAwayScore(m)    PROPERTIES(m) NEWSESSION NEW, EDIT, DELETE         OBJECTS c = CustomUser GRID    PROPERTIES(c) READONLY name[Contact]    PROPERTIES(m, c) READONLY hasBet    PROPERTIES(m, c) SHOWIF started(m) READONLY BACKGROUND backgroundScore() points, score     PROPERTIES(m, c) SHOWIF started(m) READONLY BACKGROUND backgroundBet() homeScore, awayScore;FORM standings 'Таблица'    OBJECTS c = CustomUser GRID    PROPERTIES(c) READONLY name[Contact], correctScore, correctDelta, correctResult, points, score    PROPERTIES(c) NEWSESSION NEW, EDIT, DELETE         OBJECTS m = Match GRID    PROPERTIES(m) READONLY cost, dateTime, nameHomeTeam, nameAwayTeam    PROPERTIES(m) BACKGROUND backgroundScore() READONLY homeScore, awayScore, pointsStarted    PROPERTIES(m, c) READONLY BACKGROUND backgroundScore() points, score     PROPERTIES(m, c) READONLY BACKGROUND backgroundBet() startedHomeScore, startedAwayScore    ORDERS score(c) DESC ;NAVIGATOR {    NEW matches;    NEW standings;    NEW teams;} 

Перезапустить серверную службу при помощи команд :

systemctl stop lsfusion4-serversystemctl start lsfusion4-server

Приложение будет доступно по адресу http://<ip>:8080

Впервые мы провели игру еще во время чемпионата Европы 2012 года. Многие из наших сотрудников в итоге болели за кого-то в абсолютно всех матчах турнира, хотя в обычной ситуации не стали бы смотреть и половины. В этот раз мы решили поделиться нашим опытом с другими людьми. Если кому-то будет интересно, то тоже включайтесь в игру. В случае возникновения каких-либо проблем или вопросов всегда можно зайти в slack канал, где мы поможем по любым вопросам, или написать на почту info [собака] lsfusion.org.

Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru