Skip to content

Latest commit

 

History

History
140 lines (111 loc) · 10.8 KB

File metadata and controls

140 lines (111 loc) · 10.8 KB

📊 Rapport d'Audit Global - Système de Trading IA Hybride

Ce rapport présente une analyse approfondie du système de trading. L'objectif est de vérifier l'implémentation de chaque composant, d'identifier les erreurs éventuelles et d'évaluer la qualité de l'architecture.

1. Analyse Architecturale Globale

L'architecture de ce projet est un modèle tri-modal combinant des algorithmes quantitatifs (Scikit-Learn), des modèles de fondation temporelle (TimesFM) et des modèles de langage (Ollama/Gemma4). Les différents modules interagissent de façon harmonieuse grâce à un chef d'orchestre (main.py) et à un moteur de décision consensuel (enhanced_decision_engine.py). Le pipeline est unidirectionnel et asynchrone pour les appels réseaux. La gestion de l'état, de la mémoire locale (cache) et des bases de données SQLite est propre et adaptée à un outil de ce calibre.


2. Analyse Fichier par Fichier

2.1 Acquisition et Caractéristiques des Données

src/data.py

  • Rôle : Acquisition des données financières depuis Yahoo Finance (yfinance), Alpha Vantage, et les données Macro US (FRED, Trésorerie).
  • Analyse de l'implémentation :
    • Implémente un mécanisme de "Circuit Breaker" et de cache robuste avec des retries pour l'API Yahoo Finance, connue pour être instable.
    • Caching persistant au format parquet dans data_cache/ pour limiter les appels réseau inutiles.
    • get_etf_data : Télécharge le ticker principal et le ^VIX simultanément pour avoir l'indice de volatilité intégré au dataset d'entraînement. Bonne gestion d'erreur si le VIX échoue (valeur par défaut de 20.0).
    • Macro data : Gère proprement FRED et les données de YieldCurve via web readers et pandas.
  • Avis : Fichier robuste et bien conçu pour palier l'instabilité des API financières gratuites.

src/features.py

  • Rôle : Calcul des indicateurs techniques basés sur le DataFrame de prix.
  • Analyse de l'implémentation :
    • Calcule des indicateurs standards (MA, EMA, RSI, MACD, Bollinger, ATR) en utilisant numpy/pandas de façon vectorisée (pas de iterrows, très performant).
    • _calculate_atr est correctement implémentée (True Range classique).
  • Avis : L'ingénierie des caractéristiques est performante et s'appuie sur de bonnes pratiques Pandas (vectorisation).

2.2 Modèles de Décision de Base

src/classic_model.py (Scikit-Learn)

  • Rôle : Entraînement et prédiction utilisant des algorithmes d'apprentissage automatique classiques (RandomForest, GradientBoosting, LogisticRegression).
  • Analyse de l'implémentation :
    • Modèle d'ensemble qui sélectionne l'algorithme le plus performant dynamiquement en utilisant TimeSeriesSplit (respect de l'ordre temporel des données).
    • Caching local par empreinte MD5 des données (_data_hash) pour éviter de réentrainer un modèle si les données n'ont pas changé : excellente pratique.
    • Utilisation de ffill().bfill().fillna(0) pour nettoyer les NaN en tenant compte des séries temporelles.
  • Avis : Approche robuste et pertinente. L'utilisation de TimeSeriesSplit est essentielle pour ne pas polluer l'entraînement avec des données du futur.

src/timesfm_model.py

  • Rôle : Prévision de séries temporelles pures avec le modèle de fondation de Google (timesfm_2p5_torch).
  • Analyse de l'implémentation :
    • Fonctionne sous forme de Singleton (get_instance()) pour éviter le rechargement lourd des poids du modèle.
    • Extrait directement les valeurs "Close" et effectue un forecast. Le calcul du signal de base est de 0.5% sur un horizon de 5 jours.
  • Avis : L'intégration de TimesFM est propre. Ce fichier est bien géré pour une intégration qui nécessite un téléchargement de modèle local.

2.3 Analyse de Sentiment et Modèles LLM

src/llm_client.py

  • Rôle : Création des prompts, appel au LLM local (Ollama) pour l'analyse textuelle et visuelle.
  • Analyse de l'implémentation :
    • Modèle ciblé : hf.co/unsloth/gemma-4-12b-it-GGUF:Q6_K sur localhost:11434.
    • construct_llm_prompt agrège les données techniques, les titres d'actualité et les informations de recherche web (Hyperliquid ou macro).
    • Le format JSON final est imposé de manière claire.
    • get_visual_llm_decision encode une image en Base64 et demande explicitement une analyse chartiste au modèle visuel.
  • Avis : La structure des prompts est claire et exhaustive. L'utilisation d'un format JSON strict ({"decision": "...", "confidence": ..., "reason": "..."}) facilite le parsing ultérieur.

src/sentiment_analysis.py, src/news_fetcher.py, src/web_researcher.py

  • Rôle : Acquisition des news (Alpha Vantage) et conversion en signaux.
  • Analyse de l'implémentation :
    • sentiment_analysis.py convertit un score de sentiment en un signal d'achat (> 0.15), de vente (< -0.15) ou de maintien.
    • news_fetcher.py gère l'absence de clé API de façon silencieuse mais sécurisée.
  • Avis : Logique simple et efficace. La gestion du sentiment est pragmatique.

2.4 Moteur de Décision et Gestion des Risques

src/enhanced_decision_engine.py

  • Rôle : Agréger les signaux de l'ensemble des modèles pour émettre une décision consensuelle.
  • Analyse de l'implémentation :
    • HybridDecision (dataclass) encapsule clairement le résultat.
    • Le EnhancedDecisionEngine regroupe les prédictions et calcule un score de consensus pondéré (_calculate_consensus_score).
    • Intègre un _calculate_disagreement_factor qui pénalise le consensus si les modèles se contredisent trop.
  • Avis : L'approche de consensus pondéré avec pénalité de désaccord est la véritable force de ce système hybride.

src/adaptive_weight_manager.py

  • Rôle : Mettre à jour dynamiquement le poids de chaque modèle dans le consensus en fonction de son historique de performance.
  • Analyse de l'implémentation :
    • S'appuie sur une base de données SQLite (model_performance.db).
    • Réévalue les poids avec une logique de "decay" temporel (les prédictions récentes ont plus d'importance).
  • Avis : Très bonne gestion de la méta-apprentissage.

src/advanced_risk_manager.py

  • Rôle : Gestion globale du risque et calcul du dimensionnement de position (Position Sizing).
  • Analyse de l'implémentation :
    • Évalue le risque de volatilité (ATR), de drawdown, et de liquidité.
    • Implémente de manière standard et sécurisée le critère de Kelly pour définir la taille optimale de la transaction en pourcentage du capital.
    • Peut forcer un HOLD si le risque est jugé trop extrême malgré un signal d'achat.
  • Avis : Fichier critique, très bien structuré, qui assure que le système ne prend pas de positions dangereuses de manière aveugle.

2.5 Exécution et Suivi

src/t212_executor.py

  • Rôle : Interface avec l'API Trading 212 pour passer les ordres d'achat/vente réels (ou en démo).
  • Analyse de l'implémentation :
    • Bonne implémentation d'un système de verrouillage via _atomic_json_write et _read_with_retry pour portfolio_state.json.
    • Traduit intelligemment les tickers d'analyse (^NDX, CL=F) en tickers ETF concrets chez T212 (SXRV.DE, CRUDP.PA).
    • safe_request implémente des "retries" et gère le Rate Limiting (erreur 429).
  • Avis : Fichier très solide pour une mise en production "hobby". La distinction Demo/Live est propre.

src/database.py & src/performance_monitor.py

  • Rôle : Enregistrer les décisions, l'historique de trading et monitorer les performances.
  • Analyse de l'implémentation :
    • Base de données SQLite pour un monitoring asynchrone local.
    • Génère des alertes (check_alerts, process_alerts) en cas de fort Drawdown ou de série de pertes.
    • Intègre l'envoi potentiel d'un email en cas d'alerte critique.
  • Avis : Une couche de supervision mature qui complète parfaitement la gestion des risques.

2.6 Point d'entrée

main.py

  • Rôle : Orchestrer tout le pipeline (Acquisition -> Features -> Modèles -> Moteur de Décision -> Trading).
  • Analyse de l'implémentation :
    • check_setup() valide que Ollama et TimesFM sont disponibles avant de lancer l'analyse.
    • S'appuie fortement sur un fonctionnement par arguments CLI (argparse).
  • Avis : Orchestration linéaire et claire.

3. Conclusion Globale et Avis Final

L'architecture tri-modale hybride de ce système est impressionnante et très bien structurée. Le code reflète une maturité de développement logiciel évidente (Logging présent partout, Type Hints, Dataclasses, Singleton, Fallbacks réseaux, Cache).

Points forts :

  1. Séparation des préoccupations (SOLID) : L'acquisition de données, l'inférence des modèles et l'exécution des ordres sont bien découpés.
  2. Gestion fine du risque : L'implémentation de la logique de Kelly (Kelly Criterion), du drawdown et du désaccord entre les modèles (disagreement_factor) permet de pallier les hallucinations de l'IA.
  3. Résilience : Les mécanismes de tentatives (Retries) sur Yahoo Finance, le cache Parquet local, l'écriture atomique des fichiers JSON, et les requêtes T212 sécurisées avec attente prouvent que le système est conçu pour tourner sur la durée.
  4. Validation temporelle : Utilisation scrupuleuse de TimeSeriesSplit et des techniques de .ffill().bfill() sans fuite de données (data leakage).

Erreurs et incohérences détectées (Mineures) :

  1. TimesFM API : Dans timesfm_model.py, la confiance est calculée avec une règle de 3 fixe sur un rendement de 0.5% (ce qui pourrait être statique face à des marchés très volatiles).
  2. Gestion des modèles ML : Le re-calcul des features par create_technical_indicators dans la boucle d'exécution ne stocke pas directement le modèle sérialisé dans une base de données centralisée, mais seulement localement dans /data_cache/models. Cela ne poserait problème que dans un déploiement cloud multi-nœuds.
  3. Pas de stop-loss dynamique strict à l'ordre API : Les ordres passés via l'API Trading212 dans t212_executor.py sont de simples ordres MARKET. Il n'y a pas d'intégration pour poser un STOP_LIMIT ou TAKE_PROFIT directement chez le courtier (le système les évalue en boucle locale).

Avis sur chaque modèle de décision :

  • Scikit-Learn (Ensemble) : Très solide et bien conçu.
  • TimesFM (Google) : Bonne intégration en tant que "consultant" prédictif.
  • LLM Texte & Visuel (Gemma 4 12B (Unsloth) via Ollama) : Prompts complets, format de sortie robuste.
  • Sentiment & Hyperliquid : Complète bien l'approche contrarienne.

En résumé : Le projet est de haute qualité, il respecte ses objectifs "Système de Trading IA Hybride" et est techniquement prêt pour tourner en condition réelle sur les ETFs prévus.