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.
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.
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.
Tableau Race_info Les informations pour chaque course sont répertoriées.
Table Race_result Le record de bataille pour chaque cheval est répertorié.
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)
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")
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])
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.
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.
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.
Une histoire sur le fonctionnement de netkeiba-scraper à partir de juin 2019 (Ubuntu 18.04.2 LTS)