Eu tenho tentado codificar um algoritmo para sugerir apostas em jogos 1X2 (ponderados).
Basicamente, cada jogo tem um conjunto de partidas (times em casa x fora):
1
: vitórias em casaX
: desenhar2
: vitórias fora
Para cada correspondência e símbolo ( 1
, X
e 2
), atribuirei uma porcentagem que represente as chances / probabilidade desse símbolo ser o resultado correto da correspondência. Aqui está uma matriz que representa a estrutura:
$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
),
);
Eu também calculo o desvio padrão para cada aposta (comentado no snippet acima); desvios padrão mais altos representam uma certeza mais alta, enquanto as correspondências com os desvios padrão mais baixos se traduzem em um nível mais alto de incerteza e, idealmente, devem ser cobertas com uma aposta dupla ou tripla, se possível.
O pseudo-algoritmo a seguir deve descrever o fluxo de trabalho geral:
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
Até aí tudo bem, mas preciso dizer ao algoritmo quanto quero gastar. Vamos dizer que uma única aposta custa 1
em qualquer moeda, a fórmula para calcular quanto custa uma aposta múltipla é:
2^double_bets * 3^triple_bets * cost_per_bet (= 1)
Obviamente, o algoritmo deve tentar alocar o máximo de dinheiro possível na sugestão de aposta (não faria muito sentido de outra forma), e agora é onde isso fica mais complicado ...
Digamos que eu queira pagar no máximo 4
, listando todos os múltiplos possíveis em 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);
Rende a seguinte saída:
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
)
)
O problema
Se eu optar por jogar a quantidade máxima de dinheiro disponível ( 4
), eu teria que apostar com duas duplas, se eu usar o pseudo-algoritmo que descrevi acima, terminarei com a seguinte sugestão de aposta:
match #1
=>X1
match #2
=>2
match #3
=>12
O que parece subótimo quando comparado a uma aposta tripla que custa 3
e cobre mais incerteza:
match #1
=>X12
match #2
=>2
match #3
=>2
O exemplo acima ganha ainda mais relevância se você considerar que as match #3
probabilidades podem ser:
$game['match #3'] = array // stdev = 0.4714
(
'1' => 0.0, // 0% home wins
'X' => 0.0, // 0% draw
'2' => 1.0, // 100% away wins
);
Nesse caso, eu estaria desperdiçando um duplo sem uma boa razão.
Basicamente, só posso escolher a aposta maior (possivelmente estúpida) e não a maior e mais inteligente .
Estou batendo a cabeça contra a parede há alguns dias agora, esperando conseguir algum tipo de epifania, mas até agora só consegui encontrar duas soluções meio ruins:
1) Desenhe uma "linha"
Basicamente, eu diria que as partidas com um stdev menor que um valor específico seriam triplas, as partidas com um stdev muito maior seriam apostas duplas e as demais apostas únicas.
O problema com isso, é claro, é descobrir os limites específicos apropriados - e mesmo que eu encontre os valores perfeitos para a aposta "mais inteligente", ainda não sei se tenho dinheiro suficiente para jogar a aposta sugerida ou se Eu poderia fazer uma aposta ainda maior (também inteligente) ...
2) Bruteforce
Eu tive essa ideia enquanto escrevia essa pergunta e sei que não fará sentido no contexto que descrevi, mas acho que poderia fazê-la funcionar usando métricas um pouco diferentes. Basicamente, eu poderia fazer o programa sugerir apostas (número de apostas triplas e duplas) para toda quantia possível de dinheiro que eu pudesse jogar (de 1
para 4
no meu exemplo), aplicando o pseudo-algoritmo que descrevi acima e calculando um valor de classificação global (algo como % of symbols * match stdev
- eu sei, isso não faz sentido).
A aposta com a classificação mais alta (cobrindo incertezas) seria a aposta sugerida. O problema com essa abordagem (além do fato de que ainda não faz sentido) é que os jogos com os quais meu programa vai trabalhar não se limitam a 3 partidas e o número de combinações de aposta dupla e tripla para essas partidas seria substancialmente mais alto.
Sinto que há uma solução elegante, mas não consigo entender ...
Qualquer ajuda para solucionar esse problema é muito apreciada, obrigado.
Parece haver alguma confusão em relação ao meu problema, eu já resolvi isso nesta questão e também nos comentários, mas a má interpretação ainda parece prevalecer, pelo menos para alguns.
Preciso saber quantas apostas triplas, duplas e simples jogarei para um jogo específico (todas as partidas). Eu já sei quais símbolos eu quero jogar olhando cada partida individualmente.
fonte
Respostas:
Eu acho que criei uma solução funcional de força bruta, é assim:
Para o exemplo e os valores que forneci na minha pergunta, seria:
2) calcule o desvio padrão das probabilidades do símbolo para cada partida
3) para cada combinação de apostas múltiplas ( etapa 1 ) calcule uma classificação usando a fórmula:
ranking = (#n (x) [+ #n (y) [+ #n (z)]]) / stdev (#n)
Onde
#n
é uma correspondência específica e#n(x|y|z)
as probabilidades ordenadas dos símbolos.Teste para uma aposta única, duas duplas e triplas 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
Esta aposta me dá uma classificação global de
14.89 + 2.48 + 2.12 = 19.49
.Teste para uma aposta 2 simples, 0 dupla e 1 tripla:
(#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
O que me dá uma classificação global de
21.28 + 2.24 + 2.12 = 25.64
. :-)Todas as apostas restantes serão claramente inferiores, portanto não faz sentido testá-las.
Esse método parece funcionar, mas eu o criei por tentativa e erro e, seguindo meu instinto, não tenho o entendimento matemático para julgar se está correto ou mesmo se existe uma maneira melhor ...
Alguma dica?
PS: Desculpe a formatação incorreta, mas o analisador MD parece ser diferente do StackOverflow.
fonte
Que tal criar uma solução baseada no método Simplex. Como a premissa de uso do método Simplex não é cumprida, precisamos modificar um pouco o método. Eu chamo a versão modificada "Walk the line".
Método:
Você é capaz de medir a incerteza de cada partida. Faça! Calcule a incerteza de cada partida com uma aposta simples ou dupla (para uma aposta tripla, não há incerteza). Ao adicionar uma aposta dupla ou tripla, escolha sempre a que mais reduz a incerteza.
Escolha a aposta com a menor incerteza total.
fonte
O que venho observando essas apostas esportivas cheguei a estas conclusões.
Valor esperado
Digamos que você tenha 3 apostas com
1.29 5.5 and 10.3
(última aposta na tabela) o EV para apostas éEV = 1/(1/1.29+1/5.5+1/10.3) - 1 = -0.05132282687714185
se detém que as probabilidades de uma vitória sobre outra são distribuídas como1/1.29 : 1/5.5 : 1/10.3
, então você está perdendo seu dinheiro a longo prazo, pois o seu EV é negativo.Você pode lucrar apenas se descobrir quais são as probabilidades de cada resultado e descobrir irregularidades.
Vamos dizer que as probabilidades verdadeiras são
0.7 : 0.2 : 0.1
Isso significa que as taxas devem ser
1.43 \ 5.0 \ 10.0
Você pode ver que, nesse caso, a melhor recompensa é o sorteio de apostas, pois fornece
EV(0) = 5.5/5 - 1 = 0.1
onde apostar em perda é
EV(2) = 10.2/10 - 1 = 0.02
e apostar em vitória em casa é até EV-
EV(1) = 1.29/1.43 - 1 = -0.10
fonte