11 KiB
Analyse du Modèle Prédictif Turf - Documentation Technique
1. Vue d'Ensemble du Système
1.1 Architecture Actuelle
Le système de prédiction turf repose sur plusieurs composants:
- Collecte de données: Scraping PMU (courses, cotes, résultats)
- Calcul de scoring: Agrégation de multiples features par cheval
- Génération de recommandations: Types de paris recommandés avec confiance
- Suivi de performance: Comparaison prédictions vs résultats réels
1.2 Sources de Données
| Source | Tables | Description |
|---|---|---|
| Canalturf | predictions, odds_history |
Cotes et prédictions externes |
| PMU | pmu_courses, pmu_reunions |
Courses et réunions officielles |
| Interne | scoring, recommendations |
Scores calculés et recommandations |
2. Analyse des Performances Actuelles
2.1 Métriques Globales
| Métrique | Valeur | Interprétation |
|---|---|---|
| Total prédictions evaluées | 96 | Échantillon encore réduit |
| Prédictions réussies (hit) | 20 | - |
| Taux de réussite global | 20.83% | En dessous du aléatoire (25% pour top 4) |
| 1er prédit = 1er réel | 1 | 42.86% de précision pour le favori |
| Chevaux dans le top 3 | 14 | 14.58% dans le top 3 |
2.2 Analyse par Rang Prédit
| Rang prédit | Total | Hits | Taux de réussite |
|---|---|---|---|
| 0 (non classé) | 69 | 9 | 13.04% |
| 1 (favori) | 7 | 3 | 42.86% |
| 2 | 10 | 3 | 30.00% |
| 3 | 10 | 5 | 50.00% |
Observations:
- Le rang 3 a le meilleur taux (50%) - possible sur-optimisation
- Les favoris (rang 1) ont 42.86% de réussite
- La catégorie "non classé" (rang 0) représente 71.8% des prédictions
2.3 Problemes Identifiés
- Volume insuffisant: Seulement 96 prédictions evaluées
- Catégorie 0 trop large: 69 prédictions non classifiées
- Pas de suivi des résultats: Table
recommendationsn'avait pas de résultats (0/32) → CORRIGÉ - Déséquilibre des données: Majorité de prédictions en rang 0
2.4 Analyse du Rang 0 (Résolu)
Cause racine identifié:
canalturf_partants: 356 prédictions (tous les partants, rank 0 par défaut)canalturf_selections: 165 prédictions (sélections supplémentaires, rank 0)canalturf_prono_*: 198 prédictions avec rank 1/2/3 (vraies prédictions)
Solution: Les prédictions avec rank 0 ne doivent PAS être incluses dans l'évaluation de performance. Seuls les ranks 1 (bases), 2 (chances), 3 (outsiders) constituent les vraie prédictions.
2.5 Résultats des Recommandations (Mise à jour)
Après mise à jour automatique:
| Résultat | Count |
|---|---|
| GAGNE | 6 |
| PERDU | 14 |
Taux de réussite: 30% ROI: -70% (à affiner avec analyse des cotes)
2.6 Modèle XGBoost - Résultats
Après entraînement sur 4 902 lignes de données historiques:
| Modèle | CV AUC | Amélioration vs random |
|---|---|---|
| Top 1 (gagnant) | 0.697 | +19.7% |
| Top 3 (placé) | 0.715 | +21.5% |
Top Features (par importance):
cote_directe- La cote est le predictor le plus importantrang_cote- Classement par coteimplied_prob- Probabilité implicite (1/cote)ratio_cote_field- Ratio cote vs moyenne du fieldtx_victoire- Taux de victoire historiqueforme_recente- Forme récente du cheval
Fichiers générés:
xgboost_models.pkl- Modèles entraînésfeature_importance_top1.csv- Importance des features pour top1feature_importance_top3.csv- Importance des features pour top3
3. Structure des Données
3.1 Tables Principales
predictions (739 lignes)
-- Prédictions brutes avant scoring
date, race_name, race_hippodrome, race_time,
horse_number, horse_name, odds, prediction_rank, source
scoring (123 lignes)
-- Score composite calculé par cheval
score = f(score_cote, score_forme, score_victoire, score_place,
score_rk, score_tendance, score_avis)
-- Features individuelles:
score_cote -- Score basé sur la cote
score_forme -- Score basé sur la forme récente
score_victoire -- Taux de victoire historique
score_place -- Taux de placé historique
score_rk -- Classement rank
score_tendance -- Tendance de la cote
score_avis -- Avis de l'entraîneur
historical_data (5 536 lignes)
-- Données historiques enrichies
date, hippodrome, distance, discipline, allocation
horse_name, horse_number, driver, age, sexe
musique, nb_courses, nb_victoires, nb_places
gains_carriere, gains_annee, reduction_km
avis_entraineur, oeilleres, deferre
cote_directe, cote_reference, est_favori
tx_victoire, tx_place, forme_recente, tendance_forme
ordre_arrivee, top1, top3, top5 -- Variables cibles
recommendations (32 lignes)
-- Recommandations de paris
type_pari: simple_gagnant, simple_place, couple_gagnant, couple_place
cheval1, numero1, cheval2, numero2
cote, mise, gain_potentiel, confiance, justification
3.2 Couverture des Données
| Métrique | Valeur |
|---|---|
| Période couverte | 2025-03-19 à 2026-03-18 |
| Nombre de jours de courses | 364 |
| Hippodromes différents | 45 |
| Disciplines | 5 (PLAT, TROT, MONTE, HAIES, STEEPLE) |
4. Modèle de Scoring Actuel
4.1 Formule de Scoring
Le score composite est calculé selon:
score = score_cote + score_forme + score_victoire + score_place
+ score_rk + score_tendance + score_avis
Features utilisées:
score_cote: Pondération inverse de la cote (plus petit = plus haut)score_forme: Basé surforme_recente(0-25 scale)score_victoire:tx_victoiredu chevalscore_place:tx_placedu chevalscore_rk: Classement relatif dans la coursescore_tendance: Variation de la cotescore_avis: Valeur textuelle convertie (POSITIF/NEUTRE/NEGATIF)
4.2 Limites du Modèle Actuel
- Pas depondération apprentissage: Les poids sont-ils optimaux?
- Features statiques: Pas de features dynamiques (météo, forme vs竞争对手)
- Pas de cross-validation: Pas de validation robuste
- Ignorer les correlations: Interactions entre features non capturées
- Pas de feature engineering: Variables dérivées limitées
5. Améliorations Proposées
5.1 Court Terme (Quick Wins)
5.1.1 Améliorer le Suivi des Résultats
# Ajouter le remplissage automatique des résultats
def update_recommendation_results():
"""Récupérer les résultats officiels et mettre à jour recommendations"""
# 1. Scraping des résultats PMU
# 2. Matching avec recommandations
# 3. Mise à jour du champ resultat
5.1.2 Réduire la Catégorie "Non Classé"
- Analyser pourquoi 71.8% des prédictions ont
predicted_rank = 0 - Implémenter un seuil minimum de confiance
5.1.3 Ajouter Plus de Prédictions
- Automatiser le scraping quotidien
- Cible: minimum 500 prédictions avant analyse
5.2 Moyen Terme (Amélioration du Modèle)
5.2.1 Feature Engineering
Nouvelles features à créer:
# Features basées sur l'historique
- forme_vs_favori = forme_recente / forme_favori_moyen
- performance_par_distance = tx_victoire_par_distance[dist]
- performance_par_discipline = tx_victoire_par_discipline[disc]
- performance_par_hippodrome = tx_victoire_par_hippodrome[hippo]
- forme_tendance = forme_3_der courses vs forme_10_dernières
# Features dynamiques
- ecart_cote = cote_directe - cote_reference
- momentum = indicateur_tendance * volume_paris
- valeur = (cote - cote_juste_estimee) / cote_juste_estimee
# Features d'interaction
- forme_x_cote = forme_recente * (1/cote)
- age_x_performance = age * tx_victoire
5.2.2 Modèle de Machine Learning
Approche recommandée: XGBoost avec validation croisée
# Structure de données pour ML
features_ml = [
'tx_victoire', 'tx_place', 'forme_recente',
'age', 'nb_courses', 'cote_directe',
'distance', 'nb_partants', 'est_favori',
'reduction_km', 'gains_annee'
]
target_top1 = 'top1' # 1 si cheval gagné
target_top3 = 'top3' # 1 si cheval placé top 3
# Pipeline ML
1. Séparation train/test (80/20)
2. Cross-validation 5-fold
3. Hyperparameter tuning
4. Feature importance analysis
5. Backtest sur données historiques
5.2.3 pondérations Optimales
Analyse des poids actuels vs optimaux:
| Feature | Poids actuel | Importance suggèree |
|---|---|---|
| score_cote | 14.7 | Haute (mais non-linéaire) |
| score_forme | 25.0 | Très haute |
| score_victoire | 15.0 | Haute |
| score_place | 15.0 | Moyenne |
| score_rk | 7.0 | Basse |
| score_tendance | 9.3 | Moyenne |
| score_avis | 6.5 | Variable |
5.3 Long Terme (Système Avancé)
5.3.1 Modèles Multi-Cibles
| Modèle | Cible | Type de pari |
|---|---|---|
model_top1 |
top1 | Simple Gagnant |
model_top3 |
top3 | Simple Placé |
model_quinte |
top5 | Couplé/Quinté |
5.3.2 Système de Cotes Justes
# Estimer la cote "juste" vs cote PMU
cote_juste = f(tx_victoire_model, tx_place_model, dispersion)
# Identifier les "value bets"
value = cote_PMU - cote_juste
if value > seuil:
recommander_pari()
5.3.3 Intégration Météo (Non Implémentée)
La table weather existe mais contient seulement 4 lignes.
À implémenter:
- Scraping météo quotidien
- Impact sur performance (par course)
- Ajustement des prédictions selon conditions
6. Plan d'Action
Phase 1: Collecte de Données (Semaine 1-2)
- Automatiser le scraping quotidien
- Compléter le remplissage des résultats
- Atteindre 500+ prédictions évaluées
Phase 2: Analyse Exploratoire (Semaine 3)
- Analyse univariée des features
- Corrélations entre features
- Identification des patterns
Phase 3: Modèle ML (Semaine 4-6)
- Feature engineering
- Entraînement XGBoost
- Validation croisée
- Comparaison avec modèle actuel
Phase 4: Production (Semaine 7-8)
- Déploiement nouveau modèle
- Monitoring des performances
- Ajustements itératifs
7. KPIs à Suivre
| KPI | Cible Court Terme | Cible Long Terme |
|---|---|---|
| Taux hit global | 25% | 35% |
| Précision favori | 45% | 50% |
| Précision top 3 | 40% | 55% |
| ROI recommandations | 0% | 10%+ |
| Volume predictions | 500+ | 2000+ |
8. Conclusion
Le système actuel montre des bases solides mais nécessite:
- Plus de données pour une analyse statistique robuste
- Un suivi rigoureux des résultats pour mesure de performance
- Une évolution vers le ML pour optimiser les pondérations
Les recommandations immédiates:
- Compléter le remplissage des résultats (0/32 actuellement)
- Augmenter le volume de prédictions
- Passer à un modèle XGBoost avec features enrichies
Document généré le 2026-03-25 Source: Analyse de turf.db - turf_scraper