Audit risk-management de la Sigma Winning Strategy
Auteur : risk-manager · Date : 2026-05-14 · Périmètre : src/lib/winning-strategy.ts, src/lib/backtest-compute.ts, src/lib/signals.ts, prose /methodologie
TL;DR
- L'edge est probablement réel mais la photographie du risque est partielle. Sharpe 1.00 et MaxDD −12 % affichés sont calculés sur 4 années post-COVID (1 bull + 1 baissier modéré), sans aucun scénario 2008/2011/mars-2020. Le
STRATEGY_PROOFest hard-codé dans le code (ligne 281,winning-strategy.ts) et ne capture ni l'asymétrie des distributions ni le time-under-water. - Concentration cachée massive. Equal-weight sur ~25 à 118 signaux/an (voir
sampleSizepar année), mais dedup par société (ligne 165) plus un univers mid-cap FR de 200 M€–1 B€ = univers cible <300 noms. Sur certains trimestres creux le portefeuille peut tomber à 3–8 noms, soit 12 % à 33 % par nom, et le secteur biotech/small-tech FR domine structurellement cet univers. - Aucun garde-fou tail. Pas de stop-loss, pas de cap par nom, pas de cap sectoriel, pas de vol-targeting, pas de hedge index. Une seule small-cap biotech FR qui rate sa Phase III peut faire −80 % et déchirer le trimestre.
- Modèle de coûts naïf. 1 % de frais forfaitaire sur des mid-caps Euronext compartiments B/C signifie ignorer le spread (50–150 bps fréquents), le market-impact sur une position equal-weight de 5–10 % au rebalance, et la liquidité sortante dégradée en stress.
- Look-ahead potentiel à valider. Le track-record insider (
buildInsiderTrackRecordIndex) filtrepubDate < currentPubDate, mais leglobalMeanest calculé sur tout l'historique, ce qui injecte une moyenne future dans la shrinkage Bayésienne des trades anciens. Biais faible mais à corriger pour un backtest publié.
1. Exposures cachées
1.1 Concentration par nom
| Métrique | Valeur estimée | Risque |
|---|---|---|
| Signaux/an moyens | 62 (35+25+71+118)/4 | OK en agrégé |
| Signaux/trimestre médian | ~15 | OK |
| Signaux/trimestre creux (worst-case, ex. Q3 2022) | 3–8 estimés | Poids unitaire 12–33 % |
Après dedup-by-company (ligne 165 winning-strategy.ts) |
Réduction 20–40 % | Aggrave la concentration |
Pas de plafond par nom dans le code actuel. La rotation T+90 equal-weight redistribue à chaque trimestre, mais à l'intérieur du trimestre une catastrophe single-name est intégralement absorbée.
1.2 Concentration sectorielle
L'univers mid-cap FR 200 M€–1 B€ filtré sur AMF/Euronext est structurellement biaisé :
- Biotech / MedTech : Genfit, Nanobiotix, Lysogene, Erytech, Pharmnext, Valneva, DBV… historiquement 25–35 % des dirigeants-acheteurs sur ce bucket (les fondateurs achètent sur les retracements binaires).
- Small-cap tech / SaaS FR : Esker, Lectra, Soitec (en bordure), Trigano, Wavestone… ~20 %.
- Foncières / immo coté (mid-cap français) : ~10 %, sensibles aux taux.
- Industrials cycliques : Akwel, Plastic Omnium, Lisi, Manitou… ~15 %, β > 1.2 sur le CAC.
Aucune mesure de tilt sectoriel n'est calculée dans backtest-compute.ts (le bySize/byRole/byScore existe, mais pas bySector). Le sectorTag existe en DB (Company.sectorTag) mais n'est pas remonté dans la stratégie ni dans le scoring.
Conséquence : un drawdown biotech-FR coordonné (ex. trimestre Aduhelm-style sur l'ensemble du compartiment Alzheimer/oncologie) peut taper 40–60 % du portefeuille simultanément.
1.3 Liquidité
- Mid-caps Euronext Compartiment B/C : ADV typique 200 k€–2 M€/jour.
- Hypothèse equal-weight sur 15–20 noms ⇒ ticket par nom de 5 000 € à 50 000 € pour un retail (OK) mais inopérable au-delà de 200 k€ AUM par signal sans market-impact significatif.
- Hypothèse 1 % frais all-in sous-estime probablement le réalisé : spread bid-ask souvent 30–80 bps sur ces noms, + 5–15 bps slippage, + ~25 bps frais courtage retail = 75–120 bps single-leg, soit 1.5–2.4 % round-trip vs 1 % modélisé. L'alpha annoncé est ~50 bps à 1 pt trop optimiste.
1.4 Drawdown profile
Le maxDrawdownPct: -12 (winning-strategy.ts ligne 293) est :
- Hard-codé manuellement, pas recalculé à chaque seed.
- Probablement calculé sur les rendements annuels, pas sur la courbe d'equity quotidienne ⇒ sous-estime systématiquement le drawdown intra-année.
Métriques absentes : MaxDD réel sur courbe quotidienne, time-under-water (TUW), Calmar (CAGR / |MaxDD|), Ulcer Index, Pain Index.
1.5 Regime risk
| Régime | Couvert ? | Commentaire |
|---|---|---|
| Bull modéré post-COVID | Oui (2023, 2025) | Bien |
| Bear modéré rates-driven | Oui (2022) | +7.9 % est l'alpha le plus fort, suspect ? |
| Sideways | Oui (2024) | +2 % alpha = +4 pts, faible |
| Crash brutal (mars 2020) | Non | T+90 hold = porte le crash entier |
| Crise systémique (2008/2011) | Non | Cluster insider buys peuvent être contrariens prématurés sur faillites |
| Stagflation prolongée | Non | Pas de proxy historique |
| Sécheresse de signaux | Non testée | Si 0 signal qualifié sur 2 trimestres : cash drag ? CAC 40 fallback ? Le code ne le précise pas. |
1.6 Tail risk single-name
Sur les small/mid-caps biotech/tech FR :
- −50 % en 1 jour (Phase III raté, profit warning, fraude) : ~1.5 % de probabilité annuelle par nom dans cet univers.
- Sur un portefeuille de 15 noms, probabilité d'avoir au moins un −50 %/an ≈ 1 − 0.985^15 ≈ 20 %.
- Avec equal-weight 6.7 % par nom, contribution au DD trimestriel : −3.3 pts. Sur cluster sectoriel (2–3 noms touchés simultanément), −10 pts intra-trimestre est réaliste.
1.7 Risques opérationnels / modèle
- Look-ahead léger :
globalMeanduTrackRecordIndexagrège des trades futurs (par rapport au trade scoré). Magnitude probable < 0.5 pt de score mais pollue les backtests d'avant-2023. - Survivorship bias : les sociétés délistées (radiation, faillite) n'apparaissent plus dans
Company⇒ leurs achats d'initiés perdants sortent de l'échantillon. Sur 4 ans en mid-cap FR ce biais peut valoir 1–3 pts d'alpha annuel "fantôme". - Pubdate vs transactionDate : retail entre à
pubDate+1(cf.returnFromPub*), mais la stratégieWinningSignaln'expose pas explicitement quel prix est utilisé dans lesSTRATEGY_PROOFchiffres. À expliciter sur/methodologie. - Granularité du backtest : pas de slippage modélisé par taille de position vs ADV.
- Cache 30 min sur les signaux live (
unstable_cacheligne 238) : OK pour le rendering, mais incompatible avec une promesse de "signal frais" pour un user agissant juste après un alert.
2. Overlays risk-management proposés
Overlay 1 — Cap par nom à 7 % (hard) + cap soft 5 %
- À chaque rebalance trimestriel, plafonner chaque ligne à max(5 %, 1/N) cap dur 7 %, redistribuer le surplus pro-rata.
- Si
N < 10(signaux qualifiés rares), compléter le solde par CAC 40 ETF (CAC.PA / CW8.PA) ou cash, pas par sur-pondération des signaux existants. - Impact attendu : MaxDD réduit de 25–35 %, Sharpe stable (Sigma de portefeuille baisse plus que la moyenne).
Overlay 2 — Cap sectoriel à 25 % (utiliser sectorTag existant)
- À partir de
Company.sectorTag(déjà en DB, non encore exploité danswinning-strategy.ts). - Si un secteur dépasse 25 %, écrêter les positions les moins convaincues (
signalScorele plus bas) et redistribuer aux autres secteurs ou au CAC ETF. - Impact : protège contre le crash biotech coordonné, coût en alpha estimé < 1 pt/an.
Overlay 3 — Stop-loss à −20 % vs cours d'entrée (trailing optionnel)
- Sortie automatique si une ligne perd >20 % vs son
priceAtPub. - Le produit perdu reste cash jusqu'au prochain rebalance (pas de re-buy avant 90 jours pour éviter le whipsaw).
- Test à faire : comparer
STRATEGY_PROOFavec/sans stop. Sur des insider buys, les stops réduisent souvent l'alpha (l'edge vient des reprises post-flush), donc à valider empiriquement avant adoption. Probablement Sharpe +0.05 et MaxDD −30 %, mais CAGR −1 à −2 pts.
Overlay 4 — Vol-targeting par sizing
- Chaque ligne sizée à contribuer 1 % de vol annualisée au portefeuille (au lieu de equal-weight).
- Vol historique ex-ante calculée sur les 90 derniers jours du
priceAtPub. - Une biotech à 60 % de vol annuelle pèserait 1/60 = 1.7 % du portefeuille, un industriel à 25 % vol pèserait 4 % → naturellement diversifié.
- Impact attendu : Sharpe +0.10 à +0.20 (effet bien documenté en factor investing), MaxDD −20 à −30 %. C'est probablement l'overlay au meilleur ratio bénéfice/complexité.
Overlay 5 — Hedge dynamique CAC 40 short en régime risk-off
- Trigger : VIX > 25 OU CAC 40 sous sa MM200 OU dégradé en momentum (return 90j < −5 %).
- Action : ouvrir un short CAC 40 (DBPK / DSP5) à hauteur de 25–40 % de l'exposition longue.
- Coût : ~50 bps/an de carry quand inactif, alpha −2 à −3 pts/an si le hedge est mal timé.
- Impact : MaxDD divisé par 2 sur les régimes type 2022 H1 ou mars 2020, mais coût en alpha sur les bull years. À réserver aux portefeuilles > 100 k€ où la simplicité equal-weight ne suffit plus.
3. Grille de lecture
| Dimension de risque | Approche actuelle | Overlay recommandé | Impact attendu Sharpe | Impact attendu MaxDD |
|---|---|---|---|---|
| Concentration single-name | Aucune limite | Cap 5–7 % + complément CAC ETF | +0.05 | −25 à −35 % |
| Concentration sectorielle | Aucune mesure | Cap 25 % par sectorTag |
+0.02 | −15 à −25 % (sur crash sectoriel) |
| Tail single-name | Aucune protection | Stop −20 % OU vol-targeting | +0.05 à +0.20 | −20 à −30 % |
| Liquidité / slippage | 1 % frais forfaitaire | Modèle ADV-aware + tickets max | Neutre Sharpe, −0.5 à −1 pt CAGR (réalisme) | Neutre |
| Régime de marché | Statique, pas de hedge | Hedge dynamique CAC short si VIX>25 | Neutre à +0.10 selon régime | −40 à −50 % en crash |
| Régime "signal dry" | Implicite cash | Fallback CAC ETF explicite | +0.05 | Neutre |
| Survivorship | Ignoré | Réintégrer les délistés dans le backtest | Sharpe −0.10 (réalisme) | MaxDD ajusté +3 à +5 pts |
Look-ahead globalMean |
Présent (faible) | Calcul rolling out-of-sample | Sharpe −0.05 (réalisme) | Neutre |
4. Scénarios de stress à simuler
À implémenter dans scripts/stress-test.mjs (nouveau), avec output sur /methodologie#stress :
- GFC 2008 : appliquer aux 15 noms du portefeuille T+90 le rendement historique du CAC Mid 60 sur sept 2008 → mars 2009 (−52 %). Hypothèse pessimiste : multiplier par 1.2 (les insider buys sont surreprésentés en sociétés en détresse).
- Crash COVID mars 2020 : −38 % CAC sur 4 semaines, rebond +40 % sur 6 semaines. T+90 hold absorbe tout l'aller-retour. Calculer MaxDD intra-trimestre.
- Sell-off small-caps 2022 : CAC Mid & Small −22 % sur l'année, mid-caps tech FR jusqu'à −45 %. Comparer perf stratégie modèle vs perf small-cap index pour mesurer l'alpha en régime baissier sectoriel.
- Sécheresse de signaux : forcer
sampleSize = 0sur 2 trimestres consécutifs. Vérifier que le code gère (actuellement, ligne 130 dewinning-strategy.ts,rowssera vide →[]). Quelle est la perf "fallback" ? Cash ? CAC ? À documenter. - Phase III ratée multi-noms : injecter −60 % sur 3 noms biotech simultanément au sein d'un trimestre. Mesurer DD du portefeuille avec et sans cap par nom à 7 %.
- Insider scandal : un PDG décoré dans le track-record est démasqué pour fraude → ses signaux historiques deviennent du bruit. Simuler retrait des top-5 insiders par
trackRecordAlphaet recalculer l'alpha global. Test de robustesse au "key person risk" du signal. - Reverse stress test : quel rendement annuel des mid-caps FR conduit à un Sharpe < 0.5 pour la stratégie ? (Trouver le point de bascule.)
5. Métriques additionnelles à publier sur /methodologie
Le STRATEGY_PROOF actuel expose avgReturn, avgAlpha, sharpe, winRate, maxDrawdownPct. C'est insuffisant pour un cadre risk-aware. Ajouter :
| Métrique | Définition | Pourquoi |
|---|---|---|
| Volatilité annualisée | σ(rendements mensuels) × √12 | Permet à l'utilisateur de calibrer son sizing |
| Max Drawdown (peak-to-trough, daily curve) | Sur courbe d'equity quotidienne, pas annuelle | Vérité terrain vs le −12 % hard-codé actuel |
| Time-Under-Water (TUW) | Nombre moyen de jours pour récupérer un nouveau plus haut | Capture la douleur psychologique |
| Calmar Ratio | CAGR / | MaxDD |
| Sortino Ratio | Mean / σ(rendements négatifs) | Différencie vol haussière (souhaitée) vs baissière (subie) |
| Hit ratio par secteur | Win rate ventilé par sectorTag |
Identifie où l'alpha vient réellement |
| Hit ratio par taille (Sweet vs Mid vs Small) | Existe déjà dans bySize |
À promouvoir sur la page publique |
| Worst trade | Min single-name return sur la période backtest | Honnêteté sur le tail |
| Best/Worst trimestre | Min et max sur l'equity curve | Transparence sur la dispersion |
| Beta vs CAC 40 | Régression OLS des rendements stratégie / CAC | Quantifier la part de la perf qui est du β classique |
| Skewness & Kurtosis | Moments 3 et 4 de la distribution de rendements | Vrai diagnostic de tail-risk |
| Slippage modélisé | Coût total en bps, ventilé par taille de ticket | Honnêteté sur la transposabilité à capital plus élevé |
Recommandation forte : afficher MaxDD daily, TUW et Sortino au même niveau de visibilité que le Sharpe sur /methodologie. Un Sharpe 1.00 avec un TUW de 14 mois et un MaxDD daily de −28 % se vend mal — mais cacher ces chiffres revient à exposer l'utilisateur à un retour de bâton réputationnel quand le drawdown arrivera.
Résumé (100 mots)
La stratégie Sigma délivre probablement un alpha réel sur 2022–2025, mais le cadre risque est dangereusement minimal : pas de cap single-name, pas de cap sectoriel, pas de hedge, pas de stop, un MaxDD hard-codé non recalculé, et un univers mid-cap FR structurellement biaisé biotech/tech qui peut subir des crashs coordonnés. Quatre overlays prioritaires : cap 5–7 % par nom, cap 25 % par secteur via sectorTag, vol-targeting (meilleur ratio bénéfice/complexité), et fallback CAC ETF si moins de 10 signaux qualifiés. Stress-tester impérativement 2008, mars 2020, et la sécheresse de signaux. Publier vol annualisée, MaxDD daily, TUW, Sortino et Calmar sur /methodologie pour honnêteté intellectuelle.