[Python & SQLite] J'ai analysé la valeur attendue d'une course avec des chevaux dans la fourchette 1x win ①

Aperçu

Le sujet des courses de chevaux x AI a augmenté ces dernières années, mais beaucoup d'entre eux sont pour toutes les races. Je voudrais me concentrer sur les cas qui me tiennent à cœur! J'ai pensé, j'ai essayé d'utiliser netkeiba-grattoir cette fois.

Le thème à affiner cette fois est "Comment acheter une course dans laquelle courent des chevaux avec 1x victoires". En 2019, il y a eu de nombreux cas où des chevaux avec une victoire de 1x ont été coulés en dehors du ticket de pari, tels que Japan Derby, Hanshin JF et Arima Memorial. L'analyse a procédé avec un ticket de pari gagnant.

Obtenez des données avec netkeiba-scraper

Pour gratter les données des courses de chevaux, j'ai utilisé le code d'un grand ancêtre. Cliquez ici pour gitHub

Nous avons acquis des données au cours des 10 dernières années. Je n'ai pas utilisé genfeature pour l'extraction de fonctionnalités, car le traitement semblait prendre environ 40 jours. De plus, comme le nom de la classe JRA a été changé (ex. 5 millions sous → 1 classe win), il semble qu'il ne sera pas possible de correctement genfeature sans corriger le code Scala.

Lisez le fichier DL race.db en Python et démarrez l'analyse des données.

Charger SQLite avec 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)

Déplacez le fichier race.db au même niveau que le fichier ipynb de Jupyter Notebook et chargez-le. Puisque les données de course dans race.db sont stockées dans la table race_info et la table race_result, Obtenez les informations souhaitées dans chaque tableau.

Valeur attendue d'un cheval qui a gagné avec une popularité 1x

Valeur attendue par cotes(Toutes les classes)


#Nombre de victoires
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()
#Toutes les races
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()

#Calcul de la valeur attendue Je pense que j'écrirai plus
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('Gagner 1.La valeur attendue d'un ticket de pari 1x est%d' %t11)
print('Gagner 1.La valeur attendue du ticket de pari double est%d' %t12)
print('Gagner 1.La valeur attendue du ticket triple bet est%d' %t13)
print('Gagner 1.La valeur attendue d'un ticket de pari quadruple est%d' %t14)
print('Gagner 1.Valeur attendue de 5 fois le ticket de pari%d' %t15)
print('Gagner 1.La valeur attendue de 6 fois le ticket de pari est%d' %t16)
print('Gagner 1.7 fois le ticket de pari attendu%d' %t17)
print('Gagner 1.La valeur attendue du ticket de pari 8 fois est%d' %t18)
print('Gagner 1.La valeur attendue de 9 fois le ticket de pari est%d' %t19)

image.png Fait intéressant, nous avons constaté que plus les chances sont faibles, plus la victoire attendue est élevée (= la première place est probable). Est-ce parce qu'il y a beaucoup de chevaux historiquement célèbres alors que c'est 1,1 fois plus?

Si nous avons réduit à [Classe ouverte et au-dessus (y compris les prix élevés)] dans des conditions similaires, la valeur attendue de 1,1 fois a encore augmenté.

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 '%ouvert%' \
             GROUP BY r.odds ORDER BY r.odds ASC")

image.png

Découvrez les résultats par popularité

Quel cheval gagne souvent dans une course où courent les chevaux de la gamme 1x win? La 2e ou 3e popularité est-elle intéressante?

Contrairement à l'analyse jusqu'à ce qui précède, il ne peut être calculé que s'il est [limité aux courses avec des chevaux avec 1x victoires]. J'ai utilisé une sous-requête dans la notation WHERE ~ IN (SELECT ~~).

ResultByPopularity


#Nombre de victoires par popularité parmi les courses avec chevaux avec 1x victoires
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()
#Toutes les courses avec des chevaux dans la victoire 1x
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 Sur les 7 619 races, environ la moitié sont les plus populaires. La 2e popularité ne dépassera pas la valeur attendue de 100 à moins que la victoire soit 6 fois ou plus et la 3e popularité est proche de 10 fois.

image.png J'ai calculé la valeur attendue en multipliant les cotes par le nombre de têtes et en divisant par le nombre de courses, mais c'était terrible à 32.

Résumé

Le résultat de cette période était que si vous ne subdivisez pas l'hippodrome, la terre / le gazon, l'âge du cheval, le nombre de chevaux et la qualité des pattes de cheval, vous ne ferez pas de profit même si vous regardez les cotes. De plus, comme il existe différents types de billets de paris pour les courses de chevaux, [Quel type de billets de paris a le plus d'attentes dans une course dans laquelle courent des chevaux avec une victoire de 1x? 】Tel, Il semble que nous puissions l'analyser plus en profondeur.

Maintenant que j'ai compris comment extraire SQL avec Python (Jupiter Notebook), je vais continuer à l'analyser.

Article de référence

Une histoire sur le fonctionnement de netkeiba-scraper à partir de juin 2019 (Ubuntu 18.04.2 LTS)

Recommended Posts

[Python & SQLite] J'ai analysé la valeur attendue d'une course avec des chevaux dans la fourchette 1x win ①
[Python & SQLite] J'ai analysé la valeur attendue d'une course avec des chevaux dans la fourchette 1x win ②
J'ai écrit un doctest dans "J'ai essayé de simuler la probabilité d'un jeu de bingo avec Python"
J'ai essayé d'afficher la valeur d'altitude du DTM dans un graphique
J'ai essayé de trouver l'entropie de l'image avec python
J'ai aussi essayé d'imiter la fonction monade et la monade d'état avec le générateur en Python
J'ai essayé de créer une liste de nombres premiers avec python
J'ai essayé d'améliorer l'efficacité du travail quotidien avec Python
Une histoire qui n'a pas fonctionné lorsque j'ai essayé de me connecter avec le module de requêtes Python
J'ai essayé d'obtenir le code d'authentification de l'API Qiita avec Python.
(Python) J'ai essayé d'analyser 1 million de mains ~ J'ai essayé d'estimer le nombre d'AA ~
J'ai essayé de vérifier et d'analyser l'accélération de Python par Cython
J'ai essayé d'analyser la négativité de Nono Morikubo. [Comparer avec Posipa]
J'ai essayé de rationaliser le rôle standard des nouveaux employés avec Python
J'ai essayé d'obtenir les informations sur le film de l'API TMDb avec Python
J'ai fait un programme pour vérifier la taille d'un fichier avec Python
J'ai essayé d'implémenter le jeu de cartes de Trump en Python
J'ai essayé des centaines de millions de SQLite avec python
J'ai essayé d'obtenir et d'analyser les données statistiques de la nouvelle Corona avec Python: données de l'Université John's Hopkins
J'ai fait une application d'envoi de courrier simple avec tkinter de Python
J'ai installé Pygame avec Python 3.5.1 dans l'environnement de pyenv sur OS X
Pour générer une valeur au milieu d'une cellule avec Jupyter Notebook
J'ai essayé de prédire les chevaux qui seront dans le top 3 avec LightGBM
J'ai essayé de visualiser facilement les tweets de JAWS DAYS 2017 avec Python + ELK
Comment obtenir une liste de fichiers dans le même répertoire avec python
J'ai essayé de créer un modèle avec l'exemple d'Amazon SageMaker Autopilot
J'ai essayé d'envoyer automatiquement la littérature du nouveau virus corona à LINE avec Python
J'ai essayé de représenter graphiquement les packages installés en Python
J'ai essayé de toucher un fichier CSV avec Python
J'ai essayé de résoudre Soma Cube avec python
J'ai essayé d'implémenter un pseudo pachislot en Python
Je veux travailler avec un robot en python.
Dans IPython, quand j'ai essayé de voir la valeur, c'était un générateur, donc je l'ai inventé quand j'étais frustré.
J'ai essayé de résoudre le problème avec Python Vol.1
Je voulais connaître le nombre de lignes dans plusieurs fichiers et j'ai essayé de l'obtenir avec une commande
Introduction à la création d'IA avec Python! Partie 2 J'ai essayé de prédire le prix de l'immobilier dans la ville de Boston avec un réseau neuronal
J'ai essayé de résumer les opérations de chaîne de Python
J'ai étudié comment rationaliser le flux de travail avec Excel x Python ④
J'ai essayé de savoir comment rationaliser le flux de travail avec Excel x Python ⑤
J'ai essayé d'automatiser la mise à jour de l'article du blog Livedoor avec Python et sélénium.
[Python] J'ai essayé de créer automatiquement un rapport quotidien de YWT avec la messagerie Outlook
J'ai étudié comment rationaliser le flux de travail avec Excel x Python ①
J'ai étudié comment rationaliser le flux de travail avec Excel x Python ③
J'ai essayé de comparer la vitesse de traitement avec dplyr de R et pandas de Python
Le 15e temps réel hors ligne, j'ai essayé de résoudre le problème de l'écriture avec python
J'ai créé une fonction pour récupérer les données de la colonne de base de données par colonne en utilisant sql avec sqlite3 de python [sqlite3, sql, pandas]
(Python: OpenCV) J'ai essayé de générer une valeur indiquant la distance entre les régions tout en binarisant la vidéo en temps réel.
J'en ai marre de Python, alors j'ai essayé d'analyser les données avec nehan (je veux aller vivre même avec Corona) -Partie 2)
J'en ai marre de Python, alors j'ai essayé d'analyser les données avec nehan (je veux aller vivre même avec Corona) -Partie 1)
J'ai essayé la "correction gamma" de l'image avec Python + OpenCV
J'ai essayé de simuler la propagation de l'infection avec Python
J'ai essayé d'analyser les émotions de tout le roman "Weather Child" ☔️
J'ai essayé de trouver la moyenne de plusieurs colonnes avec TensorFlow