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 domX
: remis2
: wyjazd wygrywa
Dla każdego dopasowania i symbolu ( 1
, X
i 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 1
w 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 3
i 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 #3
szanse 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 1
do 4
w 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.
źródło
Odpowiedzi:
Myślę, że wymyśliłem funkcjonalne rozwiązanie bruteforce, wygląda to tak:
Dla przykładu i kwot podanych w moim pytaniu będzie to:
2) obliczyć standardowe odchylenie kursów symboli dla każdego meczu
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
#n
jest określone dopasowanie i#n(x|y|z)
jest to uporządkowany kurs symboli.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.
źródło
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ść.
Wybierz zakład z najniższą całkowitą niepewnością.
źródło
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ą rozdzielane1/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
źródło