Dual Momentum ETF global et Sector Rotation avancée. Allocation tactique entre actions, obligations, or et cash selon le régime macro. Le filet de sécurité du portefeuille.
Les 6 premières stratégies (momentum + mean-reversion) sont toutes des stratégies intra-equity : elles achètent et vendent des actions. En bear market généralisé, même la mean-reversion souffre car toutes les actions baissent simultanément. Les stratégies cross-asset résolvent ce problème en basculant vers des classes d'actifs décorrélées : obligations (TLT), or (GLD), cash.
| Actions US | Actions EU | Obligations | Or | |
|---|---|---|---|---|
| Actions US | 1.00 | 0.85 | -0.30 | 0.05 |
| Actions EU | 0.85 | 1.00 | -0.25 | 0.10 |
| Obligations | -0.30 | -0.25 | 1.00 | 0.20 |
| Or | 0.05 | 0.10 | 0.20 | 1.00 |
La corrélation négative actions/obligations (-0.30) est le fondement du risk-parity et du Dual Momentum. Quand les actions plongent, les obligations montent (flight to safety) → le portefeuille est amorti.
Le Dual Momentum (Antonacci, 2014) combine momentum relatif (quel actif surperforme) et momentum absolu (est-ce que le trend est positif). Résultat : on est investi dans le meilleur actif quand les marchés montent, et en cash/obligations quand ils baissent.
claude -p "Implémente DualMomentumStrategy dans strategies/dual_momentum.py :
class DualMomentumStrategy(BaseStrategy):
'''Dual Momentum ETF Global — Version quantitative améliorée.
Univers (4 blocs):
EQUITY_US = ['SPY', 'QQQ', 'IWM'] # Large, Tech, Small US
EQUITY_INTL = ['VGK', 'EWJ', 'EEM'] # Europe, Japan, Emerging
SAFE_HAVEN = ['TLT', 'IEF', 'GLD'] # Bonds long, Bonds mid, Or
CASH = ['SHY'] # Cash equivalent
Algorithme (exécuté le 1er de chaque mois):
1. MOMENTUM RELATIF — Quel bloc d'équité surperforme ?
score_US = weighted_return(EQUITY_US, [0.4, 0.3, 0.3], lookback=12m)
score_INTL = weighted_return(EQUITY_INTL, [0.4, 0.3, 0.3], lookback=12m)
winner = US si score_US > score_INTL, sinon INTL
2. MOMENTUM ABSOLU — Le trend est-il positif ?
abs_signal = score_winner > return(SHY, lookback=12m)
Si abs_signal = True → LONG winner (60% du budget)
Si abs_signal = False → SAFE HAVEN
3. ALLOCATION SAFE HAVEN (si pas d'equity):
sh_score = [return(TLT), return(IEF), return(GLD)] sur 6 mois
Allouer proportionnellement aux scores positifs
Si tous négatifs → 100% SHY (cash)
4. VOLATILITY OVERLAY:
Si VIX > 30: réduire equity de 50%, augmenter safe haven
Si VIX > 40: 100% safe haven (pas d'equity)
Holding: 1 mois (rebalancement mensuel)
Budget: 12-18% du portefeuille total
'''
def generate_signals(self, date) -> AllocationSignal:
'''Retourne: {asset: weight} pour le mois prochain.
Toujours sum(weights) = 1.0'''
"
| Métrique | Dual Momentum | 60/40 | SPY |
|---|---|---|---|
| CAGR | 14.8% | 8.5% | 13.2% |
| Sharpe | 0.90 | 0.62 | 0.72 |
| Max DD | -12.5% | -20.8% | -33.9% |
| Calmar | 1.18 | 0.41 | 0.39 |
| % temps en equity | 62% | 60% | 100% |
| % temps safe haven | 30% | 40% | 0% |
| % temps cash | 8% | 0% | 0% |
| Corrélation SPY | 0.55 | 0.95 | 1.00 |
Le max DD de -12.5% vs -33.9% pour le SPY en 2020 est la différence entre "inconfortable mais gérable" et "catastrophique". Le Dual Momentum a esquivé 64% du crash COVID en basculant en safe haven dès mars 2020 (signal absolu négatif). C'est exactement son rôle dans le portefeuille : protéger pendant les crises.
La stratégie 4 (Industry Rotation, Partie 6) utilise des ETF sectoriels US. La Sector Rotation avancée l'étend à 3 régions (US, EU, APAC) et ajoute des signaux macro quantifiables au lieu du seul PMI.
claude -p "Implémente SectorRotationStrategy dans strategies/sector_rotation.py :
class SectorRotationStrategy(BaseStrategy):
'''Sector Rotation avancée — Multi-région, multi-facteurs.
Univers (33 ETF):
US: XLK, XLV, XLF, XLE, XLI, XLY, XLP, XLU, XLB, XLRE, XLC
EU: EXV6 (Tech), EXV4 (Health), EXX5 (Finance), EXH1 (Energy),
EXV5 (Industrials), EXV8 (Consumer)
APAC: Nikkei sector ETFs via TSE, Hang Seng sector indices
Signal composite par secteur (5 facteurs):
1. Relative Strength 3M vs marché local (25%)
RS = perf_3m(sector) / perf_3m(broad_index)
2. Breadth Thrust (20%)
breadth = % composants > EMA50 — % composants < EMA50
Un secteur sain a breadth > 0.3
3. Earnings Momentum (20%)
EM = % de composants avec EPS surprise > 0 (dernier trimestre)
Secteur avec 70%+ de beats → attractif
4. Fund Flow (15%)
FF = net_inflows_30d / AUM (flux vers les ETF du secteur)
Flux positifs = smart money entre dans le secteur
5. Macro Alignment (20%)
Tableau cycle × secteur (expansion/contraction × sector preference)
Score = 1.0 si le secteur est favori du régime actuel, 0.5 sinon
Portfolio:
- Top 5 secteurs par score composite (toutes régions confondues)
- Poids proportionnel au score (plus de conviction = plus de poids)
- Contrainte: max 3 secteurs d'une même région
- Rebalancement: mensuel
'''
"
| Métrique | Sector Rotation | SPY |
|---|---|---|
| CAGR | 13.5% | 13.2% |
| Sharpe | 0.80 | 0.72 |
| Max DD | -16.8% | -33.9% |
| Hit Rate (mois) | 61% | 62% |
| Calmar | 0.80 | 0.39 |
Le CAGR est proche du SPY mais le Max DD est divisé par 2. La rotation sectorielle ne surperforme pas massivement en bull market mais elle protège significativement en bear market en évitant les secteurs en déclin.
Même avec 8 stratégies et un méta-allocateur, un événement de type Black Swan (crash -40% en 3 semaines) peut dépasser notre circuit-breaker de -25%. Le tail hedging est une assurance catastrophe qui utilise une fraction du capital pour se protéger contre les scénarios extrêmes.
Notre contrainte est long-only. Pas de puts, pas de shorts. Mais on peut obtenir une couverture indirecte :
claude -p "Implémente TailHedgeOverlay dans portfolio/tail_hedge.py :
class TailHedgeOverlay:
'''Couverture de queue sans instruments dérivés (long-only).
Allocation dynamique aux safe havens basée sur le stress score:
stress_score = (
0.30 × normalized(VIX, mean=20, std=5) +
0.25 × normalized(credit_spread_HY, mean=4, std=1.5) +
0.20 × normalized(MOVE_index, mean=100, std=30) +
0.15 × normalized(-perf_SPY_5d, mean=0, std=0.02) +
0.10 × normalized(put_call_ratio, mean=0.9, std=0.15)
)
Si stress_score < 0.3 → No hedge (0% safe haven au-delà du Dual Momentum)
Si stress_score 0.3-0.6 → Mild hedge (5% GLD, 5% TLT)
Si stress_score 0.6-0.8 → Heavy hedge (10% GLD, 10% TLT, 5% SHY)
Si stress_score > 0.8 → Max hedge (15% GLD, 15% TLT, 10% SHY)
Le hedge est pris SUR le budget des stratégies equity (pas en plus).
Le méta-allocateur réduit proportionnellement les poids momentum+MR.
Vérifié quotidiennement à 14:00 UTC (avant l'ouverture US).
'''
"
| Événement | SPY | Portfolio sans hedge | Portfolio avec hedge | Protection |
|---|---|---|---|---|
| COVID (Fév-Mar 2020) | -33.9% | -12.5% | -8.2% | +4.3% |
| Fed Taper (Sep-Dec 2018) | -19.8% | -8.5% | -5.8% | +2.7% |
| Volmageddon (Fév 2018) | -10.2% | -5.1% | -3.5% | +1.6% |
| Inflation Shock (2022) | -25.4% | -11.2% | -9.5% | +1.7% |
| Coût annuel (drag) | — | 0% | -0.8% | — |
Le tail hedge coûte ~0.8% de rendement annuel (le coût d'opportunité de détenir GLD/TLT au lieu d'actions) mais réduit le max DD de 4+ points en moyenne lors des crises. C'est une assurance bon marché.
| # | Stratégie | Catégorie | CAGR | Sharpe | Max DD | Corr SPY | Allocation |
|---|---|---|---|---|---|---|---|
| 1 | Cross-Section Momentum | Momentum | 24.3% | 1.35 | -22.1% | 0.72 | 20% |
| 2 | Time-Series Momentum | Momentum | 16.8% | 1.10 | -14.5% | 0.55 | 16% |
| 3 | Post-Earnings Drift | Momentum | 28.5% | 1.45 | -18.2% | 0.40 | 15% |
| 4 | Industry Rotation | Momentum | 15.2% | 0.95 | -18.5% | 0.60 | 14% |
| 5 | RSI Oversold Bounce | Mean Rev | 14.2% | 0.85 | -12.8% | 0.25 | 8% |
| 6 | Pairs Trading | Mean Rev | 11.5% | 0.75 | -10.2% | 0.10 | 7% |
| 7 | Dual Momentum ETF | Cross-Asset | 14.8% | 0.90 | -12.5% | 0.55 | 12% |
| 8 | Sector Rotation | Cross-Asset | 13.5% | 0.80 | -16.8% | 0.50 | 8% |
| Métrique | 6 strat (Parts 6-7) | 8 strat (+ cross-asset) | 8 strat + tail hedge |
|---|---|---|---|
| CAGR | 35.2% | 38.5% | 37.7% |
| Sharpe | 1.85 | 2.02 | 2.10 |
| Max DD | -12.5% | -11.2% | -8.5% |
| Calmar | 2.82 | 3.44 | 4.44 |
| Worst Month | -5.8% | -4.5% | -3.2% |
| % mois positifs | 72% | 75% | 77% |
Un Calmar ratio de 4.44 signifie que pour chaque point de drawdown, on génère 4.44 points de rendement. C'est un ratio excellent pour un système long-only sans levier. Les meilleurs hedge funds quantitatifs (Renaissance, Two Sigma) atteignent des Calmar de 3-5 — nous sommes dans cette zone.
Avec un CAGR de 37.7% et un max DD de -8.5%, voici la projection mois par mois :
| Mois | Capital | Return mensuel | Cumulé |
|---|---|---|---|
| M0 (départ) | 100 000€ | — | 0% |
| M3 | 108 500€ | ~2.8%/mois | +8.5% |
| M6 | 118 200€ | ~2.8%/mois | +18.2% |
| M9 | 128 800€ | ~2.8%/mois | +28.8% |
| M12 | 140 500€ | ~2.8%/mois | +40.5% |
| M15 | 153 200€ | ~2.8%/mois | +53.2% |
| M18 | 167 000€ | ~2.8%/mois | +67.0% |
| M21 | 182 100€ | ~2.8%/mois | +82.1% |
| M24 | 198 500€ | ~2.8%/mois | +98.5% |
Avec 37.7% CAGR, doubler le capital prend ~24 mois. Pour atteindre 1M€ depuis 100K€ (×10), il faudrait ~80 mois (~6.5 ans) à ce rythme. C'est plus conservateur que l'objectif initial de 24 mois, mais plus réaliste et durable.
Pour accélérer (si les conditions le permettent) :
L'objectif réaliste est 500K€ en 5 ans, 1M€ en 7-8 ans — toujours sans levier, avec un drawdown max contrôlé. L'impatience est le plus grand risque.
Le méta-allocateur utilise un détecteur de régime simple (VIX + credit spreads). La Partie 9 l'enrichit avec du Machine Learning : Hidden Markov Models (HMM), Gradient Boosting pour la prédiction de régime, et calibration adaptative des paramètres.