Fare grandi (intelligenti) scommesse


16

Ho cercato di codificare un algoritmo per suggerire scommesse in giochi 1X2 (ponderati).

Fondamentalmente, ogni partita ha una serie di partite (squadre in casa vs squadre in trasferta):

  • 1: vince la casa
  • X: disegnare
  • 2: vince via

Gioco di scommesse BWin 1X2

Per ogni partita e simbolo ( 1, Xe 2), assegnerò una percentuale che rappresenta le probabilità / probabilità che quel simbolo sia il risultato corretto della partita. Ecco un array che rappresenta la struttura:

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

Calcolo anche la deviazione standard per ogni scommessa (commentata nello snippet sopra); deviazioni standard più elevate rappresentano una certezza più elevata, mentre le partite con le deviazioni standard più basse si traducono in un livello di incertezza più elevato e, idealmente, dovrebbero essere coperte con una scommessa doppia o tripla, se possibile.

Il seguente pseudo-algoritmo dovrebbe descrivere il flusso di lavoro complessivo:

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

Fin qui tutto bene, ma devo dire all'algoritmo quanto voglio spendere. Diciamo che una singola scommessa costa 1in qualunque valuta, la formula per calcolare quanto costa una scommessa multipla:

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

Ovviamente, l'algoritmo dovrebbe cercare di allocare quanti più soldi possibile nel suggerimento della scommessa (altrimenti non avrebbe molto senso), e ora è qui che diventa più complicato ...

Diciamo che voglio pagare un massimo di 4, elencando tutti i possibili multipli in 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);

Produce il seguente output:

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

Il problema

Se scelgo di giocare la massima quantità di denaro disponibile ( 4) dovrei scommettere con due doppie, se uso lo pseudo-algoritmo sopra descritto finirei con il seguente suggerimento di scommessa:

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

Che sembra subottimale rispetto a una tripla scommessa che costa 3e copre più incertezza:

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

L'esempio sopra ottiene ancora più rilevanza se si considera che le match #3probabilità potrebbero essere:

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

In questo caso sprecherei un doppio senza una buona ragione.

Fondamentalmente, posso solo scegliere la scommessa più grande (forse stupida) e non la più grande e intelligente .

Ho sbattuto la testa contro il muro per alcuni giorni, sperando di ottenere una sorta di epifania, ma finora sono stato in grado di trovare solo due mezze [cattive] soluzioni:


1) Disegna una "Linea"

Fondamentalmente direi che le partite con uno stdev inferiore a un valore specifico sarebbero triple, le partite con uno stdev molto più alto sarebbero le scommesse doppie e le altre scommesse singole.

Il problema con questo, ovviamente, è scoprire i limiti specifici appropriati - e anche se trovo i valori perfetti per la scommessa "più intelligente", non so ancora se ho abbastanza soldi per giocare la scommessa suggerita o se Potrei fare una scommessa ancora più grande (anche intelligente) ...


2) Bruteforce

Ho avuto questa idea mentre scrivevo questa domanda e so che non avrebbe perfettamente senso nel contesto che ho descritto, ma penso che potrei farlo funzionare usando metriche un po 'diverse. Fondamentalmente, potrei fare in modo che il programma suggerisca scommesse (n. Di scommesse triple e doppie) per ogni possibile somma di denaro che potrei giocare (da 1a 4nel mio esempio), applicando lo pseudo-algoritmo che ho descritto sopra e calcolando un valore di classifica globale (qualcosa tipo % of symbols * match stdev- lo so, non ha senso).

La scommessa con il punteggio più alto (che copre l'incertezza) sarebbe la scommessa suggerita. Il problema con questo approccio (oltre al fatto che non ha ancora senso) è che i giochi con cui il mio programma funzionerà non sono limitati a 3 partite e il numero di combinazioni di scommesse doppie e triple per quelle partite sarebbe sostanzialmente più alto.


Sento che esiste una soluzione elegante, ma non riesco proprio ad afferrarla ...

Qualsiasi aiuto per risolvere questo problema è molto apprezzato, grazie.


Sembra esserci un po 'di confusione riguardo al mio problema, l'ho già affrontato in questa domanda e anche nei commenti, ma la cattiva interpretazione sembra ancora prevalere, almeno per alcuni.

Devo sapere quante scommesse triple, doppie e singole giocherò per una partita specifica (tutte le partite). Conosco già quali simboli voglio giocare guardando ogni partita individualmente.


4
Le brave persone di math.stackexchange.com potrebbero essere in grado di fornire una migliore comprensione del problema che stai descrivendo, il che potrebbe a sua volta suggerire buoni modi per implementarlo :)

1
@Lethargy: una volta ho postato qui una domanda sul Triangolo Pascal e sui numeri primi che sono stati migrati in matematica.SE. Ho ottenuto circa 15 voti (sia in SO che in matematica.SE) molto rapidamente, ma la domanda è stata chiusa in meno di 30 minuti e non esiste nemmeno più. Non credo che a loro piacciano molto questo tipo di domande "semplici".
Alix Axel,

2
Se ottimizziamo per il numero massimo di vittorie, questo sembra in realtà molto semplice. Il numero medio di vittorie è semplicemente la possibilità di vincita di ogni singola istanza sommata. Vale a dire se impostiamo una singola scommessa sulla massima possibilità vinceremo 0,4 + 1 + 0,9 = 2,3 giochi in media. Quindi, se l'aggiunta di 1 scommessa fosse sempre ugualmente costosa, la soluzione sarebbe semplicemente quella di ordinare le probabilità di vincita e prendere le prime possibilità di COSTO (questo dà il risultato "migliore" per l'esempio). Se il costo è diverso quando si aggiunge un secondo contro un terzo a qualcosa, diventa più complicato (funziona bruta forza ricorsiva) e penso che dormirò sopra.

2
Come matematico che non conosce php, troverei molto più facile attaccare questo problema se fosse in notazione matematica piuttosto che in codice.

2
Hai sentito parlare del criterio Kelly ? In caso contrario, c'è qualche lettura lì per te.

Risposte:


2

Penso di aver trovato una soluzione bruteforce praticabile, che va così:


  • 1) calcola ogni possibile combinazione di scommesse multiple che posso fare

Per l'esempio e gli importi che ho fornito nella mia domanda, questo sarebbe:

  • 3 singole, 0 doppie, 0 triple = equivalenti a 1 scommessa singola
  • 2 singole, 1 doppia, 0 triple = equivalenti a 2 scommesse singole
  • 2 singole, 0 doppie, 1 tripla = equivalenti a 3 scommesse singole
  • 1 singola, 2 doppie, 0 triple = equivalenti a 4 scommesse singole

  • 2) calcola la deviazione standard delle probabilità del simbolo per ogni partita

             |    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) per ogni combinazione di scommessa multipla ( passaggio 1 ) calcola una classifica usando la formula:

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

Dov'è #nuna corrispondenza specifica ed #n(x|y|z)è la quota ordinata dei simboli.

  • Le partite vengono elaborate da deviazioni standard basse a elevate.
  • I singoli simboli in ogni partita vengono elaborati dalle probabilità più alte a quelle più basse.

Prova per una scommessa 1 singola, 2 doppie, 0 triple:

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

Questa scommessa mi dà una classifica globale di 14.89 + 2.48 + 2.12 = 19.49.


Prova per una scommessa 2 singole, 0 doppie, 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

Il che mi dà una classifica globale di 21.28 + 2.24 + 2.12 = 25.64. :-)


Tutte le scommesse rimanenti saranno chiaramente inferiori, quindi non ha senso testarle.

Questo metodo sembra funzionare ma l'ho escogitato tramite tentativi ed errori e seguendo il mio istinto, mi manca la comprensione matematica per giudicare se è corretto o anche se c'è un modo migliore ...

Qualche puntatore?

PS: Ci scusiamo per la formattazione errata ma il parser MD sembra essere diverso da StackOverflow.


Hai preso in considerazione la programmazione lineare ( en.wikipedia.org/wiki/Linear_programming ) per risolvere questo problema?
Victor Sorokin,

1

Che ne dite di fare una soluzione basata sul metodo Simplex. Poiché la premessa per l'utilizzo del metodo Simplex non è soddisfatta, è necessario modificare leggermente il metodo. Chiamo la versione modificata "Walk the line".

Metodo:

Sei in grado di misurare l'incertezza di ogni partita. Fallo! Calcola l'incertezza di ogni partita con una scommessa singola o doppia (per una tripla non c'è incertezza). Quando aggiungi una scommessa doppia o tripla, scegli sempre quella che riduce maggiormente l'incertezza.

  1. Inizia dal numero massimo di triple triple. Calcola l'incertezza totale.
  2. Rimuovi una scommessa tripla. Aggiungi una o due scommesse doppie, mantenendo il costo massimo. Calcola l'incertezza totale.
  3. Ripeti il ​​passaggio 2 fino ad avere il numero massimo di doppie scommesse.

Scegli la scommessa con l'incertezza totale più bassa.


0

Ciò che vengo dall'osservazione di queste scommesse sportive sono giunto a queste conclusioni.

Valore atteso
Supponiamo che tu abbia 3 scommesse con 1.29 5.5 and 10.3(ultima puntata nella tabella) EV per le scommesse è
EV = 1/(1/1.29+1/5.5+1/10.3) - 1 = -0.05132282687714185 se si ritiene che le probabilità che una vincita su un'altra siano distribuite come
1/1.29 : 1/5.5 : 1/10.3, quindi stai perdendo i tuoi soldi a lungo termine poiché il tuo EV è negativo.
Puoi trarre profitto solo se riesci a capire quali sono le probabilità di ciascun risultato e scoprire le irregolarità.

Diciamo che le vere probabilità lo sono
0.7 : 0.2 : 0.1

Ciò significa che i tassi dovrebbero essere 1.43 \ 5.0 \ 10.0

Puoi vedere che in questo caso il miglior guadagno è per l'estrazione delle scommesse poiché ti dà
EV(0) = 5.5/5 - 1 = 0.1
dove scommettere sulle perdite è
EV(2) = 10.2/10 - 1 = 0.02
e scommettere per la vittoria in casa è anche EV-
EV(1) = 1.29/1.43 - 1 = -0.10


Non penso che tu abbia la mia domanda. So già in quali simboli (e in quale ordine nel caso di una scommessa multipla) scommettere su ogni singola partita. Il mio problema è capire il numero ideale di scommesse triple e doppie che dovrei giocare guardando tutte le partite (e le rispettive possibilità di simboli) a livello globale .
Alix Axel,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.