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.
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.
- 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^VIXsimultané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.
- 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_atrest correctement implémentée (True Range classique).
- Calcule des indicateurs standards (MA, EMA, RSI, MACD, Bollinger, ATR) en utilisant numpy/pandas de façon vectorisée (pas de
- Avis : L'ingénierie des caractéristiques est performante et s'appuie sur de bonnes pratiques Pandas (vectorisation).
- 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 lesNaNen tenant compte des séries temporelles.
- Modèle d'ensemble qui sélectionne l'algorithme le plus performant dynamiquement en utilisant
- Avis : Approche robuste et pertinente. L'utilisation de
TimeSeriesSplitest essentielle pour ne pas polluer l'entraînement avec des données du futur.
- 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.
- Fonctionne sous forme de Singleton (
- 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.
- 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_Ksurlocalhost:11434. construct_llm_promptagrè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_decisionencode une image en Base64 et demande explicitement une analyse chartiste au modèle visuel.
- Modèle ciblé :
- Avis : La structure des prompts est claire et exhaustive. L'utilisation d'un format JSON strict (
{"decision": "...", "confidence": ..., "reason": "..."}) facilite le parsing ultérieur.
- Rôle : Acquisition des news (Alpha Vantage) et conversion en signaux.
- Analyse de l'implémentation :
sentiment_analysis.pyconvertit un score de sentiment en un signal d'achat (> 0.15), de vente (< -0.15) ou de maintien.news_fetcher.pygè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.
- 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
EnhancedDecisionEngineregroupe les prédictions et calcule un score de consensus pondéré (_calculate_consensus_score). - Intègre un
_calculate_disagreement_factorqui 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.
- 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).
- S'appuie sur une base de données SQLite (
- Avis : Très bonne gestion de la méta-apprentissage.
- 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
HOLDsi 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.
- 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_writeet_read_with_retrypourportfolio_state.json. - Traduit intelligemment les tickers d'analyse (
^NDX,CL=F) en tickers ETF concrets chez T212 (SXRV.DE,CRUDP.PA). safe_requestimplémente des "retries" et gère le Rate Limiting (erreur 429).
- Bonne implémentation d'un système de verrouillage via
- Avis : Fichier très solide pour une mise en production "hobby". La distinction Demo/Live est propre.
- 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.
- 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.
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).
- 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.
- 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. - 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.
- Validation temporelle : Utilisation scrupuleuse de
TimeSeriesSplitet des techniques de.ffill().bfill()sans fuite de données (data leakage).
- 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). - Gestion des modèles ML : Le re-calcul des features par
create_technical_indicatorsdans 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. - Pas de stop-loss dynamique strict à l'ordre API : Les ordres passés via l'API Trading212 dans
t212_executor.pysont de simples ordresMARKET. Il n'y a pas d'intégration pour poser unSTOP_LIMITouTAKE_PROFITdirectement chez le courtier (le système les évalue en boucle locale).
- 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.