Große, kluge Einsätze machen

16

Ich habe versucht, einen Algorithmus zu programmieren, der Wetten in 1X2-Spielen (gewichtet) vorschlägt.

Grundsätzlich hat jedes Spiel eine Reihe von Spielen (Heim- gegen Auswärtsteams):

  • 1: Heimsiege
  • X: zeichnen
  • 2: auswärts gewinnt

BWin 1X2 Tippspiel

Für jede Übereinstimmung und jedes Symbol ( 1, Xund 2) werde ich einen Prozentsatz zuweisen, der die Wahrscheinlichkeit angibt, dass dieses Symbol das richtige Übereinstimmungsergebnis ist. Hier ist ein Array, das die Struktur darstellt:

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

Ich berechne auch die Standardabweichung für jede Wette (im obigen Snippet kommentiert); Höhere Standardabweichungen bedeuten eine höhere Sicherheit, während die Übereinstimmungen mit den niedrigsten Standardabweichungen zu einer höheren Unsicherheit führen und idealerweise mit einem Doppel- oder Dreifacheinsatz abgedeckt werden sollten, wenn dies möglich ist.

Der folgende Pseudo-Algorithmus sollte den gesamten Workflow beschreiben:

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

Soweit so gut, aber ich muss dem Algorithmus mitteilen, wie viel ich ausgeben möchte. Nehmen wir an, eine einzelne Wette kostet 1in einer beliebigen Währung. Die Formel zur Berechnung der Kosten einer Mehrfachwette lautet:

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

Offensichtlich sollte der Algorithmus versuchen, so viel Geld wie möglich in den Wettvorschlag einzubeziehen (sonst würde es nicht viel Sinn machen), und jetzt wird dies schwieriger ...

Nehmen wir an, ich möchte maximal bezahlen 4und alle möglichen Vielfachen in PHP ( @ IDEOne ) auflisten :

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

Ergibt die folgende Ausgabe:

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

Das Problem

Wenn ich den maximal verfügbaren Geldbetrag spielen möchte ( 4), müsste ich mit zwei Doppelwetten wetten. Wenn ich den oben beschriebenen Pseudo-Algorithmus verwende, erhalte ich den folgenden Wettvorschlag:

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

Was im Vergleich zu einer dreifachen Wette, 3die mehr Unsicherheit kostet und deckt, suboptimal erscheint :

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

Das obige Beispiel gewinnt noch mehr an Relevanz, wenn Sie bedenken, dass die match #3Gewinnchancen Folgendes sein könnten:

$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 diesem Fall würde ich ohne guten Grund ein Doppel verschwenden.

Grundsätzlich kann ich nur die größte (möglicherweise dumme) Wette wählen und nicht die klügste, größte Wette .

Ich habe meinen Kopf seit einigen Tagen gegen die Wand geschlagen und gehofft, dass ich eine Art Offenbarung bekomme, aber bisher konnte ich nur zwei halbe [schlechte] Lösungen finden:


1) Zeichne eine "Linie"

Grundsätzlich würde ich sagen, dass Spiele mit einem stdev, der niedriger als ein bestimmter Wert ist, dreifach sind, Spiele mit einem stdev, der höher ist, wären Doppelwetten und die restlichen Einzelwetten.

Das Problem dabei ist natürlich, die entsprechenden spezifischen Grenzen herauszufinden - und selbst wenn ich die perfekten Werte für die "intelligenteste" Wette finde, weiß ich immer noch nicht, ob ich genug Geld habe, um die vorgeschlagene Wette zu spielen, oder ob Ich könnte eine noch größere (auch kluge) Wette abschließen ...


2) Bruteforce

Ich bin beim Schreiben dieser Frage auf diese Idee gekommen und weiß, dass sie in dem von mir beschriebenen Kontext keinen Sinn ergibt, aber ich denke, ich könnte sie mit etwas anderen Metriken zum Laufen bringen. Grundsätzlich könnte ich das Programm dazu bringen, Wetten (Anzahl der Triple- und Double-Wetten) für jeden möglichen Geldbetrag vorzuschlagen, den ich spielen könnte (von 1bis 4in meinem Beispiel), indem ich den oben beschriebenen Pseudo-Algorithmus anwende und einen globalen Rangwert (etwas) berechne wie % of symbols * match stdev- ich weiß, es macht keinen Sinn).

Die Wette mit dem höchsten Rang (Deckungsunsicherheit) wäre die vorgeschlagene Wette. Das Problem bei diesem Ansatz (abgesehen von der Tatsache, dass es noch keinen Sinn ergibt) ist, dass die Spiele, mit denen mein Programm arbeiten wird, nicht auf 3 Spiele beschränkt sind und die Anzahl der Doppel- und Dreifachwettkombinationen für diese Spiele wäre wesentlich höher.


Ich habe das Gefühl, dass es eine elegante Lösung gibt, aber ich kann es einfach nicht begreifen ...

Vielen Dank für jede Hilfe, die dieses Problem löst.


Es scheint einige Verwirrung in Bezug auf mein Problem zu geben, ich habe dies bereits in dieser Frage und auch in den Kommentaren angesprochen, aber die Fehlinterpretation scheint immer noch zu überwiegen, zumindest für einige.

Ich muss wissen, wie viele Triple-, Double- und Single-Wetten ich für ein bestimmtes Spiel (alle Matches) spielen werde. Ich weiß bereits, welche Symbole ich spielen möchte, indem ich mir jedes Match einzeln ansehe.

Alix Axel
quelle
4
Die guten Leute von math.stackexchange.com könnten möglicherweise ein besseres Verständnis für das von Ihnen beschriebene Problem vermitteln, was wiederum gute Möglichkeiten für die Implementierung nahe
1
@Lethargy: Ich habe hier einmal eine Frage zum Pascal-Dreieck und zu den Primzahlen gestellt, die letztere nach math.SE migriert haben. Ich habe sehr schnell ungefähr 15 Upvotes erhalten (sowohl bei SO als auch bei math.SE), aber die Frage wurde in weniger als 30 Minuten geschlossen und existiert nicht einmal mehr. Ich denke nicht, dass sie diese Art von "einfachen" Fragen sehr mögen.
Alix Axel
2
Wenn wir für die maximale Anzahl der Siege optimieren, scheint dies eigentlich ganz einfach zu sein. Die durchschnittliche Anzahl von Gewinnen ist einfach die Gewinnchance jeder einzelnen Instanz, die zusammenaddiert wird. Wenn wir also eine Einzelwette auf die maximale Chance setzen, gewinnen wir im Durchschnitt 0,4 + 1 + 0,9 = 2,3 Spiele. Wenn also das Hinzufügen einer Wette immer gleich teuer wäre, wäre die Lösung einfach, die Gewinnchancen zu sortieren und die ersten COST-Chancen zu nutzen (dies ergibt das "beste" Ergebnis für das Beispiel). Wenn die Kosten unterschiedlich sind, wenn eine Sekunde oder eine Dritte zu etwas hinzugefügt wird, wird es komplizierter (rekursive Bruteforce-Funktionen) und ich denke, ich werde darüber nachdenken.
2
Als Mathematiker, der PHP nicht kennt, würde ich es viel einfacher finden, dieses Problem anzugreifen, wenn es in mathematischer Notation statt in Code wäre.
2
Hast du von dem Kelly-Kriterium gehört ? Wenn nicht, gibt es eine Lektüre für Sie.

Antworten:

2

Ich denke, ich habe eine brauchbare Bruteforce-Lösung gefunden, die so aussieht:


  • 1) Berechnen Sie jede mögliche Kombination mehrerer Wetten, die ich machen kann

Für das Beispiel und die Beträge, die ich in meiner Frage angegeben habe, wäre dies:

  • 3 Einzel-, 0 Doppel-, 0 Dreifach- = entspricht 1 Einzelwette
  • 2 Einzel-, 1 Doppel-, 0 Dreifach- = entspricht 2 Einzelwetten
  • 2 Einzel-, 0 Doppel-, 1 Dreifach- = entspricht 3 Einzelwetten
  • 1 Einzel, 2 Doppel, 0 Dreifach = entspricht 4 Einzelwetten

  • 2) Berechnen Sie die Standardabweichung der Symbolquoten für jedes Spiel

             |    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) Berechnen Sie für jede Mehrfachwette ( Schritt 1 ) eine Rangfolge mit der Formel:

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

Wo #nist eine bestimmte Übereinstimmung und #n(x|y|z)ist die geordnete Quote der Symbole.

  • Übereinstimmungen werden von niedrigen zu hohen Standardabweichungen verarbeitet.
  • Einzelne Symbole in jedem Match werden von hohen zu niedrigen Quoten verarbeitet.

Test für 1 Einzel-, 2 Doppel-, 0 Dreifachwette:

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

Diese Wette gibt mir die Weltrangliste von 14.89 + 2.48 + 2.12 = 19.49.


Test für 2 Einzel-, 0 Doppel-, 1 Dreifachwette:

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

Welches gibt mir ein globales Ranking von 21.28 + 2.24 + 2.12 = 25.64. :-)


Alle verbleibenden Wetten sind eindeutig minderwertig, so dass es keinen Sinn macht, sie zu testen.

Diese Methode scheint zu funktionieren, aber ich bin durch Ausprobieren darauf gekommen, und nach meinem Bauch fehlt mir das mathematische Verständnis, um zu beurteilen, ob es richtig ist oder ob es einen besseren Weg gibt ...

Irgendwelche Hinweise?

PS: Entschuldigen Sie die schlechte Formatierung, aber der MD-Parser scheint sich von StackOverflow zu unterscheiden.

Alix Axel
quelle
Haben Sie die lineare Programmierung ( de.wikipedia.org/wiki/Linear_programming ) in Betracht gezogen , um dieses Problem zu lösen?
Victor Sorokin
1

Wie wäre es mit einer Lösung basierend auf der Simplex-Methode? Da die Voraussetzung für die Verwendung der Simplex-Methode nicht erfüllt ist, müssen wir die Methode geringfügig ändern. Ich nenne die modifizierte Version "Walk the line".

Methode:

Sie können die Unsicherheit jedes Matches messen. Tu es! Berechnen Sie die Unsicherheit jedes Spiels mit einer Einzel- oder Doppelwette (bei einer Dreifachwette gibt es keine Unsicherheit). Wählen Sie beim Hinzufügen eines Doppel- oder Dreifacheinsatzes immer den Einsatz, der die Unsicherheit am meisten verringert.

  1. Beginnen Sie mit der maximalen Anzahl von Triple-Wetten. Berechnen Sie die Gesamtunsicherheit.
  2. Entfernen Sie eine dreifache Wette. Fügen Sie ein oder zwei Doppelwetten hinzu und behalten Sie dabei die maximalen Kosten. Berechnen Sie die Gesamtunsicherheit.
  3. Wiederholen Sie Schritt 2, bis Sie die maximale Anzahl von Doppelwetten erreicht haben.

Wählen Sie die Wette mit der geringsten Gesamtunsicherheit.

Klas Lindbäck
quelle
0

Was ich aus der Beobachtung dieser Sportwetten habe, habe ich zu diesem Schluss gezogen.

Erwarteter Wert
Nehmen wir an, Sie haben 3 Wetten mit 1.29 5.5 and 10.3(letzte Wette in der Tabelle) EV für Wetten.
EV = 1/(1/1.29+1/5.5+1/10.3) - 1 = -0.05132282687714185 Wenn die Wahrscheinlichkeit, dass eine über eine andere gewinnt, so verteilt ist
1/1.29 : 1/5.5 : 1/10.3, verlieren Sie Ihr Geld auf lange Sicht, da Ihr EV negativ ist.
Sie können nur profitieren, wenn Sie die Wahrscheinlichkeiten der einzelnen Ergebnisse herausfinden und Unregelmäßigkeiten feststellen können.

Nehmen wir an, dass es sich um echte Wahrscheinlichkeiten handelt
0.7 : 0.2 : 0.1

Das heißt, die Preise sollten sein 1.43 \ 5.0 \ 10.0

Sie können sich vorstellen, dass in diesem Fall die beste Auszahlung für ein Unentschieden erzielt wird, da Sie wissen,
EV(0) = 5.5/5 - 1 = 0.1
wo das Wetten auf eine Niederlage liegt
EV(2) = 10.2/10 - 1 = 0.02
und das Wetten auf einen Heimsieg sogar bei einem EV liegt.
EV(1) = 1.29/1.43 - 1 = -0.10

ralu
quelle
Ich glaube nicht, dass du meine Frage hast. Ich weiß bereits, in welchen Symbolen (und in welcher Reihenfolge bei einem Mehrfacheinsatz) auf jedes einzelne Spiel gewettet werden muss. Mein Problem besteht darin, die ideale Anzahl von Triple- und Double-Wetten zu ermitteln, die ich spielen sollte, indem ich mir alle Matches (und ihre jeweiligen Symbolchancen) weltweit ansehe .
Alix Axel