Dokonywanie dużych, inteligentnych (er) zakładów

16

Próbowałem kodować algorytm sugerujący zakłady w grach 1x2 (ważonych).

Zasadniczo każda gra ma zestaw meczów (drużyny gospodarzy vs gości):

  • 1: wygrywa dom
  • X: remis
  • 2: wyjazd wygrywa

BWin Zakłady 1x2

Dla każdego dopasowania i symbolu ( 1, Xi 2) przypiszę procent reprezentujący szanse / prawdopodobieństwo, że ten symbol będzie prawidłowym wynikiem dopasowania. Oto tablica reprezentująca strukturę:

$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
    ),
);

Obliczam również odchylenie standardowe dla każdego zakładu (skomentowane w powyższym fragmencie); wyższe odchylenia standardowe oznaczają większą pewność, a mecze z najniższymi odchyleniami standardowymi przekładają się na wyższy poziom niepewności, a najlepiej, jeśli to możliwe, powinny być obstawione podwójnym lub potrójnym zakładem.

Poniższy pseudo-algorytm powinien opisywać ogólny przepływ pracy:

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

Jak dotąd tak dobrze, ale muszę powiedzieć algorytmowi, ile chcę wydać. Powiedzmy, że pojedynczy zakład kosztuje 1w dowolnej walucie, wzór na obliczenie kosztu wielokrotnego zakładu:

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

Oczywiście algorytm powinien spróbować przeznaczyć jak najwięcej pieniędzy dostępnych na sugestię zakładu (inaczej nie miałoby to większego sensu), a teraz jest to trudniejsze ...

Powiedzmy, że chcę zapłacić maksymalnie 4, wymieniając wszystkie możliwe wielokrotności w 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);

Daje następujące dane wyjściowe:

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
        )
)

Problem

Jeśli zdecyduję się zagrać maksymalną dostępną kwotą pieniędzy ( 4), będę musiał postawić zakład z dwoma podwójnymi liczbami, jeśli użyję opisanego powyżej pseudo-algorytmu, otrzymam następującą propozycję zakładu:

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

Co wydaje się nieoptymalne w porównaniu z potrójnym zakładem, który kosztuje 3i obejmuje większą niepewność:

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

Powyższy przykład nabiera jeszcze większego znaczenia, jeśli weźmie się pod uwagę, że match #3szanse mogą być następujące:

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

W tym przypadku marnowałbym podwójnego bez powodu.

Zasadniczo mogę wybrać tylko największy (być może głupi) zakład, a nie najmądrzejszy, największy zakład .

Uderzam głową o ścianę od kilku dni, mając nadzieję, że dostanę objawienia, ale do tej pory udało mi się wymyślić tylko dwa pół- [złe] rozwiązania:


1) Narysuj „linię”

Zasadniczo powiedziałbym, że mecze o stdev niższym niż określona wartość byłyby potrójne, mecze o stdev o wiele wyższe byłyby podwójnymi zakładami, a pozostałe pojedynczymi zakładami.

Problem w tym, oczywiście, polega na znalezieniu odpowiednich konkretnych granic - i nawet jeśli znajdę idealne wartości dla „najmądrzejszego” zakładu, nadal nie wiem, czy mam wystarczająco dużo pieniędzy, aby zagrać w sugerowany zakład, czy też Mógłbym postawić jeszcze większy (również inteligentny) zakład ...


2) Bruteforce

Wpadłem na ten pomysł pisząc to pytanie i wiem, że nie będzie on miał sensu w kontekście, który opisałem, ale myślę, że mógłbym sprawić, by działał przy użyciu nieco innych wskaźników. Zasadniczo, mógłbym zmusić program do sugerowania zakładów (liczba potrójnych i podwójnych zakładów) na każdą możliwą kwotę pieniędzy, którą mogłem zagrać (od 1do 4w moim przykładzie), stosując pseudo-algorytm, który opisałem powyżej i obliczając wartość globalnego rankingu (coś jak % of symbols * match stdev- wiem, to nie ma sensu).

Zakład z najwyższym rankingiem (obejmującym niepewność) byłby sugerowanym zakładem. Problem z tym podejściem (poza tym, że nie ma to jeszcze sensu) polega na tym, że gry, w których będzie pracował mój program, nie są ograniczone do 3 meczów, a liczba podwójnych i potrójnych kombinacji zakładów dla tych meczów byłaby znacznie wyższy.


Wydaje mi się, że istnieje eleganckie rozwiązanie, ale nie mogę go pojąć ...

Dziękujemy za pomoc w rozwiązaniu tego problemu.


Wydaje się, że istnieje pewne zamieszanie dotyczące mojego problemu, już to rozwiązałem w tym pytaniu, a także w komentarzach, ale błędna interpretacja nadal wydaje się przeważać, przynajmniej dla niektórych.

Muszę wiedzieć, ile potrójnych, podwójnych i pojedynczych zakładów zagram dla określonej gry (wszystkich meczów). Wiem już, w jakie symbole chcę grać, patrząc na każdy mecz indywidualnie.

Alix Axel
źródło
4
Dobrzy ludzie na stronie math.stackexchange.com mogą zapewnić lepsze zrozumienie opisywanego problemu, co z kolei może sugerować dobre sposoby jego realizacji :)
1
@Lethargy: Kiedyś opublikowałem tutaj pytanie dotyczące trójkąta Pascala i liczb pierwszych, które zostały przeniesione do matematyki.SE. Otrzymałem około 15 pozytywnych opinii (zarówno na SO, jak i na math.SE) bardzo szybko, ale pytanie zostało zamknięte w mniej niż 30 minut i już nawet nie istnieje. Nie sądzę, że bardzo lubią takie „proste” pytania.
Alix Axel
2
Jeśli zoptymalizujemy pod kątem maksymalnej liczby wygranych, wydaje się to naprawdę łatwe. Średnia liczba wygranych to po prostu szansa na wygraną każdej pojedynczej instancji zsumowanej. To znaczy, jeśli postawimy jeden zakład na maksymalną szansę, wygramy średnio 0,4 + 1 + 0,9 = 2,3 gry. Więc jeśli dodanie 1 zakładu było zawsze równie drogie, rozwiązaniem byłoby po prostu posortowanie szans na wygraną i skorzystanie z pierwszych szans KOSZTU (daje to na przykład „najlepszy” wynik). Jeśli koszt jest inny przy dodawaniu drugiej do trzeciej do czegoś, staje się bardziej skomplikowany (choć rekurencyjne działa bruteforce) i myślę, że przespam to.
2
Jako matematyk, który nie zna php, łatwiej byłoby mi zaatakować ten problem, gdyby był zapisany matematycznie niż w kodzie.
2
Czy słyszałeś o kryterium Kelly ? Jeśli nie, jest coś do czytania dla Ciebie.

Odpowiedzi:

2

Myślę, że wymyśliłem funkcjonalne rozwiązanie bruteforce, wygląda to tak:


  • 1) obliczyć każdą możliwą kombinację wielu zakładów, jaką mogę zrobić

Dla przykładu i kwot podanych w moim pytaniu będzie to:

  • 3 single, 0 double, 0 triple = równowartość 1 pojedynczego zakładu
  • 2 pojedyncze, 1 podwójne, 0 trzykrotne = równowartość 2 pojedynczych zakładów
  • 2 zakłady pojedyncze, 0 zakładów podwójnych, 1 potrójne = równowartość 3 zakładów pojedynczych
  • 1 pojedynczy, 2 podwójne, 0 trzyosobowy = równowartość 4 pojedynczych zakładów

  • 2) obliczyć standardowe odchylenie kursów symboli dla każdego meczu

             |    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) dla każdej kombinacji zakładów wielokrotnych ( krok 1 ) oblicz ranking według wzoru:

    ranking = (#n (x) [+ #n (y) [+ #n (z)]]) / stdev (#n)

Gdzie #njest określone dopasowanie i #n(x|y|z)jest to uporządkowany kurs symboli.

  • Dopasowania są przetwarzane od niskich do wysokich odchyleń standardowych.
  • Poszczególne symbole w każdym meczu są przetwarzane od wysokich do niskich kursów.

Przetestuj dla 1 zakładu pojedynczego, 2 zakładów podwójnych, 0 zakładów potrójnych:

  • (#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

Ten zakład daje mi globalny ranking 14.89 + 2.48 + 2.12 = 19.49.


Przetestuj dla 2 zakładów pojedynczych, 0 zakładów podwójnych, 1 zakładów potrójnych:

  • (#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

Co daje mi globalny ranking 21.28 + 2.24 + 2.12 = 25.64. :-)


Wszystkie pozostałe zakłady będą wyraźnie gorsze, więc nie ma sensu ich testować.

Ta metoda wydaje się działać, ale wymyśliłem ją metodą prób i błędów i podążając za moim jelitem, brakuje mi matematycznego zrozumienia, aby ocenić, czy jest poprawna, a nawet czy istnieje lepszy sposób ...

Jakieś wskazówki?

PS: Przepraszam za złe formatowanie, ale parser MD wydaje się różnić od StackOverflow.

Alix Axel
źródło
Czy rozważałeś programowanie liniowe ( en.wikipedia.org/wiki/Linear_programming ) do rozwiązania tego problemu?
Victor Sorokin
1

Co powiesz na stworzenie rozwiązania opartego na metodzie Simplex. Ponieważ przesłanka użycia metody Simplex nie jest spełniona, musimy ją nieco zmodyfikować. Zmodyfikowaną wersję nazywam „Walk the line”.

Metoda:

Jesteś w stanie zmierzyć niepewność każdego meczu. Zrób to! Oblicz niepewność każdego meczu za pomocą pojedynczego lub podwójnego zakładu (w przypadku potrójnego zakładu nie ma niepewności). Dodając zakład podwójny lub potrójny, zawsze wybieraj taki, który najbardziej zmniejsza niepewność.

  1. Zacznij od maksymalnej liczby potrójnych zakładów. Oblicz całkowitą niepewność.
  2. Usuń jeden potrójny zakład. Dodaj jeden lub dwa podwójne zakłady, utrzymując maksymalny koszt. Oblicz całkowitą niepewność.
  3. Powtarzaj krok 2, aż uzyskasz maksymalną liczbę podwójnych zakładów.

Wybierz zakład z najniższą całkowitą niepewnością.

Klas Lindbäck
źródło
0

To, co czerpię z obserwacji tych zakładów, doszedłem do takich wniosków.

Oczekiwana wartość
Powiedzmy, że masz 3 zakłady odrobinę 1.29 5.5 and 10.3(ostatni zakład w tabeli) EV do obstawiania to,
EV = 1/(1/1.29+1/5.5+1/10.3) - 1 = -0.05132282687714185 jeśli utrzymuje, że prawdopodobieństwa, że ​​jedna wygrywa nad drugą, są rozdzielane
1/1.29 : 1/5.5 : 1/10.3, wtedy tracisz pieniądze na dłuższą metę, ponieważ twoja EV jest ujemna.
Możesz czerpać zyski tylko wtedy, gdy możesz dowiedzieć się, jakie są prawdopodobieństwa każdego wyniku i dowiedzieć się nieprawidłowości.

Powiedzmy, że prawdziwe są prawdopodobieństwa
0.7 : 0.2 : 0.1

Oznacza to, że stawki powinny być 1.43 \ 5.0 \ 10.0

Widzisz, że w tym przypadku najlepsza wypłata dotyczy remisu zakładów, ponieważ daje ci
EV(0) = 5.5/5 - 1 = 0.1
miejsce na obstawianie przegranych,
EV(2) = 10.2/10 - 1 = 0.02
a obstawianie wygranych u siebie nawet EV-
EV(1) = 1.29/1.43 - 1 = -0.10

ralu
źródło
Nie sądzę, że dostałeś moje pytanie. Wiem już, w jakich symbolach (i w jakiej kolejności w przypadku zakładu wielokrotnego) obstawiać poszczególne mecze. Moim problemem jest ustalenie idealnej liczby potrójnych i podwójnych zakładów, w które powinienem zagrać, patrząc na wszystkie mecze (i ich szanse na odpowiedni symbol) na całym świecie .
Alix Axel