CNN Image (Phase 4c-bis) :
- chart_renderer.py : renderer numpy vectorisé (boucle 64 bougies, pas 12 000 fenêtres)
→ 1 068 img/s, GIL libéré entre itérations, API réactive pendant l'entraînement
- cnn_image_strategy_model.py : torch.set_num_threads(4) pour préserver l'event loop
- trading.py : asyncio.create_task() au lieu de background_tasks → hot-reloads non-bloquants
Agent RL PPO (Phase 4d) :
- src/ml/rl/ : TradingEnv (gymnasium), PPOModel (Actor-Critic MLP, GAE), RLStrategyModel
- src/strategies/rl_driven/ : RLDrivenStrategy (interface BaseStrategy complète)
- Routes API : POST /train-rl, GET /train-rl/{job_id}, GET /rl-models
- docs/RL_STRATEGY_GUIDE.md : documentation complète
HMM Persistence :
- regime_detector.py : save()/load()/needs_retrain()/is_trained (joblib + JSON meta)
- trading.py /ml/status : charge depuis disque si < 24h, re-entraîne + sauvegarde sinon
→ premier appel ~2s, appels suivants < 100ms
Scripts utilitaires :
- scripts/compare_strategies.py : backtest comparatif toutes stratégies (tabulate/JSON)
- scripts/quick_benchmark.py : comparaison wf_accuracy/precision des modèles ML sauvegardés
- reports/ : répertoire pour les rapports JSON générés
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
8.1 KiB
RL Strategy Guide — Phase 4d (Reinforcement Learning)
Vue d'ensemble
La Phase 4d introduit une stratégie pilotée par un agent de Reinforcement Learning (RL)
basé sur l'algorithme PPO (Proximal Policy Optimization). Contrairement aux stratégies
supervisées (XGBoost, CNN) qui s'entraînent sur des labels pré-calculés, l'agent RL apprend
directement par interaction avec un environnement de trading simulé (TradingEnv), sans avoir
besoin d'annotations explicites LONG/SHORT/NEUTRAL.
Architecture
Composants (implémentés par l'agent ml/rl/)
src/ml/rl/
├── trading_env.py # TradingEnv (Gymnasium) — environnement de simulation
├── ppo_model.py # PPOModel — réseau Actor-Critic (MLP)
└── rl_strategy_model.py # RLStrategyModel — interface train/predict/save/load
Composants (cette phase)
src/strategies/rl_driven/
├── __init__.py # Export RLDrivenStrategy
└── rl_strategy.py # RLDrivenStrategy (hérite BaseStrategy)
Pipeline d'entraînement PPO
Données OHLCV
│
▼
TradingEnv (Gymnasium)
├── Observation space : fenêtre glissante seq_len=20 barres (OHLCV normalisé)
├── Action space : {0=HOLD/NEUTRAL, 1=LONG, 2=SHORT}
└── Reward : P&L réalisé − pénalité drawdown − pénalité over-trading
│
▼
PPO Actor-Critic (MLP)
├── Actor : policy π(a|s) → distribution sur les actions
└── Critic : value function V(s) → estimation de la récompense future
│
▼
Optimisation sur total_timesteps pas
│
▼
RLStrategyModel.save()
├── models/rl_strategy/EURUSD_1h.zip (politique PPO)
└── models/rl_strategy/EURUSD_1h_meta.json
Architecture Actor-Critic
L'agent PPO utilise un réseau MLP (Multi-Layer Perceptron) à deux têtes :
- Actor : prédit la distribution de probabilité sur les 3 actions (LONG/SHORT/NEUTRAL).
La confiance du signal correspond à
max(probas). - Critic : estime la valeur d'état V(s) pour calculer l'avantage (advantage) utilisé lors de la mise à jour de la politique.
Hyperparamètres PPO typiques :
| Paramètre | Valeur par défaut | Description |
|---|---|---|
gamma |
0.99 | Facteur d'actualisation des récompenses |
clip_range |
0.2 | Clipping ratio PPO (stabilité) |
n_steps |
2048 | Nombre de pas par rollout |
batch_size |
64 | Taille des mini-batches SGD |
n_epochs |
10 | Passes sur chaque rollout |
ent_coef |
0.01 | Coefficient d'entropie (exploration) |
Lancer l'entraînement
Via curl
# Lancer l'entraînement (tâche de fond)
curl -X POST http://localhost:8100/trading/train-rl \
-H "Content-Type: application/json" \
-d '{
"symbol": "EURUSD",
"timeframe": "1h",
"period": "2y",
"total_timesteps": 50000
}'
# Réponse
{
"job_id": "a1b2c3d4-...",
"status": "pending",
"symbol": "EURUSD",
"timeframe": "1h"
}
# Suivre l'avancement
curl http://localhost:8100/trading/train-rl/a1b2c3d4-...
# Réponse quand terminé
{
"job_id": "a1b2c3d4-...",
"status": "completed",
"symbol": "EURUSD",
"timeframe": "1h",
"avg_reward": 0.042,
"sharpe_env": 1.23,
"total_timesteps": 50000,
"trained_at": "2026-03-10T14:32:00"
}
# Lister les modèles disponibles
curl http://localhost:8100/trading/rl-models
# Réponse
{
"models": [
{
"symbol": "EURUSD",
"timeframe": "1h",
"avg_reward": 0.042,
"sharpe_env": 1.23,
"total_timesteps": 50000,
"trained_at": "2026-03-10T14:32:00"
}
],
"count": 1
}
Paramètres de la requête
| Champ | Type | Défaut | Description |
|---|---|---|---|
symbol |
str | EURUSD | Paire de trading (ex: EURUSD, BTCUSDT) |
timeframe |
str | 1h | Timeframe (1m, 5m, 15m, 1h, 4h, 1d) |
period |
str | 2y | Historique d'entraînement (ex: 6m, 1y, 2y) |
total_timesteps |
int | 50000 | Nombre total de pas de simulation PPO |
Recommandations total_timesteps :
- 20 000 : entraînement rapide (test, ~5 min CPU)
- 50 000 : entraînement standard (défaut, ~15 min CPU)
- 200 000 : entraînement long, meilleure convergence (~1h CPU)
- 1 000 000 : entraînement poussé si GPU disponible
Interpréter les métriques
avg_reward
Récompense moyenne par pas de simulation sur les derniers rollouts d'évaluation.
- < 0 : l'agent perd de l'argent en simulation → entraîner plus longtemps ou revoir la fonction de récompense
- 0 à 0.02 : agent neutre, légèrement profitable
- > 0.05 : bon signal → tester en backtest réel
- > 0.1 : excellent (attention au sur-apprentissage, vérifier out-of-sample)
sharpe_env
Ratio de Sharpe calculé sur les épisodes de simulation (récompenses / écart-type des récompenses).
- < 0.5 : insuffisant pour paper trading
- 0.5 – 1.0 : acceptable, à valider en backtest
- > 1.5 : cible pour activation paper trading (conforme aux seuils du projet)
Interprétation combinée
avg_reward |
sharpe_env |
Interprétation |
|---|---|---|
| négatif | quelconque | Agent non convergé — relancer avec plus de timesteps |
| 0 – 0.02 | < 1.0 | Apprentissage partiel — augmenter total_timesteps |
| > 0.03 | > 1.0 | Bon candidat — valider via POST /trading/backtest |
| > 0.05 | > 1.5 | Prêt pour paper trading (30 jours minimum) |
Intégration avec le paper trading
Après l'entraînement, si un paper trading avec la stratégie rl_driven est actif,
le modèle est automatiquement attaché sans redémarrage.
Pour démarrer un paper trading RL :
curl -X POST http://localhost:8100/trading/paper/start \
-H "Content-Type: application/json" \
-d '{"strategy": "rl_driven", "symbol": "EURUSD"}'
La stratégie RLDrivenStrategy :
- Charge le dernier modèle entraîné pour le symbole/timeframe
- À chaque barre, fournit les 20 dernières bougies à l'agent (
seq_len=20) - Si la confiance de l'agent >=
min_confidence(défaut: 0.55), émet un signal - SL =
sl_atr_mult × ATR(défaut: 1×ATR), TP =tp_atr_mult × ATR(défaut: 2×ATR)
Notes techniques
Threads PyTorch
L'entraînement fixe torch.set_num_threads(4) pour éviter la contention CPU dans
le container Docker. Adapter dans docker-compose.yml si le container dispose de plus de cœurs.
Sauvegarde des modèles
Les modèles sont sauvegardés dans models/rl_strategy/ (volume Docker monté) :
EURUSD_1h.zip: politique PPO (format stable-baselines3)EURUSD_1h_meta.json: métadonnées (métriques, hyperparamètres, date)
Import conditionnel
Le flag RL_AVAILABLE est False si PyTorch ou stable-baselines3 ne sont pas
installés. La stratégie dégrade gracieusement (aucun signal, aucune exception).
Pour activer : ajouter stable-baselines3 et gymnasium dans docker/requirements/api.txt
puis reconstruire le container (docker compose build --no-cache trading-api).
Seuils de validation (conforme au projet)
Avant activation du live trading, la stratégie RL doit satisfaire :
| Métrique | Seuil minimum |
|---|---|
| Sharpe Ratio | ≥ 1.5 |
| Max Drawdown | ≤ 10% |
| Win Rate | ≥ 55% |
| Paper Trading | ≥ 30 jours |
Ces seuils s'appliquent au backtest out-of-sample et au paper trading, pas
aux métriques de simulation RL (sharpe_env) qui sont indicatives uniquement.