Робити великі, розумні (помилкові) ставки


16

Я намагався кодувати алгоритм, щоб запропонувати ставки в 1X2 (зважених) іграх.

В основному, у кожній грі є набір матчів (домашні та виїзні команди):

  • 1: домашні виграші
  • X: малювати
  • 2: виграє гості

Гра на ставки BWin 1X2

Для кожного матчу і символу ( 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) Намалюйте "Лінію"

В основному я б сказав, що матчі зі стдевом, нижчим за конкретне значення, були б потрійними, матчі зі стдевом більшими - це подвійні ставки, а решта одиночні ставки.

Проблема з цим, звичайно, полягає у знаходженні відповідних конкретних меж - і навіть якщо я дійсно знаходжу ідеальні значення для "найрозумнішої" ставки, я все одно не знаю, чи вистачає грошей, щоб грати запропоновану ставку, або якщо Я міг би зробити ще більшу (теж розумну) ставку ...


2) Брутфорс

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

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


Я відчуваю, що є елегантне рішення, але я просто не можу зрозуміти це ...

Будь-яка допомога, яка вирішує цю проблему, дуже вдячна, дякую.


Здається, є певна плутанина щодо моєї проблеми, я вже вирішував це в цьому питанні, а також у коментарях, але неправильне тлумачення все ще переважає, принаймні, в деяких.

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


4
Хороші люди на math.stackexchange.com могли б краще зрозуміти проблему, яку ви описуєте, що, в свою чергу, може запропонувати хороші способи її втілення :)

1
@Lethargy: Одного разу я опублікував тут питання про трикутник Паскаля та основні номери, які останні перейшли на математику. Я отримав близько 15 оновлень (як на SO, так і на math.SE) дуже швидко, але питання було закрито менше, ніж за 30 хвилин, і його вже навіть не існує. Я не думаю, що їм дуже подобаються подібні "прості" запитання.
Алікс Аксель

2
Якщо ми оптимізуємо максимальну кількість виграшів, це здається насправді дуже просто. Середня кількість виграшів - це просто шанс на виграш кожного окремо взятого примірника. Тобто якщо ми встановимо одну ставку на максимальний шанс, ми виграємо в середньому 0,4 + 1 + 0,9 = 2,3 гри. Отже, якщо додавання 1 ставки завжди було однаково дорогим, рішенням було б просто сортувати шанси на виграш і скористатися першими шансами на вартість (це дає "найкращий" результат для прикладу). Якщо вартість відрізняється при додаванні секунди проти третьої до чогось, це стає складнішим (хоч груба рекурсивна робота, хоча), і я думаю, я спатиму це над цим.

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. Оскільки передумова використання методу 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


Я не думаю, що ти отримав моє запитання. Я вже знаю, на які символи (і в якому порядку в разі декількох ставок) робити ставки на кожен окремий матч. Моя проблема полягає у з'ясуванні ідеальної кількості потрійних та подвійних ставок, які я повинен зіграти, переглядаючи всі поєдинки (та їх відповідні шанси на символи) у всьому світі .
Алікс Аксель
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.