[Python & SQLite] Ich habe den erwarteten Wert eines Rennens mit Pferden im 1x-Gewinnbereich ① analysiert

Überblick

Das Thema Pferderennen x KI hat in den letzten Jahren zugenommen, aber viele davon sind für alle Rennen. Ich möchte mich auf die Fälle konzentrieren, die mir persönlich wichtig sind! Ich dachte, ich habe diesmal versucht, Netkeiba-Scraper zu verwenden.

Das Thema, das diesmal eingegrenzt werden soll, lautet "Wie kaufe ich ein Rennen, bei dem Pferde mit 1x Siegen laufen". Im Jahr 2019 gab es viele Fälle, in denen Pferde mit einem Gewinn von 1x außerhalb des Wettscheins versenkt wurden, wie beispielsweise Japan Derby, Hanshin JF und Arima Memorial. Die Analyse wurde mit einem Gewinn-Wettschein fortgesetzt.

Holen Sie sich Daten mit Netkeiba-Scraper

Für das Scraping von Pferderenndaten habe ich den Code eines großen Vorfahren verwendet. Klicken Sie hier für gitHub

Wir haben Daten für die letzten 10 Jahre erfasst. Ich habe "genfeature" nicht für die Feature-Extraktion verwendet, da die Verarbeitung anscheinend etwa 40 Tage dauerte. Da der Name der JRA-Klasse geändert wurde (z. B. 5 Millionen unter → 1 Gewinnklasse), scheint es auch nicht möglich zu sein, das Genfeature ordnungsgemäß zu "korrigieren", ohne den Scala-Code zu korrigieren.

Lesen Sie die Datei DL race.db in Python und starten Sie die Datenanalyse.

Laden Sie SQLite mit Jupyter Notebook

dbconnect


import sqlite3 as sq

conn = sq.connect('race.db')
cur = conn.cursor()

cur.execute("SELECT r.race_id, i.race_name, r.order_of_finish, r.odds \
             FROM race_result r INNER JOIN race_info i on r.race_id=i.id \
             WHERE r.odds<2.0")

rows = cur.fetchall()
for row in rows:
    print(row)

Verschieben Sie die Datei race.db auf die gleiche Ebene wie die ipynb-Datei von Jupyter Notebook und laden Sie sie. Da die Renndaten in race.db in der Tabelle "race_info" und der Tabelle "race_result" gespeichert sind, Holen Sie sich die gewünschten Informationen aus jeder Tabelle.

Erwarteter Wert eines Pferdes, das mit 1x Popularität gewonnen hat

Erwarteter Wert nach Gewinnchancen(Alle Klassen)


#Anzahl der Siege
cur.execute("SELECT r.odds, count(r.race_id) \
             FROM race_result r \
             WHERE r.odds<2.0 AND r.order_of_finish='1' \
             GROUP BY r.odds ORDER BY r.odds ASC")
rows = cur.fetchall()
#Alle Rennen
cur.execute("SELECT r.odds, count(r.race_id) \
             FROM race_result r \
             WHERE r.odds<2.0 \
             GROUP BY r.odds ORDER BY r.odds")
rows2 = cur.fetchall()

#Erwartungswertberechnung Ich denke, ich werde mehr schreiben
try:
    t11 = rows[0][0] * rows[0][1] / (rows2[0][0] * rows2[0][1]) * 100
    t12 = rows[1][0] * rows[1][1] / (rows2[1][0] * rows2[1][1]) * 100
    t13 = rows[2][0] * rows[2][1] / (rows2[2][0] * rows2[2][1]) * 100
    t14 = rows[3][0] * rows[3][1] / (rows2[3][0] * rows2[3][1]) * 100
    t15 = rows[4][0] * rows[4][1] / (rows2[4][0] * rows2[4][1]) * 100
    t16 = rows[5][0] * rows[5][1] / (rows2[5][0] * rows2[5][1]) * 100
    t17 = rows[6][0] * rows[6][1] / (rows2[6][0] * rows2[6][1]) * 100
    t18 = rows[7][0] * rows[7][1] / (rows2[7][0] * rows2[7][1]) * 100
    t19 = rows[8][0] * rows[8][1] / (rows2[8][0] * rows2[8][1]) * 100
except:
    None

print('Gewinnen Sie 1.Der erwartete Wert von 1x Wettschein ist%d' %t11)
print('Gewinnen Sie 1.Der erwartete Wert des Doppelwettscheins ist%d' %t12)
print('Gewinnen Sie 1.Der erwartete Wert des Triple-Wett-Tickets beträgt%d' %t13)
print('Gewinnen Sie 1.Der erwartete Wert eines Vierfach-Wettscheins ist%d' %t14)
print('Gewinnen Sie 1.Erwarteter Wert des 5-fachen Wettscheins%d' %t15)
print('Gewinnen Sie 1.Der erwartete Wert des 6-fachen des Wettscheins beträgt%d' %t16)
print('Gewinnen Sie 1.7 mal das erwartete Wettticket%d' %t17)
print('Gewinnen Sie 1.Der erwartete Wert des 8-fachen Wettscheins beträgt%d' %t18)
print('Gewinnen Sie 1.Der erwartete Wert des 9-fachen des Wettscheins beträgt%d' %t19)

image.png Interessanterweise haben wir festgestellt, dass der erwartete Gewinn umso höher ist, je niedriger die Gewinnchancen sind (= der 1. Platz ist wahrscheinlich). Liegt es daran, dass es viele historisch berühmte Pferde gibt, wenn es 1,1-mal so viel ist?

Wenn wir uns unter ähnlichen Bedingungen auf [Offene Klasse und höher (einschließlich schwerer Preise)] eingrenzen, steigt der erwartete Wert von 1,1-fach weiter an.

OnlyOpenClass


cur.execute("SELECT r.odds, count(r.race_id) \
             FROM race_result r INNER JOIN race_info i on r.race_id=i.id \
             WHERE r.odds<2.0 AND r.order_of_finish='1' AND i.race_class like '%öffnen%' \
             GROUP BY r.odds ORDER BY r.odds ASC")

image.png

Finden Sie die Ergebnisse nach Beliebtheit heraus

Welches Pferd gewinnt oft in einem Rennen, in dem Pferde im 1x-Gewinnbereich laufen? Ist die 2. oder 3. Popularität interessant?

Im Gegensatz zu der obigen Analyse kann sie nur berechnet werden, wenn sie [auf Rennen mit Pferden mit 1x Siegen beschränkt] ist. Ich habe eine Unterabfrage in der Notation "WHERE ~ IN (SELECT ~~)" verwendet.

ResultByPopularity


#Anzahl der Siege nach Beliebtheit bei Rennen mit Pferden mit 1x Siegen
cur.execute("SELECT r.popularity, count(r.race_id) \
             FROM race_result r \
             WHERE r.order_of_finish='1' AND r.race_id IN (SELECT race_id from race_result WHERE odds<2.0 AND popularity='1') \
             GROUP BY r.popularity ORDER BY r.popularity ASC")
rows = cur.fetchall()
#Alle Rennen mit Pferden im 1x gewinnen
cur.execute("SELECT count(r.race_id) FROM race_result r WHERE r.odds<2.0 AND r.popularity='1'")
rows2 = cur.fetchall()

for row in rows:
    print(row)
print(rows2[0][0])

image.png Von allen 7.619 Rennen ist etwa die Hälfte das beliebteste. Die 2. Popularität wird den erwarteten Wert von 100 nicht überschreiten, es sei denn, der Gewinn ist 6-mal oder mehr und die 3. Popularität ist fast 10-mal.

image.png Ich habe den erwarteten Wert berechnet, indem ich die Gewinnchancen mit der Anzahl der Köpfe multipliziert und durch die Anzahl der Rennen dividiert habe, aber mit 32 war es schrecklich.

Zusammenfassung

Das Ergebnis dieser Zeit war, dass Sie keinen Gewinn erzielen, wenn Sie die Rennstrecke, den Schmutz / Rasen, das Alter des Pferdes, die Anzahl der Pferde und die Qualität der Pferdebeine nicht unterteilen, selbst wenn Sie die Gewinnchancen betrachten. Da es verschiedene Arten von Wettscheinen für Pferderennen gibt, [Welcher Wettscheintyp hat die höchsten Erwartungen in einem Rennen, in dem Pferde mit einem Gewinn von 1x laufen? 】Eine solche, Es scheint, dass wir es tiefer analysieren können.

Nachdem ich herausgefunden habe, wie SQL mit Python (Jupiter Notebook) extrahiert wird, werde ich es weiter analysieren.

Referenzartikel

Eine Geschichte darüber, ob Netkeiba-Scraper ab Juni 2019 funktioniert (Ubuntu 18.04.2 LTS)

Recommended Posts

[Python & SQLite] Ich habe den erwarteten Wert eines Rennens mit Pferden im 1x-Gewinnbereich ① analysiert
[Python & SQLite] Ich habe den erwarteten Wert eines Rennens mit Pferden im 1x-Gewinnbereich ② analysiert
Ich schrieb einen Test in "Ich habe versucht, die Wahrscheinlichkeit eines Bingospiels mit Python zu simulieren".
Ich habe versucht, den Höhenwert von DTM in einem Diagramm anzuzeigen
Ich habe versucht, die Entropie des Bildes mit Python zu finden
Ich habe auch versucht, die Funktionsmonade und die Zustandsmonade mit dem Generator in Python nachzuahmen
Ich habe versucht, mit Python eine Liste von Primzahlen zu erstellen
Ich habe versucht, die Effizienz der täglichen Arbeit mit Python zu verbessern
Eine Geschichte, die nicht funktioniert hat, als ich versucht habe, mich mit dem Python-Anforderungsmodul anzumelden
Ich habe versucht, den Authentifizierungscode der Qiita-API mit Python abzurufen.
(Python) Ich habe versucht, 1 Million Hände zu analysieren ~ Ich habe versucht, die Anzahl der AA ~ zu schätzen
Ich habe versucht, die Beschleunigung von Python durch Cython zu verifizieren und zu analysieren
Ich habe versucht, die Negativität von Nono Morikubo zu analysieren. [Vergleiche mit Posipa]
Ich habe versucht, die Standardrolle neuer Mitarbeiter mit Python zu optimieren
Ich habe versucht, die Filminformationen der TMDb-API mit Python abzurufen
Ich habe ein Programm erstellt, um die Größe einer Datei mit Python zu überprüfen
Ich habe versucht, Trumps Kartenspiel in Python zu implementieren
Ich habe Hunderte Millionen SQLite mit Python ausprobiert
Ich habe versucht, die statistischen Daten der neuen Corona mit Python abzurufen und zu analysieren: Daten der Johns Hopkins University
Ich habe eine einfache Mail-Sendeanwendung mit tkinter von Python erstellt
Ich habe Pygame mit Python 3.5.1 in der Umgebung von pyenv unter OS X installiert
So geben Sie mit Jupyter Notebook einen Wert in der Mitte einer Zelle aus
Ich habe versucht, die Pferde vorherzusagen, die mit LightGBM unter den Top 3 sein werden
Ich habe versucht, die Tweets von JAWS DAYS 2017 mit Python + ELK einfach zu visualisieren
So erhalten Sie mit Python eine Liste der Dateien im selben Verzeichnis
Ich habe versucht, ein Modell mit dem Beispiel von Amazon SageMaker Autopilot zu erstellen
Ich habe versucht, die Literatur des neuen Corona-Virus mit Python automatisch an LINE zu senden
Ich habe versucht, die in Python installierten Pakete grafisch darzustellen
Ich habe versucht, eine CSV-Datei mit Python zu berühren
Ich habe versucht, Soma Cube mit Python zu lösen
Ich habe versucht, einen Pseudo-Pachislot in Python zu implementieren
Ich möchte mit einem Roboter in Python arbeiten.
Als ich in IPython versuchte, den Wert zu sehen, war es ein Generator, also kam ich auf ihn, als ich frustriert war.
Ich habe versucht, das Problem mit Python Vol.1 zu lösen
Ich wollte die Anzahl der Zeilen in mehreren Dateien wissen und versuchte, sie mit einem Befehl abzurufen
Einführung in die KI-Erstellung mit Python! Teil 2 Ich habe versucht, den Hauspreis in Boston mit einem neuronalen Netz vorherzusagen
Ich habe versucht, die String-Operationen von Python zusammenzufassen
Ich habe untersucht, wie der Arbeitsablauf mit Excel x Python ④ optimiert werden kann
Ich habe versucht herauszufinden, wie der Arbeitsablauf mit Excel x Python optimiert werden kann
Ich habe versucht, das Artikel-Update des Livedoor-Blogs mit Python und Selen zu automatisieren.
[Python] Ich habe versucht, automatisch einen täglichen Bericht über YWT mit Outlook-Mail zu erstellen
Ich habe untersucht, wie der Arbeitsablauf mit Excel x Python optimiert werden kann
Ich habe untersucht, wie der Arbeitsablauf mit Excel x Python optimiert werden kann
Ich habe versucht, die Verarbeitungsgeschwindigkeit mit dplyr von R und pandas von Python zu vergleichen
Beim 15. Offline-Echtzeitversuch habe ich versucht, das Problem des Schreibens mit Python zu lösen
Ich habe eine Funktion zum Abrufen von Daten aus der Datenbank spaltenweise mithilfe von SQL mit SQLite3 von Python [SQLite3, SQL, Pandas] erstellt.
(Python: OpenCV) Ich habe versucht, einen Wert auszugeben, der den Abstand zwischen Regionen angibt, während das Video in Echtzeit binärisiert wurde.
Ich habe Python satt, also habe ich versucht, die Daten mit nehan zu analysieren (ich möchte sogar mit Corona live gehen) - Teil 2)
Ich habe Python satt, also habe ich versucht, die Daten mit nehan zu analysieren (ich möchte sogar mit Corona live gehen) - Teil 1)
Ich habe versucht, das Bild mit Python + OpenCV "gammakorrektur" zu machen
Ich habe versucht zu simulieren, wie sich die Infektion mit Python ausbreitet
Ich habe versucht, die Emotionen des gesamten Romans "Wetterkind" zu analysieren
Ich habe versucht, mit TensorFlow den Durchschnitt mehrerer Spalten zu ermitteln