L'antidote aux momentum crashes : RSI Oversold Bounce, Pairs Trading statistique, et Bollinger Band Reversion. Stratégies décorrélées pour stabiliser le portefeuille en marchés latéraux.
Le momentum dit : "ce qui monte continuera de monter" (horizon 1-12 mois). La mean-reversion dit : "ce qui baisse trop fort rebondira" (horizon 1-10 jours). Les deux sont vrais simultanément mais sur des horizons différents. Cette complémentarité est la clé d'un portefeuille résilient.
| Horizon | Autocorrélation | Stratégie dominante | Sharpe typique |
|---|---|---|---|
| 1-5 jours | Négative (-0.05 à -0.10) | Mean Reversion | 0.6-1.0 |
| 1-4 semaines | ~Zéro | Neutre / PEAD | — |
| 1-12 mois | Positive (+0.05 à +0.15) | Momentum | 0.8-1.5 |
| 3-5 ans | Négative (-0.10 à -0.20) | Value / Long-term MR | 0.4-0.7 |
La stratégie la plus simple et la plus robuste en mean-reversion : acheter les actions fondamentalement saines quand leur RSI tombe en zone de survente extrême, en anticipant un rebond technique.
claude -p "Implémente RSIBounceStrategy dans strategies/rsi_bounce.py :
class RSIBounceStrategy(BaseStrategy):
'''RSI Oversold Bounce — Buy panic, sell recovery.
Signal d'entrée (tous les critères doivent être vrais):
1. RSI(14) < 25 (survente extrême — plus strict que le classique 30)
2. Prix > EMA(200) (la tendance long-terme est toujours haussière)
3. Volume du jour > 1.5× volume moyen 20j (capitulation/panique)
4. L'action est dans un indice majeur (S&P 500, STOXX 600, Nikkei 225)
→ filtre qualité implicite, pas de penny stocks
5. Pas d'earnings dans les 5 prochains jours
6. RSI n'est pas resté < 30 pendant plus de 10 jours consécutifs
→ évite les falling knives (tendance baissière structurelle)
Entrée:
- Acheter à l'ouverture du lendemain (le signal se forme sur close)
- Limit order à 0.5% sous l'ouverture (capturer un peu de slippage positif)
Sortie:
- Take profit: RSI > 50 OU +8% depuis l'entrée (premier atteint)
- Stop loss: -4% depuis l'entrée (la survente n'a pas rebondi)
- Time stop: 10 jours max (si ni TP ni SL atteint, sortir)
Sizing: 2-3% du NAV par position (petit car le hit rate est ~58%)
Max positions simultanées: 6
'''
def scan(self, date) -> list[Signal]:
'''Scanne l'univers pour les signaux RSI oversold.
Retourne les signaux triés par RSI croissant (le plus oversold en premier).
'''
def generate_orders(self, signals: list[Signal]) -> list[Order]:
'''Génère les ordres d'achat pour les top-N signaux.
Respecte la limite de 6 positions simultanées.
'''
"
| Métrique | RSI Bounce |
|---|---|
| CAGR | 14.2% |
| Sharpe | 0.85 |
| Max DD | -12.8% |
| Win Rate | 58% |
| Avg Win / Avg Loss | 1.6 |
| Trades / an | ~80 |
| Avg holding | 5.2 jours |
| Profit Factor | 2.2 |
| Corrélation avec CSM | -0.15 |
La corrélation de -0.15 avec CSM est le point crucial. Quand le momentum souffre (les gagnants plongent), c'est exactement le moment où la mean-reversion prospère (les surventes rebondissent). Cette anti-corrélation naturelle réduit le drawdown combiné de manière disproportionnée.
Le pairs trading exploite les relations stables entre deux actifs. Quand deux actions historiquement corrélées divergent temporairement, on achète celle qui a baissé et on vend celle qui a monté, en pariant sur la convergence. En long-only, on achète uniquement la paire sous-évaluée.
Corrélation : les rendements bougent dans la même direction (peut être transitoire).
Cointegration : le spread entre les deux prix est stationnaire (revient toujours à la moyenne). Deux actions peuvent être cointégrées même si leur corrélation baisse temporairement. C'est une propriété plus stable et plus exploitable.
Test standard : Engle-Granger (ADF sur le résidu de la régression linéaire) ou Johansen (plus robuste pour multi-paires).
claude -p "Implémente PairsTradingStrategy dans strategies/pairs.py :
from statsmodels.tsa.stattools import coint, adfuller
from sklearn.linear_model import LinearRegression
class PairsTradingStrategy(BaseStrategy):
'''Pairs Trading long-only via cointegration.
Phase 1 — Identification des paires (mensuel):
1. Pré-filtrer par secteur (même GICS level 2)
2. Pour chaque combinaison (C(N,2)):
a. Test de cointegration Engle-Granger: p-value < 0.05
b. Half-life du spread: entre 3 et 30 jours
c. Hurst exponent < 0.4 (mean-reverting)
3. Sélectionner les top 20 paires par score composite:
score = (1 - p_value) × (1 / half_life) × (0.5 - hurst)
Paires typiques (exemples):
- Coca-Cola (KO) / PepsiCo (PEP) — Beverages
- Visa (V) / Mastercard (MA) — Payments
- Home Depot (HD) / Lowes (LOW) — Home Improvement
- ASML / Applied Materials (AMAT) — Semis equipment
- Toyota (7203.T) / Honda (7267.T) — Auto Japan
Phase 2 — Trading (quotidien):
1. Pour chaque paire active:
a. Calculer le z-score du spread: z = (spread - mean) / std
b. Si z < -2.0: acheter l'action sous-évaluée (celle qui a baissé)
c. Si z > +0.0: fermer la position (spread revenu à la moyenne)
d. Stop loss: z < -3.5 (le spread continue de diverger)
2. En long-only: on achète UNIQUEMENT l'action sous-évaluée
(pas de short sur l'autre, mais on utilise le spread comme signal)
Sizing: 2% du NAV par paire (petit car trading fréquent)
Max paires simultanées: 10
Rebalancement des paires: mensuel
'''
def find_pairs(self, date) -> list[Pair]:
'''Identifie les paires cointégrées dans l'univers.'''
def calculate_zscore(self, pair: Pair, window: int = 60) -> float:
'''Calcule le z-score du spread pour une paire.'''
"
| Métrique | Pairs Trading |
|---|---|
| CAGR | 11.5% |
| Sharpe | 0.75 |
| Max DD | -10.2% |
| Win Rate | 62% |
| Avg Win / Avg Loss | 1.3 |
| Trades / an | ~120 |
| Avg holding | 8.5 jours |
| Corrélation avec CSM | -0.08 |
| Corrélation avec RSI | +0.25 |
Le pairs trading a le Sharpe le plus modeste de nos stratégies mais aussi le drawdown le plus faible (-10.2%). Son rôle n'est pas de générer de l'alpha massif mais de stabiliser le portefeuille — c'est l'amortisseur.
La Bollinger Reversion est une variante de la mean-reversion qui utilise les bandes de Bollinger (μ ± 2σ) comme signal. Elle est en réserve (phase PAPER) et sera promue si RSI Bounce ou Pairs Trading sous-performent.
claude -p "Implémente BollingerReversionStrategy dans strategies/bollinger_mr.py :
class BollingerReversionStrategy(BaseStrategy):
'''Bollinger Band Mean Reversion — Stratégie de réserve.
Signal d'entrée:
1. Prix touche ou perce la bande inférieure (close < BB_lower(20,2))
2. Bandwidth > percentile 50% (volatilité suffisante pour un retour)
3. %B < 0 (prix sous la bande inférieure)
4. Volume > 1.2× moyenne (confirmation de participation)
Sortie:
- TP: prix touche la BB médiane (EMA20)
- SL: -3% sous l'entrée OU prix reste sous BB_lower pendant 5 jours
- Time stop: 8 jours
Univers: S&P 500 + STOXX 600 (large-caps uniquement)
Sizing: 2% du NAV par position
Max positions: 8
Statut: PAPER (en observation)
Promotion vers PILOT si: Sharpe paper > 0.5 après 30 jours
'''
"
| Métrique | Bollinger MR |
|---|---|
| CAGR | 12.8% |
| Sharpe | 0.72 |
| Max DD | -14.5% |
| Win Rate | 55% |
| Corrélation avec RSI Bounce | +0.45 |
La corrélation de +0.45 avec RSI Bounce est attendue (les deux exploitent la survente). C'est pourquoi elle est en réserve : promouvoir les deux simultanément diluerait la diversification.
| Métrique | 4 Momentum | 4 Mom + 2 MR | Amélioration |
|---|---|---|---|
| CAGR | 32.8% | 35.2% | +2.4% |
| Sharpe | 1.62 | 1.85 | +0.23 |
| Max DD | -15.8% | -12.5% | 3.3% mieux |
| Calmar | 2.08 | 2.82 | +0.74 |
| Worst Month | -8.2% | -5.8% | 2.4% mieux |
| % mois positifs | 67% | 72% | +5% |
L'ajout de mean-reversion n'augmente le CAGR que modestement (+2.4%) mais réduit le Max DD de 15.8% à 12.5% — une amélioration du Calmar de 36%. C'est la leçon fondamentale de la construction de portefeuille : les stratégies décorrélées améliorent le risk-adjusted return même si leur rendement individuel est inférieur.
Notre portefeuille de 6 stratégies a maintenant un Sharpe de 1.85 et un Max DD de -12.5%. On est largement sous la contrainte de -25%, ce qui donne une marge de sécurité confortable pour des surprises (COVID-like).
| Régime | Momentum (4 strat) | Mean Reversion (2 strat) | Cash | Raison |
|---|---|---|---|---|
| 🟢 Risk-On | 65% | 15% | 5% | Momentum dominant, MR en complément |
| 🟡 Neutral | 45% | 25% | 15% | Incertitude → équilibre, plus de cash |
| 🟠 Early Risk-Off | 25% | 35% | 25% | MR profite de la volatilité + rebonds |
| 🔴 Risk-Off | 10% | 30% | 40% | Minimum momentum, MR + cash défensif |
| 🔵 Recovery | 45% | 30% | 10% | MR sur les rebonds, momentum reprend |
claude -p "Ajoute la logique régime-dépendante dans portfolio/meta_allocator.py :
# Dans MetaAllocator.daily_rebalance():
REGIME_WEIGHTS = {
'RiskOn': {'momentum': 0.65, 'mean_reversion': 0.15, 'cross_asset': 0.15, 'cash': 0.05},
'Neutral': {'momentum': 0.45, 'mean_reversion': 0.25, 'cross_asset': 0.15, 'cash': 0.15},
'EarlyRiskOff': {'momentum': 0.25, 'mean_reversion': 0.35, 'cross_asset': 0.15, 'cash': 0.25},
'RiskOff': {'momentum': 0.10, 'mean_reversion': 0.30, 'cross_asset': 0.20, 'cash': 0.40},
'Recovery': {'momentum': 0.45, 'mean_reversion': 0.30, 'cross_asset': 0.15, 'cash': 0.10},
}
# Le méta-allocateur utilise ces weights comme PLAFONDS par catégorie.
# À l'intérieur de chaque catégorie, les poids individuels sont déterminés
# par Kelly × HRP × confiance (comme défini en Partie 4).
# Exemple en RiskOff: momentum_budget = 10% du NAV, réparti entre CSM/TSMOM/PEAD/Rotation
# selon leurs Sharpe et confiance respectifs.
"
L'intégration de nouvelles stratégies au méta-allocateur est un processus standardisé :
claude -p "Intègre RSIBounceStrategy au méta-allocateur:
1. Enregistrer dans strategies/registry.py avec catégorie='mean_reversion'
2. Ajouter les métriques initiales dans config/strategy_defaults.yaml
3. Configurer le lifecycle: phase=PILOT, allocation=2%, durée_min=30j
4. Ajouter les tests: test_integration_rsi_bounce.py
5. Mettre à jour le dashboard Discord avec les métriques RSI Bounce
6. Documenter dans docs/strategies/rsi_bounce.md"
Ce prompt suffit pour que Claude Code génère tous les fichiers nécessaires. Le pattern est identique pour chaque nouvelle stratégie, ce qui rend le système extensible sans friction.
Nos 6 stratégies (4 momentum + 2 mean-reversion) opèrent principalement sur des actions individuelles. La Partie 8 ajoute les stratégies cross-asset — Dual Momentum ETF et Sector Rotation — qui opèrent à un niveau macro, complétant le tableau pour un portefeuille véritablement résilient.