Appli d’analyse statistique des courses
J’ai dev une appli d’analyse statistique des courses PMU avec 13 critères. Code, méthode, et résultats publics.
Appli d’analyse statistique des courses

J’ai dev une appli d’analyse statistique des courses PMU avec 13 critères. Code, méthode, et résultats publics.
Pendant 4 mois, mon side-project a été un outil d’analyse turf. Pas pour parier moi-même (je le fais peu), mais parce que le turf est un terrain de jeu data fascinant : 30 courses par jour, chacune avec 16 partants, 6 disciplines, des milliers de variables.
Et un marché saturé de tipsters qui promettent “95% de gagnants” sans jamais publier leurs résultats.
J’ai fait l’inverse. Je publie mon ROI sur 90 jours, jours perdants compris. Et je documente la méthode au complet.
Voici ce que j’ai appris.
────────────────────────────────────────
Pourquoi le turf
Trois raisons :
-
C’est un terrain quasi unique de signal vs bruit. Chaque course est une expérience contrôlée avec ~16 sujets et un résultat clair en 2 minutes.
-
Les données sont publiques et structurées. L’API PMU expose musique, gains carrière, cotes en temps réel, arrivées.
-
Le marché financier (les cotes) est inefficient. Les bookmakers ne sont pas des oracles ; ils réagissent aux pressions des parieurs particuliers. Il y a de la value.
────────────────────────────────────────
La stack
- Python 3.12, Flask, SQLite (47 902 partants × 4 323 courses historiques en BDD à juin 2026)
- Fetch parallèle des 30 courses du jour via API PMU (8 threads, retry exponentiel)
- Frontend Jinja + vanilla JS (PWA installable, push notifications)
- Hébergement OVH France, gunicorn + nginx
- Pas de dependencies abracadabrantes : c’est volontairement low-tech pour pouvoir réparer vite.
Le repo n’est pas open source aujourd’hui (j’hésite encore) mais les principes sont totalement détaillés ici.
────────────────────────────────────────
Le scoring : 6 critères de base
Pour chaque cheval engagé dans une course, je calcule 6 scores sur 100 :
1. FORME
Lecture de la musique (résultats des 5 dernières courses). Pondération exponentielle décroissante : la dernière course compte plus que l’avant-dernière. Disqualification (D, T, A) = 0 point.
2. RÉGULARITÉ
Taux de place top 3 sur les 10 dernières courses. Mesure la constance, pas les coups d’éclat.
3. APTITUDE
Adéquation cheval × course. Stats spécifiques sur :
- Sa discipline (ATTELÉ / MONTÉ / PLAT / OBSTACLE)
- Sa distance de prédilection (tranches de 200m)
- Son hippodrome historique (taux de places à Vincennes vs Cagnes vs Caen, etc.)
4. ENTOURAGE
Le couple jockey + entraîneur. Stats 30 jours roulants : victoires, places, taux d’argent.
5. MARCHÉ
La cote du marché, normalisée par rapport à la cote la plus basse de la course (proxy de probabilité implicite).
6. GLOBAL
Combinaison pondérée : 0.25 × forme + 0.15 × entourage + 0.15 × aptitude + 0.15 × régularité + 0.25 × marché + drift_cote
Et un score VALEUR séparé : (intrinsèque — marché). Positif = sous-coté par le marché. C’est le “value bet”.
────────────────────────────────────────
Les 13 bonus avancés (V2)
Les 6 critères de base ne suffisaient pas. Un turfiste pointu m’a fait remarquer que je ratais : déférré, type de départ, corde, sens de course, allotissement, récence, etc.
J’ai ajouté 13 bonus, chacun pouvant ajuster le score d’aptitude de -3 à +5 points :
CONTEXTE COURSE
- Déférré (+5 si 4 pieds avec historique gagnant)
- Type de départ (autostart / élastique / volte / piquets)
- Corde × hippodrome (calcul stat de l’impact réel par tranche de corde sur cet hippodrome précis)
- Sens de course (gauche / droite) vs préférence historique du cheval
- Allotissement (descend de Groupe en Handicap = bonus)
- Stats sur l’épreuve elle-même (si déjà couru le PRIX X)
ÉTAT DU CHEVAL
- Récence (jours depuis dernière course)
- Patterns musique avancés (forme ascendante, DQ récente)
- Vitesse proxy (gains/course vs médiane peloton)
- Saisonnalité (perfs du cheval par mois)
JOCKEY
- Couple Jockey-Cheval (historique des courses ensemble)
- Forme jockey 7 jours (roulant)
PLAT UNIQUEMENT
- Poids handicap (écart au poids moyen du peloton)
Chaque bonus est appliqué à TOUS les chevaux avant le tri. Le cheval principal est celui avec le meilleur score V2-ajusté. Pas un favori a priori.
────────────────────────────────────────
Le piège de la performance — leçon douloureuse
Premier déploiement V2 = crash en prod. Le bulletin du jour faisait timeout : 30 courses × 20 chevaux × 10 queries SQL = 6 000+ requêtes par render. Gunicorn killait les workers.
Le fix :
- 8 nouveaux indexes SQLite ciblés sur les colonnes utilisées par V2 (id_cheval, jockey, hippodrome, date)
- Cache mémoire des bonus V2 par (id_cheval × date × course) avec eviction FIFO à 10k entrées
- Pré-fetching du peloton
Résultat : query passée de 3–5s à 0.1ms. Cache warm = 95% des requêtes ne touchent même plus la DB.
Leçon : on n’optimise jamais avant la mesure. Mais une fois le timeout signalé, les indexes ciblés sont 1000× plus efficaces qu’un refactor de cache compliqué.
────────────────────────────────────────
Le ROI public — la décision la plus stratégique
99% des sites de pronostics turf promettent “95% de gagnants”. Aucun ne publie ses résultats vérifiables.
J’ai pris le pari inverse : la page /performances de Casaque affiche le ROI réel par profil de jeu sur 7, 30, 90 jours, jours perdants compris.
Logique : si la méthode marche, ça se voit. Si elle ne marche pas, ça se voit aussi. C’est la seule façon d’être crédible long terme sur un marché saturé d’arnaqueurs.
À court terme, ça me coûte. Les gens préfèrent les belles promesses. À long terme, ça construit la confiance qui scale.
────────────────────────────────────────
Ce que je n’ai pas (encore) résolu
-
Réduction kilométrique exacte au trot : pas exposée dans l’API PMU sans abonnement payant. J’utilise un proxy gains/course. Imparfait.
-
Cote bookmakers internationaux vs PMU : demande des feeds payants ou scraping fragile.
-
Modèle machine learning supervisé : il faut 6+ mois de DB stable pour ne pas surapprendre.
-
Backtest “what if” avec/sans chaque bonus toggleable : demande de rejouer l’historique avec scoring paramétrable. Sur la roadmap V3.
────────────────────────────────────────
Si vous voulez tester
L’app est sur casaque.pro. Gratuite, sans inscription obligatoire pour consulter, sans pub, sans abonnement caché.
Page Performances : casaque.pro/performances
Outil d’analyse statistique à titre informatif, aucune incitation à parier. Jouez avec modération. 18 ans et plus. 09 74 75 13 13 (Joueurs Info Service).
────────────────────────────────────────
Si vous voulez challenger la méthode
Je suis très preneur de retours critiques de turfistes expérimentés. En particulier :
- Des biais de notation que vous identifiez en regardant des courses précises
- Des types de courses où le système rate systématiquement
- Le poids des critères qui vous semble mal calibré
Les corrections concrètes finissent en code dans la semaine.
────────────────────────────────────────
Merci d’avoir lu.
- “Tagué : data, python, sport, side-project, statistics”
- “Publié dans la catégorie Programming / Data Science”
메타데이터
- post_id
- 51f2ff2d9510
- slug
- appli-danalyse-statistique-des-courses-51f2ff2d9510
- url
- https://medium.com/@gregoire37/appli-danalyse-statistique-des-courses-51f2ff2d9510
- canonical_url
- https://medium.com/@gregoire37/appli-danalyse-statistique-des-courses-51f2ff2d9510
- author_url
- https://medium.com/@gregoire37
- status
- ok
- fetched_at
- 2026-06-09 15:37:30