À 10:14 UTC, une stratégie de cassure simple a acheté un contrat perpétuel crypto après que le prix a franchi son plus haut sur 20 minutes. Le backtest indiquait une exécution à 64 210 $. Ce chiffre figurait dans les données, le signal portait le bon horodatage et l’ordre simulé arrivait à la barre suivante. Nous avons failli conclure que le résultat était propre.
Puis nous avons aligné les identifiants des instruments. Le signal provenait du contrat perpétuel BTCUSDT. L’exécution, elle, provenait d’un contrat inverse BTCUSD. Les deux se négociaient autour de 64 210 $, et les deux marchés étaient liquides. Mais leurs carnets d’ordres étaient différents, tout comme leurs prix, leurs pas de cotation, leur profondeur et leurs grilles de frais. Le backtest avait assemblé un marché auquel aucun trader ne pouvait accéder.
La stratégie en elle-même n’avait rien de remarquable : entrer à la clôture au-dessus du plus haut glissant, sortir à la clôture sous le plus bas glissant et dimensionner chaque position selon un risque fixe en dollars. Le problème n’est apparu que lorsque nous avons posé une question plus précise que « combien valait le BTC ? » Nous avons demandé : « Qu’aurait pu acheter cet ordre dans ce contrat précis à cet instant ? »
Avant même le lancement de la stratégie, le graphique était déjà composite
Notre flux de recherche facilitait la comparaison des plateformes. Il normalisait les symboles et affichait une série de prix consolidée. Pratique pour observer le marché, cette série constituait une mauvaise référence pour l’exécution. Un composite peut afficher le meilleur prix sur plusieurs plateformes, alors que la stratégie ne peut envoyer un ordre que sur une seule.
Au moment de la cassure, le plus haut de la barre consolidée était de 64 205 $. Le dernier échange sur le contrat sélectionné avait déjà fait monter son prix à 64 218 $. Pendant ce temps, une cotation mise en cache pour le contrat inverse affichait toujours une offre de vente à 64 210 $. Le simulateur a combiné la cassure d’une série avec l’offre de vente avantageuse d’une autre. Chaque valeur était réelle. Leur combinaison, elle, était fictive.
| Donnée | Utilisation dans le backtest | Ce qu’exigeait l’ordre |
|---|---|---|
| Plus haut de la cassure | Prix consolidé du BTC | Historique des prix du contrat sélectionné |
| Référence d’entrée | Offre de vente mise en cache du contrat inverse | Offre de vente récente de l’instrument négocié |
| Quantité exécutée | Taille de position demandée | Quantité disponible à chaque niveau de prix |
Une ligne d’un tableau de données de marché peut sembler complète alors que ses champs décrivent différents marchés. Un alias de symbole ne prouve pas que deux instruments partagent le même carnet. L’identifiant du contrat, la plateforme, la devise de cotation et l’horodatage doivent rester associés tout au long de la génération du signal et de l’exécution.
Nous avons rejoué l’ordre dans le carnet
Nous avons recalculé l’entrée à partir de la meilleure offre de vente propre au contrat perpétuel sélectionné et des mises à jour du carnet disponibles au moment de la décision. La cotation était récente, mais seulement 0,18 BTC se trouvait au meilleur niveau. Notre ordre simulé portait sur 0,50 BTC. Les 0,32 BTC restants auraient été exécutés aux niveaux d’offre supérieurs.
La nouvelle entrée coûtait 21 $ de plus par BTC que le prix d’exécution affiché, avant frais. L’écart est faible sur une seule transaction. Mais sur l’ensemble du test, la stratégie réalisait l’essentiel de son bénéfice brut sur quelques cassures rapides. Le rejeu de ces entrées dans les bons carnets a réduit le résultat brut de 31 % ; les frais taker et l’impact de marché l’ont encore diminué.
Nous avons aussi trouvé deux cas où la cotation du meilleur niveau du carnet est arrivée après l’heure de décision du signal. Un backtest qui associe les données à l’horodatage le plus proche peut discrètement choisir une mise à jour future. Nous faisons désormais une jointure rétrospective : la cotation doit avoir été observée au moment de l’envoi de l’ordre, et nous enregistrons son ancienneté. Si la dernière cotation exploitable est trop ancienne, le simulateur marque l’ordre comme inexécutable ou applique une règle explicite de données périmées.
Les conditions d’un prix négociable
Le cours de clôture d’une barre est utile pour calculer un signal. Il ne prouve pas qu’un ordre donné aurait pu être exécuté à ce prix. Pour cela, le prix doit correspondre à l’instrument et à la plateforme exacts, être disponible à l’arrivée de l’ordre et s’accompagner d’une quantité opposée suffisante pour la taille demandée. Si les données ne permettent pas de répondre à ces questions, le résultat honnête est une fourchette ou une exécution manquante, pas un prix exact inventé.
Nous avons conservé la série consolidée pour donner le contexte du marché, mais l’avons retirée du processus d’exécution. Les signaux s’appuient désormais sur l’historique propre au contrat choisi ; les ordres sont rejoués dans le carnet de ce contrat, et les frais et la taille sont pris en compte une fois l’exécution calculée. Un peu plus de plomberie, et une courbe de capital beaucoup moins flatteuse.
Cette cassure a bien eu lieu. Le backtest lui a simplement offert un meilleur marché que celui qu’avait sélectionné la stratégie.
← Tous les articles


