Comment structurer le monitoring d'une stack de trading systématique pour détecter les anomalies avant qu'elles ne deviennent des pertes.
Série : Monitorer sa Stack de Trading
Dans la Partie 1, nous avons analysé les post-mortems les plus instructifs du trading systématique. Chaque incident partageait un point commun : le monitoring était soit absent, soit mal architecturé. Des logs existaient, des dashboards clignotaient, mais l'architecture globale ne permettait pas de détecter, comprendre et réagir à temps.
Cette deuxième partie est le cœur de la série. Nous allons construire, couche par couche, une architecture de monitoring robuste pour une stack de trading. Pas un produit spécifique, pas un outil particulier — une architecture, c'est-à-dire un ensemble de principes, de patterns et de décisions de design qui guident ensuite tous les choix techniques.
Un piège fréquent : commencer par choisir un outil (Grafana, Datadog, Prometheus) puis essayer de faire rentrer son système dedans. C'est comme choisir la couleur de la façade avant de dessiner les plans de la maison. L'outil vient après l'architecture, jamais avant.
Une bonne architecture de monitoring repose sur trois piliers fondamentaux :
Le terme « observabilité » (observability) vient de la théorie du contrôle. Un système est observable si, en analysant ses sorties (outputs), on peut déduire son état interne complet. En monitoring, cela signifie que vos métriques, logs et traces vous permettent de comprendre pourquoi le système se comporte d'une certaine façon — pas seulement ce qui se passe.
Les trois piliers de l'observabilité moderne sont :
Ensemble, ils forment un triangle qui permet de naviguer de « quelque chose ne va pas » à « voici la ligne de code responsable ».
Ce guide couvre huit domaines essentiels, chacun dédié à un aspect critique de l'architecture de monitoring :
Que vous construisiez un système institutionnel gérant des milliards ou un bot retail sur un VPS à 10$/mois, les principes sont identiques. Seule l'échelle change.
La Séparation des Concerns (Separation of Concerns, SoC) est le principe fondamental de toute architecture logicielle robuste. Dans le contexte du trading, elle prend une dimension critique : quand votre monitoring tourne dans le même processus que votre stratégie, un bug de monitoring peut crasher votre stratégie. Et inversement, une stratégie qui consomme 100% du CPU ne laisse rien au monitoring pour détecter le problème.
Une stack de trading bien architecturée se compose de trois moteurs qui doivent tourner dans des processus séparés, idéalement sur des machines distinctes :
Le crash du monitoring ne doit jamais arrêter le trading. Et le crash du trading ne doit jamais arrêter le monitoring. Ce sont deux avions différents — si l'un tombe, l'autre continue de voler pour rapporter ce qui s'est passé. Si votre trading et votre monitoring partagent le même processus, un seul OOM (Out Of Memory) suffit à tout faire tomber silencieusement.
Comprendre le flux de données est essentiel pour savoir où placer vos points d'observation. Voici le chemin que suit chaque décision de trading, depuis la donnée de marché brute jusqu'à l'exécution sur l'exchange :
Les flèches pleines représentent le flux de trading (le chemin critique — celui qui doit être le plus rapide possible). Les flèches en pointillés représentent le flux de monitoring : chaque composant émet des métriques vers le Monitoring Layer, mais le Monitoring Layer n'émet jamais rien vers le flux de trading.
C'est un principe fondamental que beaucoup de débutants violent : le flux de monitoring est strictement unidirectionnel. Les composants de trading émettent des événements vers le monitoring (push), ou le monitoring vient lire des métriques exposées (pull). Mais le monitoring ne doit jamais injecter de données dans le flux de trading.
La seule exception est le kill switch : un mécanisme d'urgence qui arrête tout le système. Mais même le kill switch agit par interruption (arrêter), pas par modification (changer le comportement). Nous en reparlerons en détail dans la section sur la gestion du risque.
Voici les erreurs les plus fréquentes que nous observons dans les systèmes de trading, particulièrement chez les développeurs qui débutent en architecture :
| Anti-pattern | Risque | Correction |
|---|---|---|
| Monitoring synchrone | L'envoi de métriques bloque la boucle de trading. Si le serveur de métriques est lent ou indisponible, le trading est paralysé. | Toujours émettre les métriques de manière asynchrone (fire-and-forget avec buffer local). |
| Logs dans le hot path | L'écriture de logs I/O ralentit chaque tick. Sur une stratégie HFT, 1ms de latence ajoutée peut coûter des milliers de dollars par jour. | Ring buffer en mémoire, flush asynchrone par batch. Logs structurés (JSON) au lieu de concaténations de chaînes. |
| Base de données partagée | Le trading et le monitoring écrivent dans la même base. Un SELECT analytique lent du dashboard verrouille les tables que le trading utilise. | Bases de données séparées. Le monitoring lit une réplique read-only ou un stream d'événements. |
| Monitoring = condition de trading | « Si le monitoring détecte X, alors trade Y. » Le monitoring influence le trading → perte totale de la séparation des concerns. | Le monitoring observe et alerte uniquement. Les décisions de trading restent dans le Strategy Engine, les décisions de risque dans le Risk Engine. |
| Single process | Trading + Risk + Monitoring dans un seul binaire. Un OOM (Out Of Memory) du module de monitoring tue le trading. | Processus séparés. Communication via message bus (Redis, NATS, ZeroMQ) ou fichiers partagés. |
Si les trois moteurs sont des processus séparés, comment communiquent-ils ? Voici les patterns recommandés par ordre de complexité croissante :
Pour un système retail, Redis Pub/Sub est souvent le meilleur compromis. C'est simple à installer (une seule commande Docker), rapide (sub-milliseconde), et supporte aussi bien le push (le trading publie) que le pull (le monitoring interroge une clé). Pour un système institutionnel, NATS ou Kafka offrent des garanties de livraison et une scalabilité supérieures.
Mais ne sur-ingéniez pas : un fichier JSON lu toutes les 5 secondes par un cron fonctionne parfaitement pour un bot avec 10 positions. Commencez simple, complexifiez quand le besoin le justifie.
Voici à quoi ressemble un message typé émis par le Trading Engine vers le Monitoring Layer, au format JSON structuré :
{
"timestamp": "2026-02-27T14:30:05.123Z",
"component": "trading_engine",
"event_type": "order_sent",
"correlation_id": "a1b2c3d4-5678-90ab-cdef-1234567890ab",
"data": {
"symbol": "AAPL",
"side": "BUY",
"quantity": 100,
"order_type": "LIMIT",
"price": 178.50,
"strategy": "momentum_v3"
},
"metrics": {
"queue_depth": 2,
"open_positions": 5,
"daily_pnl": 1250.00,
"current_drawdown_pct": 0.3
}
}
Chaque message contient un correlation_id qui permet de retracer tout le parcours de cette décision à travers le système. Le Risk Engine verra ce même ID quand il validera l'ordre. L'Execution Engine le verra quand il enverra l'ordre au broker. Et le monitoring les connecte tous pour reconstituer l'histoire complète.
Le monitoring d'une stack de trading s'organise naturellement en quatre couches, de la plus basse (l'infrastructure physique) à la plus haute (le marché lui-même). Chaque couche a ses propres métriques, ses propres seuils, et ses propres responsables.
L'idée clé à retenir : un problème dans une couche basse se manifeste toujours dans les couches supérieures, mais avec un délai et une perte de contexte. Un problème réseau (Layer 1) apparait d'abord comme de la latence (Layer 2), puis comme du slippage (Layer 3), et finalement comme une perte inexplicable (Layer 4). Si vous ne monitorez que le P&L, vous détectez le problème trop tard pour agir.
La pyramide se lit de bas en haut. Plus on monte, plus les métriques sont « business » et moins elles sont « techniques ». Mais les couches basses sont les fondations — sans elles, rien au-dessus ne fonctionne.
La base de la pyramide. Même le meilleur algorithme ne peut rien si le serveur n'a plus de mémoire, si le réseau est saturé, ou si le disque est plein. Le monitoring d'infrastructure est le socle indispensable — souvent négligé par les traders qui pensent que seul le P&L compte.
| Métrique | Outil typique | Fréquence | Warning | Critique |
|---|---|---|---|---|
| CPU % | node_exporter / top | 10s | > 70% | > 90% |
| RAM % | node_exporter | 10s | > 75% | > 90% |
| Disk free | node_exporter / df | 30s | < 20% | < 5% |
| Disk I/O latency | iostat / sar | 10s | > 10ms | > 50ms |
| Network RTT (broker) | ping / TCP probe | 5s | > 50ms | > 200ms |
| Packet loss | mtr / smokeping | 30s | > 0.1% | > 1% |
| DNS resolution | dig / DNS probe | 60s | > 100ms | Timeout |
| Process count | ps / supervisord | 10s | Processus manquant | Trading engine down |
La couche application vérifie que vos composants logiciels fonctionnent correctement. Même si l'infrastructure est parfaitement saine, un bug logiciel, une dépendance cassée, une API qui change de format de réponse ou un WebSocket qui se déconnecte silencieusement peut paralyser le système.
Un heartbeat est un message simple (« je suis vivant ») envoyé à intervalle régulier par chaque composant. Le monitoring attend ce message et démarre un timer. Si le message n'arrive pas avant le timeout, le composant est considéré mort.
Un bon heartbeat inclut plus qu'un simple timestamp : il contient aussi l'état du composant (nombre d'ordres en attente, nombre de positions ouvertes, dernier prix vu, version du code). Cela permet de détecter un composant « zombie » — techniquement vivant (il envoie des heartbeats) mais fonctionnellement mort (il ne traite plus d'ordres, il est bloqué dans une boucle infinie).
Bonnes pratiques : heartbeat toutes les 5-10 secondes pour un système intraday, toutes les 30-60 secondes pour un système swing. Timeout = 3x l'intervalle. Si le heartbeat est toutes les 10s, alerter après 30s sans signal.
| Métrique | Description | Fréquence | Warning | Critique |
|---|---|---|---|---|
| Heartbeat | Signal de vie de chaque composant | 5-10s | 1 miss | 3 miss consécutifs |
| Order rejection rate | % d'ordres rejetés par le broker | Par trade | > 5% | > 20% |
| Fill latency | Temps envoi → confirmation | Par trade | > 500ms | > 2s |
| Slippage | Écart prix demandé vs obtenu (bps) | Par trade | > 5 bps | > 20 bps |
| WebSocket reconnections | Nombre de reconnexions par heure | 1 min | > 2/h | > 10/h |
| API rate limit remaining | % du quota API restant | Par call | < 30% | < 10% |
| Queue depth | Ordres en attente d'envoi | 1s | > 10 | > 50 |
| Error rate | Exceptions applicatives / minute | 1 min | > 1/min | > 10/min |
C'est la couche qui parle la langue du trader, pas celle de l'ingénieur. P&L, drawdown, exposition, taille des positions, concentration sectorielle. C'est ici que les décisions de risque se prennent et que les limites opérationnelles sont appliquées.
| Métrique | Formule | Fréquence | Warning | Critique |
|---|---|---|---|---|
| P&L journalier | Σ(unrealized + realized) | 1 min | < -1% du capital | < -2% du capital |
| Current drawdown | (Peak - Current) / Peak | 1 min | > 5% | > 10% |
| Net exposure | ΣLong - ΣShort (notional) | Par trade | > 20% capital | > 50% capital |
| Position concentration | Max position / Total capital | Par trade | > 10% | > 25% |
| Win rate (rolling 20) | Wins / Total (20 derniers trades) | Par trade | < 40% | < 25% |
| Sharpe ratio (rolling) | (E[R] - Rf) / σ(R) × √252 | Journalier | < 1.0 | < 0.5 |
| Trade frequency | Ordres / période vs baseline | 1 min | > 2x normal | > 5x normal |
| Sector exposure | Max sector / Total portfolio | Par trade | > 30% | > 50% |
La couche la plus haute et la plus subtile. Ici, ce n'est pas votre système qui a un problème — c'est le marché qui a changé. Un regime shift, un flash crash, une évaporation de la liquidité, un gap overnight massif. Votre algorithme qui était profitable hier peut devenir catastrophique aujourd'hui si les conditions de marché ont fondamentalement changé.
Les problèmes de Layer 4 sont les plus dangereux car ils sont les moins prévisibles et les plus difficiles à gérer algorithmiquement. Un changement de régime de marché peut invalider les hypothèses fondamentales de votre stratégie du jour au lendemain. C'est pourquoi le monitoring de marché n'est pas un luxe — c'est un stop-loss intellectuel. Il vous dit : « Les conditions dans lesquelles tu as backtesté ne sont plus réunies. Attention. »
| Métrique | Source | Fréquence | Signal d'alerte |
|---|---|---|---|
| VIX level | CBOE | Tick / 1min | > 25 = stress, > 35 = panique |
| VIX/VIX3M ratio | CBOE | Journalier | > 1.0 = backwardation = stress court terme |
| SPY bid-ask spread | Exchange data | Tick | > 2x normal = liquidité réduite |
| Volume ratio | Volume / SMA(20) | 5 min | > 3x = activité anormale |
| Cross-asset correlation | Rolling 20d | Journalier | > 0.8 = contagion entre actifs |
| ATR expansion | ATR(14) / ATR(14)[20d] | Journalier | > 1.5x = changement de régime vol |
| Overnight gap | Open - Previous Close | Opening | > 2% = gap significatif |
| News sentiment shift | NLP / API | Horaire | Score < -0.5 = négatif fort |
La gestion du risque est la seule raison pour laquelle les systèmes de trading institutionnels survivent sur le long terme. Pas la qualité de l'alpha, pas la vitesse d'exécution, pas la sophistication du modèle — le risk management. Un système avec un alpha médiocre mais un excellent risk management sera profitable sur 10 ans. L'inverse ne survivra pas 6 mois.
Le risk management en trading systématique s'organise en trois phases temporelles : avant, pendant, et après le trade.
Avant qu'un ordre ne quitte votre système, il doit passer une série de vérifications automatiques. Ce sont des garde-fous qui empêchent les erreurs les plus coûteuses : les fat fingers, les dépassements de limites, et les ordres absurdes.
| Check | Description | Seuil typique | Action si violé |
|---|---|---|---|
| Order size | La taille de l'ordre ne dépasse pas la limite maximale par instrument | Max 5% du capital par position | Rejet automatique + alerte |
| Fat finger | Le prix de l'ordre est cohérent avec le prix actuel du marché | Écart < 5% du mid price | Rejet + alerte critique |
| Position limit | La nouvelle position totale ne dépasse pas la limite de concentration | Max 25% du capital par ticker | Rejet |
| Notional limit | L'exposition totale (gross) reste dans les limites autorisées | Max 200% du capital (si leverage) | Rejet + alerte |
| Drawdown gate | Si le drawdown journalier dépasse le seuil, plus aucun nouvel ordre | Drawdown > 2% = halt | Halt trading + alerte critique |
| Order rate | Nombre d'ordres par minute ne dépasse pas le seuil anti-emballement | Max 60 ordres/min (retail) | Throttle + alerte warning |
| Market hours | Vérifier que le marché concerné est bien ouvert | Heures d'ouverture exchange | Rejet silencieux |
| Duplicate detection | Pas de doublon (même ticker, direction, taille dans un intervalle court) | Déduplication sur 1 seconde | Rejet du doublon + log |
Un « fat finger » (doigt gras) est une erreur de saisie qui envoie un ordre avec un prix ou une quantité absurde. Exemple : acheter 10 000 actions au lieu de 100, ou vendre à 0.01$ au lieu de 100$. En trading algorithmique, l'équivalent est un bug qui génère des ordres aberrants.
Le pre-trade check de fat finger compare le prix de l'ordre au prix actuel du marché (mid price). Si l'écart dépasse un seuil (typiquement 5%), l'ordre est rejeté automatiquement et une alerte critique est envoyée.
Cas célèbre : en 2012, Knight Capital a perdu 440 millions de dollars en 45 minutes à cause d'un code de test déployé en production qui envoyait des ordres erratiques. Un simple pre-trade check sur le volume et la fréquence des ordres aurait évité la catastrophe complète.
Une fois l'ordre envoyé, le monitoring ne s'arrête pas — il s'intensifie. C'est pendant l'exécution que les problèmes les plus subtils et coûteux apparaissent : slippage excessif, fills partiels, ordres zombies en attente qui bloquent la queue.
Après chaque trade et à la fin de chaque journée, une analyse automatique évalue la qualité de l'exécution et les performances. Ce n'est pas du monitoring temps réel — c'est de l'analyse batch qui alimente les améliorations continues du système.
Le kill switch est le mécanisme d'arrêt d'urgence de votre système de trading. Quand tout va mal — vraiment mal — le kill switch arrête tout immédiatement. C'est l'extincteur de la finance algorithmique.
1. Indépendant — Le kill switch ne doit PAS être dans le même processus que le trading engine. Si le trading engine est en boucle infinie ou gelé, un kill switch interne ne fonctionnera jamais. Il doit vivre dans un processus séparé.
2. Multiples déclencheurs — Trois types : automatique (drawdown > X%), semi-automatique (un clic sur un dashboard ou un message Discord), et physique (un script shell exécutable depuis n'importe où, y compris votre téléphone).
3. Testé régulièrement — Un kill switch non testé est un kill switch qui ne fonctionne pas. Testez-le en production (avec de très petites positions) au moins une fois par mois. Vérifiez qu'il annule effectivement les ordres et ferme les positions.
4. Actions exhaustives et claires — Le kill switch ne se contente pas d'arrêter les nouveaux ordres. Il : (1) annule tous les ordres en attente, (2) peut optionnellement fermer toutes les positions ouvertes, (3) notifie toutes les parties prenantes, (4) log l'événement de manière immuable avec timestamp et raison.
Le risk budgeting est l'art d'allouer un « budget de risque » à chaque stratégie, chaque instrument, et chaque période temporelle. L'idée fondamentale : vous définissez à l'avance combien vous êtes prêt à perdre par jour, par semaine, par mois. Quand le budget est épuisé, le trading s'arrête automatiquement. Pas de négociation, pas de « juste un dernier trade ».
| Période | Drawdown Max | Action automatique | Reset |
|---|---|---|---|
| Par trade | -1% du capital | Stop loss automatique | Prochain trade |
| Journalier | -2% du capital | Halt trading pour la journée entière | Lendemain 9h30 |
| Hebdomadaire | -5% du capital | Réduction du sizing de 50% la semaine suivante | Lundi suivant |
| Mensuel | -10% du capital | Halt trading complet + review obligatoire | Après review manuelle validée |
| Peak-to-trough | -20% du peak | Kill switch total + analyse complète de la stratégie | Après refonte et re-backtest |
Les limites étagées (par trade, jour, semaine, mois) agissent comme des couches de défense successives — le modèle du Swiss Cheese (fromage suisse). Chaque couche a des trous (des scénarios qu'elle ne couvre pas), mais les trous ne s'alignent (presque) jamais.
Perdre 1% sur un trade, c'est normal et attendu. Perdre 2% sur la journée, c'est le signe qu'aujourd'hui n'est pas votre jour — mieux vaut s'arrêter et préserver le capital. Perdre 5% sur la semaine suggère un problème plus profond : conditions de marché défavorables, bug dans la stratégie, ou paramètres décalés.
La règle empirique : votre max drawdown en live sera typiquement 2-3x celui observé en backtest. Si votre backtest montre un max drawdown de 10%, calibrez vos limites pour tolérer 20-30% en réel.
Un système de monitoring sans alerting, c'est un détecteur de fumée sans sirène. L'alerting est le pont entre l'observation et l'action. Mais un alerting mal conçu est parfois pire que pas d'alerting du tout — il crée de l'alert fatigue, cette insensibilisation progressive aux alertes qui fait qu'on finit par ignorer même les vraies urgences.
La matrice d'escalation définit qui est notifié, quand, et comment. Elle évite le bystander effect — ce phénomène où personne n'agit parce que chacun pense que quelqu'un d'autre s'en occupe.
| Niveau | Qui est notifié | Délai réponse max | Canal | Si non acquitté |
|---|---|---|---|---|
| INFO | Dashboard / logs uniquement | Aucun | Dashboard | Pas d'escalation |
| WARNING | Trader / opérateur on-call | < 30 minutes | Slack + Discord | → CRITICAL après 30 min |
| CRITICAL | Trader + Risk Manager | < 5 minutes | SMS + Slack + Appel | → EMERGENCY après 15 min |
| EMERGENCY | Tous + CTO / Head of Trading | Immédiat | Tous canaux | Kill switch auto si non ack 5 min |
L'alert fatigue est le phénomène où les opérateurs deviennent insensibles aux alertes parce qu'il y en a trop, trop souvent, et trop peu pertinentes. Des études dans le domaine médical montrent que quand le taux de fausses alertes dépasse 85%, les opérateurs finissent par ignorer toutes les alertes — y compris les vraies urgences. C'est exactement le même problème en trading.
Voici les quatre techniques clés pour lutter contre l'alert fatigue :
Le diagramme Sankey ci-dessus illustre un point crucial : sur 100 événements bruts, seulement 3 devraient déclencher une alerte EMERGENCY, et environ 40% devraient être supprimés (dupliqués, déjà connus, en cooldown). Si votre ratio est très différent — trop d'alertes critiques ou trop peu de suppression — votre système d'alerting est mal calibré et génère de la fatigue.
Un système d'alerting bien calibré suit approximativement cette distribution :
Si plus de 20% de vos alertes sont CRITICAL ou EMERGENCY, vos seuils sont trop sensibles. Si vous avez zéro alerte WARNING, vous ne détectez pas les problèmes assez tôt — vous passez directement de « tout va bien » à « catastrophe ».
Si vous ne pouvez monitorer que 20 métriques sur votre système de trading, voici celles qui comptent le plus. Elles couvrent les quatre couches et donnent une vue complète et équilibrée de la santé de votre stack.
| # | Métrique | Formule / Description | Seuil d'alerte | Fréquence |
|---|---|---|---|---|
| 1 | Fill Rate | Ordres exécutés / Ordres envoyés × 100 | < 95% | Par trade |
| 2 | Average Slippage | (Prix obtenu - Prix demandé) / Prix demandé, en bps | > 5 bps (rolling 20) | Par trade |
| 3 | Order-to-Fill Latency | Temps entre envoi et fill complet (ms, percentile 95) | > 500ms (p95) | Par trade |
| 4 | Rejection Rate | Ordres rejetés / Ordres envoyés × 100 | > 5% | Par trade |
| 5 | Implementation Shortfall | (Prix décision - Prix exécution) × Quantité | > 10 bps (rolling 20) | Par trade |
| # | Métrique | Formule / Description | Seuil d'alerte | Fréquence |
|---|---|---|---|---|
| 6 | Current Drawdown | (Peak Equity - Current Equity) / Peak Equity | > 5% (W), > 10% (C) | 1 min |
| 7 | Daily VaR (95%) | Value at Risk à 95% confiance, horizon 1 jour | > 2% du capital | Horaire |
| 8 | Gross Exposure | Σ|Long| + Σ|Short| / Capital total | > 200% (si leveraged) | Par trade |
| 9 | Concentration Max | Max(Position / Capital) par instrument | > 20% | Par trade |
| 10 | Sharpe Ratio (rolling 30d) | (E[R] - Rf) / σ(R) × √252 | < 0.5 (W), < 0 (C) | Journalier |
Le Sharpe Ratio mesure le rendement ajusté du risque. Il répond à la question : « Pour chaque unité de risque (volatilité) que je prends, combien de rendement excédentaire est-ce que j'obtiens ? »
La formule : Sharpe = (Rendement moyen - Taux sans risque) / Écart-type des rendements, annualisé en multipliant par √252 (jours de trading).
Limite : le Sharpe ne capture pas les risques de queue (tail risks). Complétez avec le Sortino (pénalise uniquement la volatilité négative) et le Calmar (rendement annualisé / max drawdown).
| # | Métrique | Description | Seuil d'alerte | Fréquence |
|---|---|---|---|---|
| 11 | CPU Usage | Utilisation CPU du trading engine (%) | > 70% (W), > 90% (C) | 10s |
| 12 | Memory RSS | Mémoire résidente du processus trading | Croissance > 10%/heure | 30s |
| 13 | Network RTT | Round-trip time vers le broker/exchange | > 50ms (W), > 200ms (C) | 5s |
| 14 | Disk Free | Espace disque disponible (%) | < 20% (W), < 5% (C) | 60s |
| 15 | Process Uptime | Durée depuis le dernier restart du processus | Restart non planifié = alerte | 10s |
| # | Métrique | Description | Seuil d'alerte | Fréquence |
|---|---|---|---|---|
| 16 | VIX Level | CBOE Volatility Index | > 25 (W), > 35 (C) | 1 min |
| 17 | Volume Ratio | Volume actuel / SMA(volume, 20j) | > 3x = activité anormale | 5 min |
| 18 | Bid-Ask Spread | (Ask - Bid) / Mid, en bps, vs moyenne | > 2x normal | Tick |
| 19 | Cross-Asset Correlation | Corrélation rolling 20j entre actifs du portefeuille | > 0.8 = contagion | Journalier |
| 20 | ATR Expansion | ATR(14) actuel / ATR(14) il y a 20 jours | > 1.5x = regime shift | Journalier |
Le drawdown mesure la perte depuis le point le plus haut (peak). Si votre portefeuille a atteint 110 000$ puis est redescendu à 99 000$, votre drawdown est de (110 000 - 99 000) / 110 000 = 10%. C'est la métrique de risque la plus intuitive.
La VaR (Value at Risk) répond à : « Quel est le montant maximum que je peux perdre avec 95% de probabilité sur 1 jour ? » Une VaR de 5 000$ à 95% signifie : 1 jour sur 20, vous pourriez perdre plus de 5 000$. Complétez par la CVaR (Conditional VaR) qui mesure la perte moyenne quand on dépasse la VaR.
En architecture de monitoring, il existe des patterns éprouvés qui fonctionnent dans presque tous les contextes, et des anti-patterns qui mènent invariablement à des incidents. Voici les plus importants.
Les logs ne doivent jamais être modifiés après écriture. Pas de rotation destructive, pas de troncature. Chaque événement est écrit une fois et conservé pour une durée définie (30-90 jours minimum). Les logs immutables sont votre boîte noire — quand l'avion s'écrase, c'est la seule chose qui permet de comprendre pourquoi.
Inspiré du pattern électrique : quand un composant détecte trop d'erreurs (ex: 5 rejets consécutifs de l'API broker), il « ouvre le circuit » et arrête d'envoyer des requêtes au composant défaillant. Après un cooldown (ex: 30 secondes), il envoie une requête test (half-open state). Si elle réussit, le circuit se referme. Sinon, il reste ouvert.
Chaque composant expose un endpoint /health qui retourne non seulement « healthy / unhealthy » mais un état détaillé incluant : la vérification de ses propres dépendances (DB, broker, feed) et son état business (positions, dernier trade, P&L). Cela détecte les composants « zombies » — techniquement vivants mais fonctionnellement morts.
Chaque décision de trading reçoit un identifiant unique (UUID) qui la suit à travers tous les composants, du signal initial à l'exécution finale. En cas de problème, il suffit de filtrer les logs par cet ID pour retracer le parcours complet d'une décision en quelques secondes.
| Anti-Pattern | Pourquoi c'est dangereux | Pattern correct |
|---|---|---|
| Silent Failures | Un composant échoue sans émettre d'erreur. Le système continue avec des données manquantes ou corrompues. Des semaines peuvent passer avant détection. | Fail loud. Chaque erreur est loggée, chaque exception non gérée déclenche une alerte. Un composant qui ne sait pas quoi faire doit s'arrêter, pas continuer silencieusement. |
| Log-and-Forget | Les erreurs sont loggées mais personne ne les lit. Des fichiers de 10 Go que personne n'a jamais ouverts. Le log existe pour la bonne conscience, pas pour l'action. | Chaque log d'erreur a une alerte associée ou est inclus dans un dashboard de tendances. Un log qui n'est jamais lu ne devrait pas exister. |
| Single Point of Failure | Un seul serveur, une seule connexion broker, un seul feed de données. Si ce composant tombe, tout le système tombe avec. | Redondance sur le chemin critique. Deux connexions broker (primaire + failover). Deux sources de données. Le monitoring lui-même a un backup (même simple). |
| God Dashboard | Un seul dashboard avec 200 métriques. Personne ne sait où regarder. L'information noyée dans le bruit est pire que pas d'information du tout. | Un dashboard par couche, un dashboard de synthèse. Maximum 8-10 métriques par écran. Chaque métrique a un seuil visuel (vert/jaune/rouge). |
| Copy-Paste Monitoring | Copier la config monitoring d'un autre projet sans l'adapter. Seuils génériques qui ne correspondent pas au comportement réel de votre système. | Calibrer les seuils sur les données historiques de votre système. Seuils basés sur les percentiles (p95, p99), pas sur des valeurs arbitraires. |
| No Runbook | L'alerte sonne mais personne ne sait quoi faire. L'opérateur improvise pendant que le système perd de l'argent. | Chaque alerte CRITICAL/EMERGENCY a un lien vers un runbook : (1) cause, (2) diagnostic, (3) actions correctives, (4) quand escalader. |
| Testing in Prod Only | Le monitoring n'est jamais testé. On découvre qu'il ne fonctionne pas le jour où on en a besoin — le pire moment possible. | Tester régulièrement : (1) injecter des pannes simulées, (2) vérifier les alertes, (3) tester le kill switch en conditions réelles avec des petites positions. |
Un runbook est un document qui dit : « Quand l'alerte X sonne, voici exactement les étapes à suivre. » C'est l'équivalent d'une checklist de pilote d'avion. Sans runbook, chaque incident est une improvisation sous pression. Avec un runbook, c'est une procédure testée et validée.
Chaque alerte CRITICAL ou EMERGENCY devrait avoir un runbook associé contenant : (1) les conditions de déclenchement, (2) les commandes de diagnostic à exécuter, (3) les actions correctives par ordre de priorité, (4) les critères de résolution, (5) le contact d'escalation si les étapes ne suffisent pas.
Tout ce que nous avons couvert peut sembler écrasant pour un trader retail avec un bot sur un VPS à 10$/mois. La bonne nouvelle : les principes sont exactement les mêmes, seule l'échelle change. Voici comment adapter cette architecture à un budget et une complexité de niveau retail.
L'architecture retail se résume à trois composants simples et gratuits :
Voici les 12 éléments que tout trader retail doit avoir, même avec le système le plus simple possible :
| # | Élément | Difficulté | Outil gratuit |
|---|---|---|---|
| 1 | Heartbeat du bot (alive/dead) | Facile | Fichier JSON + cron |
| 2 | P&L journalier loggé | Facile | CSV / SQLite local |
| 3 | Alerte drawdown (> X%) | Facile | Discord/Telegram webhook |
| 4 | Alerte position trop grosse | Facile | Script de vérification cron |
| 5 | Kill switch (annule tout) | Moyen | Script bash/Python + API broker |
| 6 | Trade journal automatique | Facile | Log chaque trade dans un CSV/DB |
| 7 | Monitoring connexion broker | Facile | Ping / API status check |
| 8 | VIX level check | Facile | Yahoo Finance API gratuite |
| 9 | Dashboard P&L visuel | Moyen | Grafana Cloud (free tier) |
| 10 | Backup des configs | Facile | Git |
| 11 | Log rotation | Facile | logrotate (Linux natif) |
| 12 | Weekly review automatisée | Moyen | Script qui génère un résumé hebdo |
Si vous ne faites que 3 choses, faites celles-ci :
Ces trois éléments à eux seuls auraient évité la majorité des catastrophes que nous avons analysées dans la Partie 1 de cette série.
Une fois le MVM en place et fonctionnel, voici les étapes pour monter en maturité progressivement :
print() par des logs JSON structurés avec timestamp, composant, niveau, correlation ID. Cela transforme vos logs d'un journal illisible en une base de données interrogeable.Voici la synthèse des principes clés de cette Partie 2. Ces six principes s'appliquent à tout système de trading, quelle que soit l'échelle :
Vous avez l'architecture. Vous connaissez les principes, les couches, les métriques, les patterns et les anti-patterns. La prochaine étape — la Partie 3 : Tooling — transformera ces principes en réalité concrète : quels outils choisir et configurer (Prometheus, Grafana, Loki, PagerDuty, Discord bots), comment construire votre stack de monitoring de A à Z, avec des exemples de code fonctionnels en Python et Go.
Série : Monitorer sa Stack de Trading