Files
trader-ml/docs/RL_STRATEGY_GUIDE.md
Tika ff8d58e1aa Phase 4c-bis/4d : CNN Image vectorisé + Agent RL PPO + HMM persistence + scripts
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>
2026-03-10 22:40:52 +00:00

237 lines
8.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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
```bash
# 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"
}
```
```bash
# 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"
}
```
```bash
# 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 :
```bash
curl -X POST http://localhost:8100/trading/paper/start \
-H "Content-Type: application/json" \
-d '{"strategy": "rl_driven", "symbol": "EURUSD"}'
```
La stratégie `RLDrivenStrategy` :
1. Charge le dernier modèle entraîné pour le symbole/timeframe
2. À chaque barre, fournit les 20 dernières bougies à l'agent (`seq_len=20`)
3. Si la confiance de l'agent >= `min_confidence` (défaut: 0.55), émet un signal
4. 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.