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

Aperçu

Ceci est une suite du post précédent [Python & SQLite] J'ai essayé d'analyser la valeur attendue d'une course avec des chevaux dans la gamme 1x win ①. La dernière fois, j'ai résumé les données récupérées en SQL et calculé la valeur de gain attendue avec Python (Jupiter Notebook).

Dans la continuité de la dernière fois, le thème est "Comment acheter une course dans laquelle les chevaux avec 1x gagne courent".

Dernier point de réflexion

Je n'ai pas pu trouver un moyen d'acheter un billet de pari gagnant qui dépasse la valeur attendue de 100 car je l'ai calculé sans restreindre les conditions telles que l'hippodrome et la distance. Cette fois, restreignons l'hippodrome, la distance, le gazon / terre et le type de billet et analysons en détail.

Recherchez des conditions susceptibles de susciter des attentes élevées en réduisant l'hippodrome et les types de billets

Cette fois, j'écrirai les résultats en se concentrant sur "Tokyo Racecourse". Les autres hippodromes sont bien, mais j'ai choisi l'hippodrome de Tokyo car c'est un hippodrome historique et je pense qu'il est facile pour les chevaux forts de démontrer leurs capacités.

De plus, le type de billet sera analysé par Maren (gagnant si deux chevaux sélectionnés pour la 1ère ou la 2ème place sont inclus). Comme vous pouvez le voir dans l'article précédent, les victoires les plus populaires dans la gamme de gains 1x ont près de 50% de chances de gagner. Nous avons émis l'hypothèse que Maren a un bon équilibre entre la facilité de toucher et de bons dividendes. (Il y a aussi une raison pour laquelle il peut y avoir du bruit provenant de chevaux qui ne sont pas populaires dans le système triple)

TokyoRacecource


#Cours de Shiba Recherchez de délicieux billets de paris à Maren
#Découvrez le taux de solidarité des chevaux les plus populaires avec un gain de 1x
cur.execute("SELECT i.distance, 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 IN ('1','2') AND i.surface like 'Shiba%' AND i.place_detail like '%Tokyo%' \
AND r.race_id IN (SELECT race_id from race_result WHERE odds<2.0 AND popularity='1') \
GROUP BY i.distance ORDER BY i.distance")
rows = cur.fetchall()

print('Nombre de solidarité(Shiba)')
for row in rows:
    print(row)
    
cur.execute("SELECT i.distance, 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 NOT IN ('1', '2') AND i.surface like 'Shiba%' AND i.place_detail like '%Tokyo%'\
AND r.race_id IN (SELECT race_id from race_result WHERE odds<2.0 AND popularity='1') \
GROUP BY i.distance ORDER BY i.distance")
rows2 = cur.fetchall()

print('Nombre de 3 ou moins(Shiba)')
for row2 in rows2:
    print(row2)

rentai1800 = round(rows[2][1] / (rows[2][1] + rows2[2][1]) * 100, 2)
print('1800m de taux de solidarité: %f pour cent' %rentai1800)
rentai2000 = round(rows[3][1] / (rows[3][1] + rows2[3][1]) * 100, 2)
print('Taux de solidarité 2000m: %f pour cent' %rentai2000)

----------résultat----------
Nombre de solidarité(Shiba)
(1400, 66)
(1600, 89)
(1800, 90)
(2000, 84)
(2300, 2)
(2400, 40)
(3400, 1)
Nombre de 3 ou moins(Shiba)
(1400, 31)
(1600, 59)
(1800, 38)
(2000, 31)
(2300, 2)
(2400, 22)
1800m de taux de solidarité: 70.310000 pour cent
Taux de solidarité 2000m: 73.040000%

Les résultats de 1800m et 2000m sont particulièrement bons. Le 2400m où se déroulent le Japan Derby, Oaks et Japan Cup est délicat à environ 64%.

Explorons les conditions du turf 2000m, qui a le taux de solidarité le plus élevé.

Tokyo Shiba 2000m Approfondissons les conditions où le plus populaire est la solidarité

Un autre cheval de solidarité [popularité gagnante]

Un autre cheval de solidarité


#Essayez de serrer à 2000m
#1 Une autre popularité quand la popularité est la solidarité

cur.execute("SELECT r.popularity, count(r.race_id) FROM race_result r \
INNER JOIN race_info i on r.race_id=i.id \
WHERE r.order_of_finish IN ('1','2') AND r.popularity != '1' \
AND r.race_id IN (SELECT race_id from race_result r INNER JOIN race_info i on r.race_id=i.id WHERE odds<2.0 AND popularity='1' \
AND order_of_finish IN ('1','2') AND i.surface like 'Shiba%' AND i.place_detail like '%Tokyo%' AND i.distance=2000) \
GROUP BY r.popularity ORDER BY r.popularity")
rows = cur.fetchall()

print('(Populaire,Nombre de fois)')
for row in rows:
    print(row)

----------résultat----------
(Populaire,Nombre de fois)
(2, 21)
(3, 31)
(4, 12)
(5, 6)
(6, 7)
(7, 4)
(8, 2)
(11, 1)

Étonnamment, il y avait plus de solidarités de 1ère et 3ème popularité que de solidarité de 1ère et 2ème popularité. Est-ce le résultat d'autres chevaux marquant le deuxième plus populaire, qui est susceptible de gagner même un peu, plutôt que le plus populaire?

À propos, [lorsque le cheval le plus populaire avec une victoire de 1x n'était pas la solidarité] et [le plus grand nombre de solidarité] était également le 3e plus populaire. Qu'il s'agisse des gains les plus populaires ou de la mousse, l'achat au second semble moins intéressant.

Un autre cheval de solidarité [Position au 4e virage]

4cornerPosition


cur.execute("SELECT substr(r.pass, -2), count(r.race_id) FROM race_result r \
INNER JOIN race_info i on r.race_id=i.id \
WHERE r.order_of_finish IN ('1','2') AND r.popularity != '1' \
AND r.race_id IN (SELECT race_id from race_result r INNER JOIN race_info i on r.race_id=i.id WHERE odds<2.0 AND popularity='1' \
AND order_of_finish IN ('1','2') AND i.surface like 'Shiba%' AND i.place_detail like '%Tokyo%' AND i.distance=2000) \
GROUP BY substr(r.pass, -2) ORDER BY substr(r.pass, -2)")
rows = cur.fetchall()

print('(Compter,Nombre de fois)')
for row in rows:
    print(row)

----------résultat----------
(Compter,Nombre de fois)
('-1', 14)
('-2', 15)
('-3', 14)
('-4', 4)
('-5', 10)
('-6', 6)
('-7', 4)
('-8', 4)
('-9', 2)
('10', 3)
('11', 3)
('12', 2)
('13', 3)

À la dernière entrée droite, les chevaux qui étaient à la 5e place semblent solidaires. Il est possible que ce soit parce que le cheval avec la jambe de tête est collant, et parce qu'il y avait de la capacité de réserve en premier lieu, il est à l'avant.

Un cheval populaire avec une victoire de 1x court à Tokyo Shiba 2000m, et si le 3ème cheval le plus populaire est la jambe de tête, la valeur attendue semble être élevée. Cela me rappelle le prix de l'empereur automne 2019 ...!

Essayez de calculer la valeur attendue de Maren (acquisition d'informations à partir de 3 tables)

De là, nous utiliserons trois tables obtenues par netkeiba-grattoir. Par conséquent, j'ai décidé de [affiner les conditions en imbriquant des sous-requêtes].

Gagnant n ° 1 Popular-Winning n ° 2 Popular Maren

Tout d'abord, c'est la valeur attendue lorsque vous achetez le Maren [1er le plus populaire-2e le plus populaire], qui semble avoir une valeur attendue faible.

1-2 Valeur attendue Maren populaire


# race_résultat course_course d'identité et de paiement_Calculez la valeur attendue en associant l'id
# ticket_tapez win 0,Double victoire 1,Cadre Ren 2,Maren 3,Large 4,Cheval seul 5,Triple 6,Triple simple 7

#Utilisation de sous-requêtes doubles, totalisant les remboursements consécutifs du cheval pour [la course dans laquelle un cheval était solidaire] et [la course dans laquelle l'autre cheval était le deuxième plus populaire]
cur.execute("SELECT DISTINCT p.race_id, p.payoff FROM payoff p \
INNER JOIN race_result r ON p.race_id=r.race_id INNER JOIN race_info i on p.race_id=i.id \
WHERE p.ticket_type=3 AND p.race_id IN \
        (SELECT r.race_id FROM race_result r \
        INNER JOIN race_info i on r.race_id=i.id \
        WHERE r.order_of_finish IN ('1','2') AND r.popularity='2' \
            AND r.race_id IN (SELECT race_id from race_result r INNER JOIN race_info i on r.race_id=i.id \
            WHERE odds<2.0 AND popularity='1' AND order_of_finish IN ('1','2') AND i.surface like 'Shiba%' \
            AND i.place_detail like '%Tokyo%' AND i.distance=2000))")
rows = cur.fetchall()
umaren_sum = 0
for row in rows:
    umaren_sum += row[1]

#Découvrez le nombre de courses dans lesquelles les chevaux de la victoire 1x
cur.execute("SELECT count(race_id) from race_result r INNER JOIN race_info i on r.race_id=i.id \
            WHERE odds<2.0 AND popularity='1' AND i.surface like 'Shiba%' AND i.place_detail like '%Tokyo%' \
            AND i.distance=2000")
rows2 = cur.fetchall()

print('Le nombre total de chevaux dans une course dans laquelle les chevaux avec une victoire de 1x sont solidaires:')
print(umaren_sum)

print('Le nombre de courses dans lesquelles des chevaux avec une victoire de 1x sont entrés au Tokyo Shiba 2000m:')
print(rows2[0][0])

print('Valeur attendue de Maren')
print(round(umaren_sum / rows2[0][0], 2))

-----résultat-----
Le nombre total de chevaux dans une course dans laquelle les chevaux avec une victoire de 1x sont solidaires:
6740.0
Le nombre de courses dans lesquelles des chevaux avec une victoire de 1x sont entrés au Tokyo Shiba 2000m:
115
Valeur attendue de Maren
58.61

Après tout, il est faible. Cela n'a pas de sens d'acheter un autre cheval populaire, car l'un semble être fort. Dans ce cas, il vaut mieux acheter la victoire la plus populaire.

Gagnant n ° 1 populaire-gagnant n ° 3 populaire Maren

Ensuite, il s'agit de la valeur attendue lorsque vous achetez le Maren [1er le plus populaire-3e le plus populaire], à laquelle vous pouvez vous attendre à la valeur la plus attendue.

1-3 Valeur attendue Maren populaire


# race_résultat course_course d'identité et de paiement_Calculez la valeur attendue en associant l'id
# ticket_tapez win 0,Double victoire 1,Cadre Ren 2,Maren 3,Large 4,Cheval seul 5,Triple 6,Triple simple 7

#Utilisation de doubles sous-requêtes, totalisant les remboursements consécutifs du cheval pour [la course dans laquelle un cheval était solidaire] et [la course dans laquelle un autre cheval était le troisième plus populaire]
cur.execute("SELECT DISTINCT p.race_id, p.payoff FROM payoff p \
INNER JOIN race_result r ON p.race_id=r.race_id INNER JOIN race_info i on p.race_id=i.id \
WHERE p.ticket_type=3 AND p.race_id IN \
        (SELECT r.race_id FROM race_result r \
        INNER JOIN race_info i on r.race_id=i.id \
        WHERE r.order_of_finish IN ('1','2') AND r.popularity='3' \
            AND r.race_id IN (SELECT race_id from race_result r INNER JOIN race_info i on r.race_id=i.id \
            WHERE odds<2.0 AND popularity='1' AND order_of_finish IN ('1','2') AND i.surface like 'Shiba%' \
            AND i.place_detail like '%Tokyo%' AND i.distance=2000))")
rows = cur.fetchall()
umaren_sum = 0
for row in rows:
    umaren_sum += row[1]

#Découvrez le nombre de courses dans lesquelles les chevaux de la victoire 1x
cur.execute("SELECT count(race_id) from race_result r INNER JOIN race_info i on r.race_id=i.id \
            WHERE odds<2.0 AND popularity='1' AND i.surface like 'Shiba%' AND i.place_detail like '%Tokyo%' \
            AND i.distance=2000")
rows2 = cur.fetchall()

print('Le nombre total de chevaux dans une course dans laquelle les chevaux avec une victoire de 1x sont solidaires:')
print(umaren_sum)

print('Le nombre de courses dans lesquelles des chevaux avec une victoire de 1x sont entrés au Tokyo Shiba 2000m:')
print(rows2[0][0])

print('Valeur attendue de Maren')
print(round(umaren_sum / rows2[0][0], 2))

-----résultat-----
Le nombre total de chevaux dans une course dans laquelle les chevaux avec une victoire de 1x sont solidaires:
18460.0
Le nombre de courses dans lesquelles des chevaux avec une victoire de 1x sont entrés au Tokyo Shiba 2000m:
115
Valeur attendue de Maren
160.52

La valeur attendue a finalement dépassé 100! Si vous connaissiez ces données, vous auriez acheté [Almond Eye et Danon Premium Maren] à l'automne du Prix de l'Empereur 2019.

Gagnant n ° 1 populaire n ° 4 populaire Maren

Au cas où, jetons un coup d'œil à la valeur attendue lors de l'achat de la Maren [1er plus populaire-4e plus populaire].

1-4 Valeur attendue Maren populaire


# race_résultat course_course d'identité et de paiement_Calculez la valeur attendue en associant l'id
# ticket_tapez win 0,Double victoire 1,Cadre Ren 2,Maren 3,Large 4,Cheval seul 5,Triple 6,Triple simple 7

#Utilisation de sous-requêtes doubles, totalisant les remboursements consécutifs du cheval pour [la course dans laquelle un cheval était solidaire] et [la course dans laquelle un autre cheval était le quatrième plus populaire]
cur.execute("SELECT DISTINCT p.race_id, p.payoff FROM payoff p \
INNER JOIN race_result r ON p.race_id=r.race_id INNER JOIN race_info i on p.race_id=i.id \
WHERE p.ticket_type=3 AND p.race_id IN \
        (SELECT r.race_id FROM race_result r \
        INNER JOIN race_info i on r.race_id=i.id \
        WHERE r.order_of_finish IN ('1','2') AND r.popularity='4' \
            AND r.race_id IN (SELECT race_id from race_result r INNER JOIN race_info i on r.race_id=i.id \
            WHERE odds<2.0 AND popularity='1' AND order_of_finish IN ('1','2') AND i.surface like 'Shiba%' \
            AND i.place_detail like '%Tokyo%' AND i.distance=2000))")
rows = cur.fetchall()
umaren_sum = 0
for row in rows:
    umaren_sum += row[1]

#Découvrez le nombre de courses dans lesquelles 1x chevaux ont couru
cur.execute("SELECT count(race_id) from race_result r INNER JOIN race_info i on r.race_id=i.id \
            WHERE odds<2.0 AND popularity='1' AND i.surface like 'Shiba%' AND i.place_detail like '%Tokyo%' \
            AND i.distance=2000")
rows2 = cur.fetchall()

print('Le nombre total de chevaux dans une course dans laquelle les chevaux avec une victoire de 1x sont solidaires:')
print(umaren_sum)

print('Le nombre de courses dans lesquelles des chevaux avec une victoire de 1x sont entrés au Tokyo Shiba 2000m:')
print(rows2[0][0])

print('Valeur attendue de Maren')
print(round(umaren_sum / rows2[0][0], 2))

-----résultat-----
Le nombre total de chevaux dans une course dans laquelle les chevaux avec une victoire de 1x sont solidaires:
10030.0
Le nombre de courses dans lesquelles des chevaux avec une victoire de 1x sont entrés au Tokyo Shiba 2000m:
115
Valeur attendue de Maren
87.22

Bien que cela ne dépasse pas 100, il a été constaté que la valeur attendue est supérieure à [1-2 Popular Maren].

Résumé

En réduisant les hippodromes, les parcours et les types de billets, le calcul de la valeur attendue s'est approfondi. Je m'habitue à gérer SQL. Si vous modifiez les conditions, vous pouvez l'analyser sur d'autres hippodromes, alors pourquoi ne pas essayer de calculer la valeur attendue de l'hippodrome près de votre lieu de résidence?

Le prochain objectif est de capturer WIN5 (un ticket de pari qui gagne tous les chevaux gagnants dans le set 5 courses, avec un dividende maximum de centaines de millions de yens)! Ce sera plus difficile car il faut analyser la lecture du terrain équestre et la lecture du développement des courses de chevaux, mais je vais l'essayer!

Merci d'avoir lu jusqu'ici.

Recommended Posts

[Python & SQLite] J'ai analysé la valeur attendue d'une course avec des chevaux dans la fourchette 1x win ②
J'ai essayé des centaines de millions de SQLite avec python
J'ai installé Pygame avec Python 3.5.1 dans l'environnement de pyenv sur OS X
[Discode Bot] J'ai essayé de créer un Bot qui me dit la valeur de race de Pokemon
Un mémo que j'ai touché au magasin de données avec python
J'ai réfléchi à la raison pour laquelle Python self est nécessaire avec le sentiment d'un interpréteur Python
J'ai essayé de trouver l'entropie de l'image avec python
J'ai remplacé le livre de recettes Windows PowerShell par un script python.
J'ai essayé la "correction gamma" de l'image avec Python + OpenCV
J'ai écrit la grammaire de base de Python dans Jupyter Lab
J'ai évalué la stratégie de négociation du système boursier avec Python.
J'ai essayé de simuler la probabilité d'un jeu de bingo avec Python
J'ai écrit un doctest dans "J'ai essayé de simuler la probabilité d'un jeu de bingo avec Python"
J'ai comparé la vitesse de Hash avec Topaz, Ruby et Python
J'ai essayé de gratter le classement du calendrier de l'avent Qiita avec Python
Une histoire sur l'écriture d'AWS Lambda et de devenir un peu accro aux valeurs par défaut des arguments Python
[python, ruby] sélénium-Obtenez le contenu d'une page Web avec le pilote Web
[Introduction à StyleGAN] J'ai joué avec "The Life of a Man" ♬
Je veux sortir le début du mois prochain avec Python
J'ai fait une loterie avec Python.
J'ai essayé de créer une liste de nombres premiers avec python
L'histoire de la création d'un pilote standard pour db avec python.
J'ai aimé le tweet avec python. ..
Je voulais résoudre le problème ABC164 A ~ D avec Python
L'idée d'alimenter le fichier de configuration avec un fichier python au lieu de yaml
Astuces: [Python] Calculez la valeur moyenne de la zone spécifiée avec bedgraph
J'ai essayé d'améliorer l'efficacité du travail quotidien avec Python
J'ai créé un démon avec Python
L'histoire de la création d'un module qui ignore le courrier avec python
Créez un programme de jugement de compatibilité avec le module aléatoire de python.
J'étais fatigué de Python, alors j'ai analysé les données avec nehan (lié à Corona, est-ce que ce mot est maintenant?)
[Python] J'ai analysé le journal d'un homme au cours de sa première année de vie professionnelle et j'ai fait un jugement positif / négatif sur la vie professionnelle.
J'ai remplacé le calcul numérique de Python par Rust et comparé la vitesse
L'histoire de la création d'un robot LINE pour le petit-déjeuner d'une université de 100 yens avec Python
[Explication AtCoder] Contrôlez les problèmes A, B, C d'ABC182 avec Python!
Calculer l'itinéraire le plus court d'un graphe avec la méthode Dyxtra et Python
[Introduction à Python] Comment trier efficacement le contenu d'une liste avec le tri par liste
J'ai essayé d'obtenir le code d'authentification de l'API Qiita avec Python.
Calculez la probabilité d'être une pièce de calmar avec le théorème de Bayes [python]
Hit une méthode d'une instance de classe avec l'API Web Python Bottle
J'obtiens une erreur Python No module nommée'encodings 'avec la commande aws
Recevez une liste des résultats du traitement parallèle en Python avec starmap
J'ai fait GAN avec Keras, donc j'ai fait une vidéo du processus d'apprentissage.
Un rappel de ce que je suis resté coincé lors du démarrage d'Atcoder avec python
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 fait une erreur en récupérant la hiérarchie avec MultiIndex of pandas
J'ai essayé d'afficher la valeur d'altitude du DTM dans un graphique
Obtenez la valeur de retour d'un script shell externe (ls) avec python3
J'ai mesuré la vitesse de la notation d'inclusion de liste, pendant et pendant avec python2.7.
Python: je souhaite mesurer proprement le temps de traitement d'une fonction
[Explication AtCoder] Contrôle ABC184 Problèmes A, B, C avec Python!