Un seul bug a causé 86 % de nos pertes de trading
Notre premier bot de trading automatique a perdu 5,1 millions de ₩ en simulation (paper trading) sur 190 sorties. Quand nous avons réparti les pertes selon le motif de chaque sortie, un seul chemin de code en représentait 86,5 %. Puis ce même bug nous a trompés une seconde fois.
Comment ceci a été réalisé : le code, les séries d'analyses et les premières versions de ce texte ont été produits par un assistant IA travaillant sous la direction de l'opérateur ; l'opérateur a pris toutes les décisions et vérifié les chiffres. Tout le trading était fictif (paper trading) : prix réels, aucun argent réel. Rien ici ne constitue un conseil en investissement.
Pertes par motif de sortie
| Motif de sortie | Sorties | Résultat, KRW | Moyenne | Taux de réussite | Durée de détention médiane |
|---|---|---|---|---|---|
| Sortie sur alarme non confirmée | 157 | −4 416 442 | −0,37 % | 10,2 % | 12 s |
| Durée de détention écoulée | 18 | −244 623 | −0,26 % | 38,9 % | 2 h |
| Sortie sur alarme confirmée | 6 | −684 389 | −2,10 % | 0 % | 14 min |
| Stop suiveur | 5 | +613 519 | +2,33 % | 100 % | 18 min |
| Stop-loss | 2 | −386 990 | −3,69 % | 0 % | 23 min |
| Autres | 2 | +13 194 | — | — | — |
157 des 190 sorties provenaient d'une seule règle : une alarme qui vendait immédiatement, sans confirmation, sans durée de détention minimale et sans vérifier que le prix avait réellement bougé. Ces sorties avaient une durée de détention médiane de 12 secondes. Leur coût d'aller-retour médian, mesuré dans le même registre, était de 0,43 %, si bien qu'elles perdaient de l'argent même lorsque le prix ne bougeait pas : 97 d'entre elles, soit 62 %, se sont terminées avec un prix à moins de 0,35 % de l'entrée et ont tout de même perdu.
Les sorties intervenues dans les 30 secondes suivant l'entrée, soit 114 trades, ont à elles seules représenté 63 % de l'ensemble des pertes.
Ce que faisait le code
Dans le même fichier, deux autres alarmes exigeaient déjà une étape de confirmation avant de vendre. Celle-ci avait été oubliée. Un module jumeau avait été corrigé pour le même problème plusieurs semaines plus tôt ; celui-ci ne l'avait pas été. Nous l'avons modifié pour qu'une alarme non confirmée ne puisse vendre qu'après une durée de détention minimale de 20 secondes, une perte réelle supérieure au coût d'aller-retour et six secondes de confirmation, tandis que les sorties de sécurité strictes, le stop-loss et la sortie sur krach, se déclenchaient toujours immédiatement.
Lors du rejeu du registre, la nouvelle règle aurait bloqué 143 des 157 sorties sur alarme. Nous ne l'avons pas présenté comme un gain. Bloquer une sortie signifie seulement ne pas payer l'aller-retour à ce moment-là ; ce que le prix a fait ensuite, si nous avions conservé la position, ne peut pas être prouvé à partir de ce registre.
La seconde erreur
L'audit a aussi montré que les trades issus de la fenêtre de signal de 3 minutes avaient perdu 4,42 millions de ₩ alors que la fenêtre de 1 heure avait gagné de l'argent, et nous avons recommandé de moins trader la fenêtre de 3 minutes. Un jour plus tard, nous avons retiré cette recommandation. 157 des 158 trades de la fenêtre de 3 minutes étaient précisément ces sorties sur alarme. Sans elles, la fenêtre de 3 minutes n'avait qu'un seul trade. Nous avions comparé deux chemins de code et en avions fait une différence entre unités de temps.
Ce même second audit a mis au jour un défaut apparenté : six sorties sur alarme confirmée avaient toutes vendu avant d'atteindre leur propre stop-loss, à −2,0 % en moyenne, et cinq des six cryptos étaient plus haut quinze minutes plus tard. Les alarmes primaient désormais sur le plan de risque. Nous les avons empêchées de vendre avant le niveau du stop.
Ce que nous en avons retenu
- Répartissez les pertes par motif de sortie et par chemin de code avant d'accuser la stratégie. Un seul bug peut ressembler exactement à une mauvaise stratégie.
- Une régularité repérée dans les données peut n'être que le bug sous un autre visage. Vérifiez si les groupes que vous comparez sont passés par le même code.
- Ne changez pas de politique sur la base de 8 à 12 trades.
- Conservez les preuves : seules 32 des 190 sorties avaient encore leurs relevés de prix postérieurs à la sortie, car un journal de 50 entrées avait écrasé le reste. Nous l'avons porté à 200.
Corriger le bug a supprimé un bug, pas le problème de fond : l'avantage de la stratégie par trade restait inférieur à ses coûts. Les six semaines au complet.