# 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 1. **Volume insuffisant**: Seulement 96 prédictions evaluées 2. **Catégorie 0 trop large**: 69 prédictions non classifiées 3. **Pas de suivi des résultats**: Table `recommendations` n'avait pas de résultats (0/32) → **CORRIGÉ** 4. **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):** 1. `cote_directe` - La cote est le predictor le plus important 2. `rang_cote` - Classement par cote 3. `implied_prob` - Probabilité implicite (1/cote) 4. `ratio_cote_field` - Ratio cote vs moyenne du field 5. `tx_victoire` - Taux de victoire historique 6. `forme_recente` - Forme récente du cheval **Fichiers générés:** - `xgboost_models.pkl` - Modèles entraînés - `feature_importance_top1.csv` - Importance des features pour top1 - `feature_importance_top3.csv` - Importance des features pour top3 --- ## 3. Structure des Données ### 3.1 Tables Principales #### `predictions` (739 lignes) ```sql -- Prédictions brutes avant scoring date, race_name, race_hippodrome, race_time, horse_number, horse_name, odds, prediction_rank, source ``` #### `scoring` (123 lignes) ```sql -- 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) ```sql -- 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) ```sql -- 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é sur `forme_recente` (0-25 scale) - `score_victoire`: `tx_victoire` du cheval - `score_place`: `tx_place` du cheval - `score_rk`: Classement relatif dans la course - `score_tendance`: Variation de la cote - `score_avis`: Valeur textuelle convertie (POSITIF/NEUTRE/NEGATIF) ### 4.2 Limites du Modèle Actuel 1. **Pas depondération apprentissage**: Les poids sont-ils optimaux? 2. **Features statiques**: Pas de features dynamiques (météo, forme vs竞争对手) 3. **Pas de cross-validation**: Pas de validation robuste 4. **Ignorer les correlations**: Interactions entre features non capturées 5. **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 ```python # 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:** ```python # 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** ```python # 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 ```python # 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: 1. **Plus de données** pour une analyse statistique robuste 2. **Un suivi rigoureux** des résultats pour mesure de performance 3. **Une évolution vers le ML** pour optimiser les pondérations Les recommandations immédiates: 1. Compléter le remplissage des résultats (0/32 actuellement) 2. Augmenter le volume de prédictions 3. Passer à un modèle XGBoost avec features enrichies --- *Document généré le 2026-03-25* *Source: Analyse de turf.db - turf_scraper*