5 septembre 2026 · risque

Votre backtest n’a jamais été liquidé : marge, mark price et seuil de levier que vous avez ignoré

Votre backtest n’a jamais été liquidé : marge, mark price et seuil de levier que vous avez ignoré

Le mois dernier, une stratégie générée a produit une courbe de capital avec un drawdown de 63%. Profond, brutal, puis une belle reprise au cours des six semaines suivantes — le genre de profil qu’un chercheur examine de près avant de conclure qu’il reste viable en réduisant la taille des positions. Je l’ai relancée dans un moteur de marge qui connaît les paliers de marge de maintenance. Le compte a été liquidé au jour 41, en plein milieu de ce drawdown, et tout ce qui venait après le jour 41 était de la fiction.

C’est le type de bug de backtest le plus coûteux que je connaisse, parce qu’il ne fausse pas vos rendements de quelques points de base. Il efface un état absorbant de la simulation. Une stratégie qui peut tomber à zéro et une stratégie qui ne le peut pas sont deux stratégies différentes, et un backtest qui ne vérifie jamais la marge ne peut pas vous dire laquelle vous avez.

Voici trois erreurs que je vois sans cesse.

Première erreur : traiter le levier comme un chiffre par lequel multiplier les rendements

Le cas le plus courant. Vous calculez une série de rendements à partir de vos signaux, décidez de la négocier avec un levier de 10x, puis multipliez. Parfois, c’est un peu plus élaboré — la taille de la position est equity * leverage / price — mais l’état du compte reste un simple nombre qui monte et qui descend. Pas de solde de marge, pas de plafond notionnel, pas de condition de liquidation.

Les dégâts sont subtils, ce qui explique que cette erreur passe les revues. Le Sharpe est invariant à l’échelle : votre chiffre vedette ne bouge pas quand vous passez d’un levier de 3x à 30x, et le chercheur en conclut que le levier est un réglage gratuit qui échange de la volatilité contre du rendement. Le drawdown maximal évolue linéairement et reste inférieur à 100% par accident arithmétique, car une série de rendements multipliés tend asymptotiquement vers zéro sans jamais le franchir. Multipliez une journée à -9% par 12 et vous obtenez -108% dans la version fidèle, contre « -108%, mais la courbe de capital reste positive » dans la version naïve, selon que vous avez composé les rendements ou que vous les avez additionnés. J’ai vu les deux.

Ce qui manque, c’est que le levier ne s’applique pas à vos rendements. Il s’applique à votre collatéral, une quantité finie que la plateforme surveille chaque seconde. Dès que son niveau passe sous l’exigence de maintenance, la position cesse de vous appartenir.

Le signe révélateur : si votre simulation ne peut pas produire une perte totale, quel que soit le levier, elle ne modélise pas le levier.

Deuxième erreur : un prix de liquidation calculé uniquement à partir du levier

Le deuxième niveau de sophistication ajoute une vérification de liquidation, généralement de cette façon : à 20x, un mouvement défavorable de 5% efface la marge, donc on liquide un long à l’entrée × 0.95. C’est net, intuitif, et faux à quatre égards différents à la fois.

Les plateformes de contrats perpétuels ne se basent pas sur votre réglage de levier pour décider quand votre position est liquidée. Elles appliquent un taux de marge de maintenance qui augmente par paliers avec le notionnel de la position, selon un tableau de paliers. Voici la forme approximative du barème BTCUSDT USDⓈ-M, qui évolue au fil des révisions des plateformes :

Notionnel de la position (USDT)Taux de marge de maintenanceLevier maximal
0 – 50,0000.40%125x
50,000 – 600,0000.50%100x
600,000 – 3,000,0001.00%50x
3,000,000 – 12,000,0002.50%20x
12,000,000 – 70,000,0005.00%10x

Ainsi, sur un long isolé, l’amplitude du mouvement défavorable que vous pouvez absorber est d’environ 1/L − MMR, et non 1/L. À 20x dans le deuxième palier, cela donne 5% − 0.5% = 4.5%. Un demi-pour cent, ça semble être un arrondi. Sur le BTC à 84,000, cela représente 420 dollars de variation du cours ; lors d’une heure de forte volatilité, ces 420 dollars font la différence entre une mèche qui vous sort de la position et une qui ne vous sort pas. Chaque mèche est un pile ou face, et vous avez truqué tous les tirages en votre faveur.

Viennent ensuite les frais. Les frais taker à l’entrée sont déduits de votre marge dès que votre ordre est exécuté : 0.045% sur un notionnel de 500,000 représente 225 USDT sur un solde de marge de 25,000, ce qui déplace le prix de liquidation avant même que la position ait évolué. Le funding produit le même effet en continu et, appliqué au notionnel avec levier, il est bien plus important que ce à quoi les chercheurs s’attendent :

4.55%mouvement défavorable réel avant liquidation à 20x, frais d’entrée compris
0.60%coût quotidien du funding rapporté à la marge à 20x, 0.01%/8h
18%de cette marge perdue en un mois sans mouvement

Une position qui ne fait rien pendant trente jours — aucun mouvement défavorable, aucune transaction — a consommé près d’un cinquième de son collatéral et rapproché sensiblement son prix de liquidation. Voici les troisième et quatrième erreurs : les paliers changent quand vous augmentez la position ; une position qui commence dans le palier à 0.5% et dont la taille augmente jusqu’au palier à 1.0% a un prix de liquidation moins favorable que celui calculé à l’entrée. Et la marge croisée mutualise le collatéral entre les positions : la survie de votre long BTC dépend donc de ce que fait votre short ETH. Si vous simulez la marge croisée comme un ensemble de positions isolées indépendantes, vous avez inversé la structure de corrélation de votre propre compte.

Troisième erreur : exécuter la liquidation au mauvais prix, au mauvais moment et au mauvais niveau

Supposons que vous ayez correctement déterminé le seuil de déclenchement. Reste à savoir : quel prix le franchit, quand vérifiez-vous ce franchissement et à quel prix votre position est-elle exécutée ?

La liquidation se déclenche sur le mark price, un indice composé de plusieurs plateformes au comptant et d’une composante de base lissée, conçu précisément pour résister aux mèches sur une seule plateforme. Votre stop-loss, selon sa configuration, se déclenche probablement sur le dernier cours négocié. Ces deux prix divergent exactement au moment où cela compte le plus. Lors d’une cascade, le dernier cours du contrat perpétuel peut s’écarter de 1–2% sous le mark pendant des dizaines de secondes. Un backtest qui déclenche à la fois le stop et la liquidation sur le plus bas OHLCV simule une plateforme qui n’existe pas.

Les deux erreurs sont présentes ici et elles ne s’annulent pas. Avec le dernier cours, vous êtes liquidé sur des mèches ignorées par la plateforme. Avec le mark price, vous manquez le cas où le mark lui-même a bougé : une dislocation de l’indice sur une plateforme au comptant peut réellement entraîner une liquidation à un prix qui n’a jamais été affiché sur le contrat perpétuel que vous négociiez.

Reste le prix d’exécution. Les moteurs naïfs clôturent la position au prix de liquidation et comptabilisent la perte comme s’il s’agissait d’un stop. En réalité, le moteur de liquidation reprend la position au prix de faillite — le niveau auquel votre marge est exactement à zéro, inférieur au seuil de déclenchement — puis prélève en plus des frais de liquidation, qui dépendent du palier et avoisinent 1% du notionnel dans les paliers inférieurs. À 20x, 1% du notionnel représente 20% de la marge restante. Si le moteur exécute la position sous le prix de faillite, le fonds d’assurance couvre l’écart ; sur certaines plateformes, si le fonds est épuisé, les pertes socialisées touchent aussi les positions gagnantes du carnet. Votre perte réalisée ne correspond pas au drawdown jusqu’au prix de liquidation. Elle est plus élevée, et l’écart est maximal précisément les jours où le carnet était assez peu profond pour aggraver la situation.

La question du timing liée aux mécanismes intrabar se pose ici avec des conséquences encore plus sévères que d’habitude. Si une bougie de 1-minute contient à la fois votre take-profit et votre seuil de liquidation, un backtest qui vérifie les sorties avant la marge comptabilisera sans hésiter le gain. La plateforme vérifie la marge à chaque mise à jour du mark price, environ une fois par seconde, avant tout ce que vous auriez voulu voir se produire.

Ce que le moteur doit suivre à la place

Rien de tout cela n’a besoin d’être sophistiqué. Le moteur doit simplement conserver l’état du compte. Le compte est un objet avec un solde, pas une série de rendements, et chaque bougie le met à jour dans l’ordre suivi par la plateforme :

  1. Le solde du portefeuille et le PnL non réalisé, séparément. Le ratio de marge correspond à la marge de maintenance divisée par le solde de marge, qui inclut le PnL non réalisé. Les confondre donne l’impression qu’une position perdante est mieux garantie qu’elle ne l’est.
  2. Le tableau des paliers de chaque symbole, avec sa version datée. Les paliers sont révisés. Un backtest de 2023 exécuté avec les paliers de 2026 introduit un biais subtil d’anticipation — généralement favorable, puisque les plateformes ont en règle générale assoupli les exigences sur les principaux actifs au fil du temps.
  3. Une série de mark price, pas seulement des klines. Si vous ne pouvez pas obtenir l’historique du mark price, indiquez-le dans les résultats et utilisez une approximation prudente. Ne le remplacez jamais silencieusement par le dernier cours.
  4. La vérification de marge en premier dans l’ordre des événements de la bougie, avant les stops, les objectifs, les signaux ou le rééquilibrage.
  5. L’exécution au prix de faillite, plus les frais de liquidation, dont le taux est lu dans la même ligne du palier que le MMR.
  6. Un état terminal absorbant. Quand les fonds propres atteignent zéro, la simulation s’arrête. Pas de réinitialisation, pas de « supposons que le trader ajoute des fonds », pas de reprise de la série avec un nouveau notionnel.

C’est ce dernier point qui suscite le plus de discussions. Quelqu’un fait toujours remarquer qu’un vrai desk déposerait davantage de collatéral, et qu’arrêter la simulation est donc excessivement sévère. Peut-être. Mais « cette stratégie fonctionne si vous continuez à la financer après qu’elle a tout perdu » est une affirmation qui mérite d’être formulée ainsi et testée volontairement, avec les apports de fonds comme paramètre explicite, au lieu d’être glissée par défaut dans le modèle. Une fois que vous l’écrivez clairement, la plupart des gens se rendent compte que ce n’était pas ce qu’ils voulaient dire.

Le résultat pratique : quand vous exécutez la même stratégie en simulation face à la plateforme en direct, le ratio de marge communiqué par la plateforme et celui calculé par votre simulateur devraient rester à un ou deux points de base près tout au long de la journée. Cette concordance se vérifie gratuitement chaque minute, sur chaque position ouverte. C’est le test de parité le moins coûteux de toute la pile, et presque personne ne l’exécute. Quand les deux chiffres divergent, la plateforme a raison et vous avez un bug à trouver avant que le drawdown ne le fasse à votre place.

contrats à terme perpétuelslevierliquidationmoteur de margebacktesting
← Tous les articles