Faire de gros paris (er) intelligents

16

J'ai essayé de coder un algorithme pour suggérer des paris dans des jeux 1X2 (pondérés).

Fondamentalement, chaque match a un ensemble de matchs (équipes à domicile vs équipes à l'extérieur):

  • 1: victoires à domicile
  • X: dessiner
  • 2: victoires à l'extérieur

Jeu de paris BWin 1X2

Pour chaque correspondance et symbole ( 1, Xet 2), j'attribuerai un pourcentage qui représente les chances / probabilités que ce symbole soit le résultat de correspondance correct. Voici un tableau représentant la structure:

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

Je calcule également l'écart type pour chaque pari (commenté dans l'extrait ci-dessus); des écarts-types plus élevés représentent une certitude plus élevée, tandis que les correspondances avec les écarts-types les plus faibles se traduisent par un niveau d'incertitude plus élevé et, idéalement, devraient être couverts par un pari double ou triple, si possible.

Le pseudo-algorithme suivant doit décrire le flux de travail global:

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

Jusqu'ici tout va bien, mais je dois dire à l'algorithme combien je veux dépenser. Disons qu'un seul pari coûte 1dans n'importe quelle devise, la formule pour calculer combien coûte un pari multiple est:

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

De toute évidence, l'algorithme devrait essayer d'allouer autant d'argent disponible que possible dans la suggestion de pari (cela n'aurait pas beaucoup de sens autrement), et c'est maintenant que cela devient plus difficile ...

Disons que je veux payer un maximum de 4, énumérant tous les multiples possibles en 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);

Donne la sortie suivante:

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

Le problème

Si je choisis de jouer le maximum d'argent disponible ( 4), je devrai miser avec deux doubles, si j'utilise le pseudo-algorithme décrit ci-dessus, je me retrouverais avec la suggestion de pari suivante:

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

Ce qui semble sous-optimal par rapport à un triple pari qui coûte 3et couvre plus d'incertitude:

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

L'exemple ci-dessus gagne encore en pertinence si vous considérez que les match #3chances peuvent être:

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

Dans ce cas, je gaspillerais un double sans raison valable.

Fondamentalement, je ne peux que choisir le plus gros pari (peut-être stupide) et non le plus gros pari .

Cela fait quelques jours que je me tape la tête contre le mur, espérant obtenir une sorte d'épiphanie, mais jusqu'à présent, je n'ai pu trouver que deux demi-[mauvaises-] solutions:


1) Tracez une "ligne"

Fondamentalement, je dirais que les correspondances avec un stdev inférieur à une valeur spécifique seraient triples, les correspondances avec un stdev beaucoup plus élevé seraient des paris doubles et les autres paris simples.

Le problème avec cela, bien sûr, est de trouver les limites spécifiques appropriées - et même si je trouve les valeurs parfaites pour le pari "le plus intelligent", je ne sais toujours pas si j'ai assez d'argent pour jouer le pari suggéré ou si Je pourrais faire un pari encore plus grand (aussi intelligent) ...


2) Bruteforce

J'ai eu cette idée en écrivant cette question et je sais que cela n'a pas de sens dans le contexte que j'ai décrit, mais je pense que je pourrais le faire fonctionner en utilisant des métriques quelque peu différentes. Fondamentalement, je pourrais faire suggérer au programme des paris (nombre de paris triples et doubles) pour chaque montant d'argent possible que je pourrais jouer (de 1à 4dans mon exemple), en appliquant le pseudo-algorithme que j'ai décrit ci-dessus et en calculant une valeur de classement global (quelque chose comme % of symbols * match stdev- je sais, ça n'a pas de sens).

Le pari avec le rang le plus élevé (couvrant l'incertitude) serait le pari suggéré. Le problème avec cette approche (outre le fait que cela n'a pas encore de sens) est que les jeux avec lesquels mon programme va fonctionner ne sont pas limités à 3 matchs et que le nombre de combinaisons de paris double et triple pour ces matchs serait nettement plus élevé.


J'ai l'impression qu'il existe une solution élégante, mais je n'arrive pas à la saisir ...

Toute aide pour résoudre ce problème est grandement appréciée, merci.


Il semble y avoir une certaine confusion concernant mon problème, je l'ai déjà abordé dans cette question et aussi dans les commentaires, mais l'interprétation erronée semble toujours prévaloir, du moins pour certains.

J'ai besoin de savoir combien de paris triples, doubles et simples je jouerai pour un jeu spécifique (tous les matchs). Je sais déjà quels symboles je veux jouer en regardant chaque match individuellement.

Alix Axel
la source
4
Les bonnes personnes de math.stackexchange.com pourraient être en mesure de mieux comprendre le problème que vous décrivez, ce qui pourrait à son tour suggérer de bonnes façons de le mettre en œuvre :)
1
@Lethargy: J'ai déjà publié une question ici sur le triangle Pascal et les nombres premiers que ce dernier a migré vers math.SE. J'ai reçu une quinzaine de votes positifs (à la fois chez SO et math.SE) très rapidement, mais la question a été close en moins de 30 minutes et elle n'existe même plus. Je ne pense pas qu'ils aiment beaucoup ce genre de questions "simples".
Alix Axel du
2
Si nous optimisons pour le nombre maximal de victoires, cela semble vraiment très facile. Le nombre moyen de victoires est simplement la chance de gagner de chaque instance ajoutée. Autrement dit, si nous établissons un seul pari sur la chance maximale, nous gagnerons en moyenne 0,4 + 1 + 0,9 = 2,3 parties. Donc, si ajouter 1 pari était toujours aussi cher, la solution serait simplement de trier les chances de gagner et de prendre les premières chances de COÛT (cela donne le "meilleur" résultat pour l'exemple). Si le coût est différent lors de l'ajout d'un deuxième vs troisième à quelque chose, cela devient plus compliqué (les travaux récursifs de bruteforce cependant) et je pense que je vais dormir dessus.
2
En tant que mathématicien qui ne connaît pas le php, je trouverais beaucoup plus facile d'attaquer ce problème s'il était en notation mathématique plutôt qu'en code.
2
Avez-vous entendu parler du critère de Kelly ? Sinon, il y a de la lecture pour vous.

Réponses:

2

Je pense que j'ai trouvé une solution bruteforce viable, ça se passe comme ceci:


  • 1) calculer chaque combinaison possible de paris multiples que je peux faire

Pour l'exemple et les montants que j'ai fournis dans ma question, ce serait:

  • 3 simples, 0 doubles, 0 triples = équivalent à 1 pari simple
  • 2 simples, 1 double, 0 triple = équivalent à 2 paris simples
  • 2 simples, 0 doubles, 1 triple = équivalent à 3 paris simples
  • 1 simple, 2 doubles, 0 triple = équivalent à 4 paris simples

  • 2) calculer l'écart type des cotes des symboles pour chaque match

             |    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) pour chaque combinaison de paris multiples ( étape 1 ), calculez un classement en utilisant la formule:

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

#nest une correspondance spécifique et #n(x|y|z)est la cote ordonnée des symboles.

  • Les correspondances sont traitées à partir d'écarts standard faibles à élevés.
  • Les symboles individuels dans chaque match sont traités de cotes élevées à faibles.

Testez un pari 1 simple, 2 doubles, 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

Ce pari me donne un classement mondial de 14.89 + 2.48 + 2.12 = 19.49 .


Testez un pari 2 simples, 0 double, 1 triple:

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

Ce qui me donne un classement mondial de 21.28 + 2.24 + 2.12 = 25.64.:-)


Tous les paris restants seront clairement inférieurs, il est donc inutile de les tester.

Cette méthode semble fonctionner mais je l'ai inventée par essais et erreurs et à la suite de mon instinct, je n'ai pas la compréhension mathématique pour juger si elle est correcte ou même s'il existe une meilleure façon ...

Des pointeurs?

PS: Désolé pour le mauvais formatage mais l'analyseur MD semble être différent de StackOverflow.

Alix Axel
la source
Avez-vous envisagé la programmation linéaire ( en.wikipedia.org/wiki/Linear_programming ) pour résoudre ce problème?
Victor Sorokin
1

Que diriez-vous de faire une solution basée sur la méthode Simplex. Étant donné que la prémisse d'utilisation de la méthode Simplex n'est pas remplie, nous devons légèrement modifier la méthode. J'appelle la version modifiée "Walk the line".

Méthode:

Vous pouvez mesurer l'incertitude de chaque correspondance. Fais le! Calculez l'incertitude de chaque match avec un pari simple ou double (pour un pari triple, il n'y a pas d'incertitude). Lorsque vous ajoutez un pari double ou triple, choisissez toujours celui qui réduit le plus l'incertitude.

  1. Commencez au nombre maximum de paris triples. Calculez l'incertitude totale.
  2. Retirez un triple pari. Ajoutez un ou deux paris doubles en respectant le coût maximum. Calculez l'incertitude totale.
  3. Répétez l'étape 2 jusqu'à ce que vous ayez le nombre maximum de paris doubles.

Choisissez le pari avec l'incertitude totale la plus faible.

Klas Lindbäck
la source
0

Ce que je viens de l'observation de ces paris sportifs, je suis arrivé à ces conclusions.

Valeur attendue
Disons que vous avez 3 paris avec 1.29 5.5 and 10.3(le dernier pari dans le tableau) EV pour parier est
EV = 1/(1/1.29+1/5.5+1/10.3) - 1 = -0.05132282687714185 si détient que les probabilités un gagnant sur un autre sont distribuées comme
1/1.29 : 1/5.5 : 1/10.3, alors vous perdez votre argent à long terme puisque votre EV est négatif.
Vous ne pouvez profiter que si vous pouvez déterminer quelles sont les probabilités de chaque résultat et découvrir les irrégularités.

Disons que les vraies probabilités sont
0.7 : 0.2 : 0.1

Cela signifie que les taux devraient être 1.43 \ 5.0 \ 10.0

Vous pouvez voir que dans ce cas, le meilleur gain est pour le tirage au sort, car il vous donne
EV(0) = 5.5/5 - 1 = 0.1
où pour parier sur la perte
EV(2) = 10.2/10 - 1 = 0.02
et le pari pour la victoire à domicile est même EV-
EV(1) = 1.29/1.43 - 1 = -0.10

ralu
la source
Je ne pense pas que vous ayez ma question. Je sais déjà dans quels symboles (et dans quel ordre en cas de pari multiple) miser sur chaque match individuel. Mon problème est de déterminer le nombre idéal de paris triples et doubles que je devrais jouer en regardant tous les matchs (et leurs chances de symboles respectives) dans le monde .
Alix Axel