Делать большие умные ставки

16

Я пытался написать алгоритм для предложения ставок в 1X2 (взвешенных) играх.

По сути, в каждой игре есть набор матчей (домашние и выездные команды):

  • 1: дом побеждает
  • X: привлечь
  • 2: прочь побеждает

BWin 1X2 Betting Game

Для каждого совпадения и символа ( 1, Xи 2) я назначу процент, который представляет шансы / вероятность того, что этот символ будет правильным результатом матча. Вот массив, представляющий структуру:

$game = array
(
    'match #1' => array // stdev = 0.0471
    (
        '1' => 0.3,     // 30%     home wins
        'X' => 0.4,     // 40%     draw
        '2' => 0.3,     // 30%     away wins
    ),

    'match #2' => array // stdev = 0.4714
    (
        '1' => 0.0,     //   0%    home wins
        'X' => 0.0,     //   0%    draw
        '2' => 1.0,     // 100%    away wins
    ),

    'match #3' => array // stdev = 0.4027
    (
        '1' => 0.1,     //  10%    home wins
        'X' => 0.0,     //   0%    draw
        '2' => 0.9,     //  90%    away wins
    ),
);

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

Следующий псевдоалгоритм должен описывать весь рабочий процесс:

for each match, sorted by std. dev         // "uncertain" matches first
    if still can make triple bets
        mark top 3 symbols of match        // mark 3 (all) symbols
    else if still can make double bets
        mark top 2 symbols of match        // mark 2 (highest) symbols
    else if can only make single bets      // always does
        mark top symbol of match           // mark 1 (highest) symbol

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

2^double_bets * 3^triple_bets * cost_per_bet (= 1)

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

Допустим, я хочу заплатить максимум 4, перечислив все возможные коэффициенты в PHP ( @ IDEOne ):

$cost = 1; // cost per single bet
$result = array();
$max_cost = 4; // maximum amount to bet

foreach (range(0, 3) as $double)
{
	foreach (range(0, 3) as $triple)
	{
		if (($double + $triple) <= 3) // game only has 3 matches
		{
			$bets = pow(2, $double) * pow(3, $triple); // # of bets

            $result[$bets] = array
            (
                'cost'      => $bets * $cost, // total cost of this bet
                'double'    => $double,
				'triple'    => $triple,
            );

            if ($result[$bets]['cost'] > $max_cost)
			{
				unset($result[$bets]);
            }
        }
    }
}

ksort($result);

Получает следующий вывод:

Array
(
    [1] => Array
        (
            [cost] => 1
            [double] => 0
            [triple] => 0
        )

    [2] => Array
        (
            [cost] => 2
            [double] => 1
            [triple] => 0
        )

    [3] => Array
        (
            [cost] => 3
            [double] => 0
            [triple] => 1
        )

    [4] => Array
        (
            [cost] => 4
            [double] => 2
            [triple] => 0
        )
)

Проблема

Если я выберу максимально возможную сумму денег ( 4), мне придется делать ставки с двумя двойными ставками, если я использую описанный выше псевдоалгоритм, я получу следующее предложение ставки:

  • match #1 => X1
  • match #2 => 2
  • match #3 => 12

Который кажется неоптимальным по сравнению с тройной ставкой, которая стоит 3и покрывает большую неопределенность:

  • match #1 => X12
  • match #2 => 2
  • match #3 => 2

Приведенный выше пример приобретает еще большую актуальность, если учесть, что match #3шансы могут быть:

$game['match #3'] = array // stdev = 0.4714
(
    '1' => 0.0,           //   0%    home wins
    'X' => 0.0,           //   0%    draw
    '2' => 1.0,           // 100%    away wins
);

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

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

Я уже несколько дней бьюсь головой об стену, надеясь получить какое-то прозрение, но до сих пор мне удавалось придумать только два полу [плохих] решения:


1) Нарисуйте «линию»

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

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


2) Брутфорс

Я придумал эту идею, когда писал этот вопрос, и я знаю, что в описанном мною контексте это не будет иметь смысла, но я думаю, что смогу заставить его работать, используя несколько иные метрики. В принципе, я мог бы сделать программу предложить ставки (# тройных и двойных ставок) для каждой возможной суммы денег , я мог бы играть (от 1до 4в моем примере), применяя псевдо-алгоритм , который я описал выше , и вычисление глобального рейтинга значения (что - то как % of symbols * match stdev- я знаю, это не имеет смысла).

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


Я чувствую, что есть элегантное решение, но я просто не могу понять это ...

Спасибо за любую помощь в решении этой проблемы, спасибо.


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

Мне нужно знать, сколько тройных, двойных и одиночных ставок я сыграю за конкретную игру (все матчи). Я уже знаю, какие символы я хочу сыграть, глядя на каждый матч в отдельности.

Аликс Аксель
источник
4
Хорошие люди на math.stackexchange.com могут лучше понять проблему, которую вы описываете, что, в свою очередь, может предложить хорошие способы ее реализации :)
1
@Lethargy: Однажды я разместил здесь вопрос о треугольнике Паскаля и простых числах, которые были перенесены в математику. Я получил около 15 голосов (как на SO, так и на math.SE) очень быстро, но вопрос был закрыт менее чем за 30 минут, и он даже больше не существует. Я не думаю, что им очень нравятся такие "простые" вопросы.
Аликс Аксель
2
Если мы оптимизируем для Максимального числа побед, это кажется действительно простым. Среднее количество побед - просто шанс выигрыша каждого отдельного экземпляра, сложенного вместе. Т.е. если мы установим одну ставку на максимальный шанс, мы выиграем в среднем 0,4 + 1 + 0,9 = 2,3 игры. Таким образом, если добавление 1 ставки всегда было одинаково дорогостоящим, решение было бы просто отсортировать шансы на выигрыш и использовать первые шансы COST (это дает «лучший» результат для примера). Если при добавлении второго к третьему стоимость отличается, то это усложняется (хотя рекурсивно работает грубо), и я думаю, что я пересплю.
2
Как математик, который не знает php, мне было бы намного проще атаковать эту проблему, если бы она была в математической записи, а не в коде.
2
Вы слышали о критерии Келли ? Если нет, то есть кое-что для вас.

Ответы:

2

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


  • 1) рассчитать каждую возможную комбинацию нескольких ставок, которые я могу сделать

Для примера и сумм, которые я указал в своем вопросе, это будет:

  • 3 одинарных, 0 двойных, 0 тройных = эквивалентно 1 одиночной ставке
  • 2 одиночных, 1 двойных, 0 тройных = эквивалент 2 одинарных ставок
  • 2 одинарных, 0 двойных, 1 тройной = эквивалент 3 одинарных ставок
  • 1 одиночная, 2 двойная, 0 тройная = эквивалентно 4 одиночным ставкам

  • 2) рассчитать стандартное отклонение шансов символа для каждого матча

             |    1    |    X    |    2    |  stdev  |
             |---------|---------|---------|---------|
    Match #1 |   0.3   |   0.4   |   0.3   |  0.047  |
             |---------|---------|---------|---------|
    Match #2 |   0.1   |   0.0   |   0.9   |  0.402  |
             |---------|---------|---------|---------|
    Match #3 |   0.0   |   0.0   |   1.0   |  0.471  |
    

  • 3) для каждой комбинации из нескольких ставок ( шаг 1 ) рассчитать рейтинг по формуле:

    рейтинг = (#n (x) [+ #n (y) [+ #n (z)]]) / stdev (#n)

Где #nконкретное совпадение и #n(x|y|z)упорядоченные шансы символов.

  • Матчи обрабатываются от низких до высоких стандартных отклонений.
  • Отдельные символы в каждом матче обрабатываются с высоким или низким коэффициентом.

Тест на 1 одинарную, 2 двойную, 0 тройную ставку:

  • (#1(X) + #1(1)) / stdev(#1) = (0.4 + 0.3) / 0.047 = 14.89
  • (#2(2) + #2(1)) / stdev(#2) = (0.9 + 0.1) / 0.402 = 2.48
  • #3(2) / stdev(#3) = 1.0 / 0.471 = 2.12

Эта ставка дает мне глобальный рейтинг 14.89 + 2.48 + 2.12 = 19.49.


Тест на 2 одинарных, 0 двойных, 1 тройную ставку:

  • (#1(X) + #1(1) + #1(2)) / stdev(#1) = (0.4 + 0.3 + 0.3) / 0.047 = 21.28
  • #2(2) / stdev(#2) = 0.9 / 0.402 = 2.24
  • #3(2) / stdev(#3) = 1.0 / 0.471 = 2.12

Что дает мне глобальный рейтинг 21.28 + 2.24 + 2.12 = 25.64. :-)


Все оставшиеся ставки явно будут хуже, поэтому нет смысла их проверять.

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

Есть указатели?

PS: извините за плохое форматирование, но парсер MD, похоже, отличается от StackOverflow.

Аликс Аксель
источник
Рассматривали ли вы линейное программирование ( en.wikipedia.org/wiki/Linear_programming ) для решения этой проблемы?
Виктор Сорокин
1

Как насчет решения, основанного на симплекс-методе. Поскольку предпосылка для использования метода Simplex не выполняется, нам нужно немного изменить метод. Я называю модифицированную версию «Пройди по линии».

Метод:

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

  1. Начните с максимального количества тройных ставок. Рассчитать общую неопределенность.
  2. Удалить одну тройную ставку. Добавьте одну или две двойные ставки, придерживаясь максимальной стоимости. Рассчитать общую неопределенность.
  3. Повторяйте шаг 2, пока не получите максимальное количество двойных ставок.

Выберите ставку с наименьшей общей неопределенностью.

Клас Линдбек
источник
0

Что я пришел, наблюдая за этими ставками, я пришел к этим выводам.

Ожидаемое значение
Допустим, у вас есть 3 ставки 1.29 5.5 and 10.3(последняя ставка в таблице) EV для ставок,
EV = 1/(1/1.29+1/5.5+1/10.3) - 1 = -0.05132282687714185 если считается, что вероятности того, что один выигрыш над другим распределен как
1/1.29 : 1/5.5 : 1/10.3, то вы теряете свои деньги в долгосрочной перспективе, так как ваш EV отрицательный.
Вы можете получить прибыль только в том случае, если сможете выяснить, каковы вероятности каждого исхода и выявить нарушения.

Допустим, истинные вероятности
0.7 : 0.2 : 0.1

Это означает, что ставки должны быть 1.43 \ 5.0 \ 10.0

Вы можете предположить, что в этом случае наилучшим выигрышем является ничья, так как она дает вам место
EV(0) = 5.5/5 - 1 = 0.1
для ставки на проигрыш,
EV(2) = 10.2/10 - 1 = 0.02
а ставка на домашний выигрыш даже EV-
EV(1) = 1.29/1.43 - 1 = -0.10

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