Fazendo apostas grandes e inteligentes

16

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 casa
  • X: desenhar
  • 2: vitórias fora

Jogo de Apostas BWin 1X2

Para cada correspondência e símbolo ( 1, Xe 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 1em 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 3e 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 #3probabilidades 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 1para 4no 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.

Alix Axel
fonte
4
Os bons povos em cima da math.stackexchange.com pode ser capaz de proporcionar uma melhor compreensão do problema que você está descrevendo, o que pode por sua vez, sugerem boas maneiras de implementá-lo :)
1
@ Lethargia: Uma vez, postei aqui uma pergunta sobre o Triângulo de Pascal e os números primos que foram migrados para math.SE. Recebi cerca de 15 votos positivos (tanto no SO quanto no math.SE) muito rapidamente, mas a questão foi encerrada em menos de 30 minutos e ela nem existe mais. Não acho que eles gostem muito desse tipo de perguntas "simples".
Alix Axel
2
Se otimizarmos para o número máximo de vitórias, isso parece realmente muito fácil. O número médio de vitórias é simplesmente a chance de vitória de cada instância única adicionada. Ou seja, se fizermos uma aposta única na chance máxima, ganharemos 0,4 + 1 + 0,9 = 2,3 jogos em média. Portanto, se adicionar uma aposta sempre fosse igualmente caro, a solução seria simplesmente classificar as chances de vitória e aproveitar as primeiras chances de COST (isso fornece o "melhor" resultado para o exemplo). Se o custo for diferente ao adicionar um segundo vs. terceiro a algo, fica mais complicado (embora a força bruta recursiva funcione) e acho que vou dormir mais um pouco.
2
Como um matemático que não conhece php, eu acharia muito mais fácil atacar esse problema se estivesse em notação matemática e não em código.
2
Você já ouviu falar do critério Kelly ? Caso contrário, há algumas leituras para você.

Respostas:

2

Eu acho que criei uma solução funcional de força bruta, é assim:


  • 1) calcular todas as combinações possíveis de apostas múltiplas que posso fazer

Para o exemplo e os valores que forneci na minha pergunta, seria:

  • 3 simples, 0 duplo, 0 triplo = equivalente a 1 aposta única
  • 2 individuais, 1 duplo, 0 triplo = equivalente a 2 apostas simples
  • 2 individuais, 0 duplo, 1 triplo = equivalente a 3 apostas simples
  • 1 simples, 2 duplos, 0 triplo = equivalente a 4 apostas simples

  • 2) calcule o desvio padrão das probabilidades do símbolo para cada partida

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

  • As correspondências são processadas de desvios padrão baixos a altos.
  • Símbolos individuais em cada partida são processados ​​de probabilidades altas a baixas.

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.

Alix Axel
fonte
Você considerou a programação linear ( en.wikipedia.org/wiki/Linear_programming ) para resolver esse problema?
Victor Sorokin
1

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.

  1. Comece com o número máximo de apostas triplas. Calcular a incerteza total.
  2. Remova uma aposta tripla. Adicione uma ou duas apostas duplas, mantendo o custo máximo. Calcular a incerteza total.
  3. Repita o passo 2 até ter o número máximo de apostas duplas.

Escolha a aposta com a menor incerteza total.

Klas Lindbäck
fonte
0

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 como
1/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

ralu
fonte
Acho que você não entendeu minha pergunta. Eu já sei em que símbolos (e em que ordem, no caso de uma aposta múltipla) apostar em cada partida individual. Meu problema é descobrir o número ideal de apostas triplas e duplas que devo jogar olhando para todas as partidas (e suas respectivas chances de símbolos) globalmente .
Alix Axel