31 octobre 2026 · microstructure

Nous avons backtesté sur Binance et paper-tradé sur Bybit. L'avantage, c'était le lag.

Nous avons backtesté sur Binance et paper-tradé sur Bybit. L'avantage, c'était le lag.

Nous avions une stratégie de momentum BTC à 1 minute qui avait l'air honnête sur Binance. Frais taker, funding, un terme d'impact en racine carrée que nous avions déjà rendu un peu trop sévère. Un walk-forward qui ne nous faisait pas honte. Le compte paper vivait sur Bybit, parce que c'est là que se trouvaient les clés. Je me suis dit que BTC, c'est BTC. Vendredi, j'avais une stratégie qui avait tradé un lead-lag que nous ne pouvions pas filler, et un Sharpe qui appartenait à une place sur laquelle nous n'avions pas de compte.

Lundi : un backtest Binance propre

L'agent avait recraché quelque chose de presque ennuyeux : rendement sur 15 barres contre une moyenne lente, long ou short à l'open de la barre suivante, aplatir sur un stop ou au bout de douze minutes. Nous l'avons forcé sur Binance USD-M BTCUSDT, de 2023 au début de 2026, et nous avons refusé de regarder quoi que ce soit brut de coûts.

Après 4.0 bps taker, le funding horaire et l'impact, le Sharpe walk-forward s'établissait à 1.6. L'avantage net moyen par fill était de 3.4 bps. Le nombre de trades était assez élevé pour que j'arrête de chipoter le bootstrap. La marge de latence que nous ajoutons déjà pour notre propre stack (du signal à l'ordre, 40 millisecondes un bon jour) n'y changeait presque rien. Je me souviens d'avoir été vaguement agacé que ce ne soit pas plus fragile.

Mardi : le compte paper commence à « glisser »

Le paper est passé live à 09:12 UTC. Même code, mêmes paramètres, même règle « open suivant », pointé sur le BTCUSDT linear de Bybit. Le premier après-midi ressemblait à une série noire. Nous fillions 2–8 bps plus mal que le replay Binance des mêmes minutes, toujours dans le sens du trade. Le blotter disait slippage. J'ai cru le blotter jusqu'à ce que les ratés se regroupent sur les minutes où Binance avait déjà commencé à courir.

Pendant la nuit, l'écart n'est pas revenu à la moyenne comme un modèle de fill bruyant revient à la moyenne. Il est resté là. Un achat sur Bybit s'imprimait à un prix que Binance avait montré un instant plus tôt, puis Bybit arrivait, puis nous le payions. Et les minutes que la stratégie voulait étaient les minutes où les deux tapes n'étaient pas d'accord. Les minutes calmes, les closes se superposaient et la stratégie s'en fichait. Elle sélectionnait la divergence et appelait ça de l'alpha.

3.4 bpsavantage net moyen par fill Binance
4.1 bpsécart de close médian sur les minutes réellement tradées
1.6 → 0.4Sharpe walk-forward après un rerun natif Bybit

Mercredi : deux tapes, une horloge

Nous avons tiré les deux flux last-trade, alignés sur les timestamps des places, et posé une question impolie : quand le BTC bougeait d'au moins deux ticks, quelle place imprimait en premier ? Aux heures calmes, Binance menait Bybit sur environ deux tiers de ces bursts, lead médian autour de 40 millisecondes, ce qui rentre dans beaucoup de conversations « on a ajouté de la latence » et sort d'une barre de 1 minute. Pendant le print CPI de mardi, le lead s'étirait sur des centaines de millisecondes, et pendant quelques secondes laides les deux last prices étaient à $80 d'écart. J'étais là, les deux ladders ouvertes, à regarder Bybit courir après un film que Binance avait déjà projeté.

C'était la saveur de la semaine, et ce n'est pas dans le Sharpe. On peut savoir, intellectuellement, que les last prices crypto sont locaux à la place. C'est autre chose de voir le même coin dans deux fenêtres et de réaliser que l'une d'elles vit dans le passé.

Puis nous avons fait le test que j'aurais dû exiger lundi. Garder le signal Binance. Filler à l'open suivant de Bybit. C'est l'ensemble d'information réel du compte paper si vous jetez un œil à la tape liquide et tradez ailleurs, et c'est aussi une forme de lookahead que vous n'aurez jamais en taille : vous utilisez un prix que la place d'exécution n'a pas imprimé. L'avantage est passé à 0.6 bps. Inversez (signal Bybit, fill Binance) et vous fabriquez une fantaisie. Binance same-venue restait à 3.4. La « stratégie », c'était surtout d'être sur le carnet le plus rapide.

Si votre place de signal mène votre place d'exécution, chaque fill next-bar dans la tape de recherche est un prix que le compte ne s'est pas encore vu offrir. Mélanger ces horloges n'est pas un paramètre de slippage. C'est un fill inventé.

L'écart de close à 1 minute sur les minutes tradées avait une médiane de 4.1 bps. Inconditionnel, sur toutes les minutes, c'était environ 1.5. Évidemment. Le signal se déclenche quand quelqu'un a déjà commencé à bouger. Nous mesurions l'avantage sur l'échantillon sélectionné, exactement là où vit le désaccord entre places.

Je pensais que le pire bug de place, c'était le mapping de symboles, BTCUSDT versus BTC-PERP, un join qui duplique silencieusement une position. Ça, c'est de la comptabilité. Là, c'était regarder deux carnets pendant le CPI et constater que j'avais recherché un marché que je ne trade pas.

Jeudi : le funding, les marks et les frais n'étaient pas le même marché non plus

Une fois qu'on admet que les last prices sont différents, il faut admettre que le reste du contrat de market data l'est aussi. Nous avions copié le barème de frais Binance dans un compte paper Bybit, puis nous nous étions demandé pourquoi la ligne de coûts dérivait.

EntréeBacktest BinancePaper Bybit, cette semaine-là
Last priceBinance USD-MBybit linear
Frais taker4.0 bps5.5 bps
Intervalle de fundinghoraire00 / 08 / 16 UTC
Mark / indexpanier Binancepanier Bybit
Qty min / tick0.001 / 0.100.001 / 0.10
Math de liquidationjamais touché, BTCmark différent, toujours jamais touché

Le tick et le lot se trouvaient identiques sur le BTC. Je ne généraliserais pas. Sur le carnet SOL que nous avons regardé jeudi soir, la tick size et le notionnel min différaient tous les deux, et l'écart de close sur les minutes tradées était de 11 bps. Le funding était la fuite plus lente. Binance payait à l'heure. Bybit était encore sur le cycle de huit heures pour ce linear. Une position tenue à travers 01:00 UTC prenait une charge Binance dans le ledger de recherche et le silence en paper, puis un paquet à 08:00 que le backtest avait déjà versé au goutte-à-goutte. Le carry concordait sur une semaine et divergait sur un après-midi, ce qui est exactement l'horizon sur lequel vivait cette stratégie.

Les frais étaient presque ennuyeux, et ils ont quand même mangé 1.5 bps d'une histoire à 3.4 bps. Les gens traitent 4.0 versus 5.5 comme une note de bas de page parce que ça a l'air petit à côté d'un mouvement quotidien de 2%. Ce n'est pas petit à côté d'un avantage de 3.4 bps. Nous le savions déjà. Nous avions juste appliqué ce savoir au barème de la mauvaise place.

Vendredi : un rerun natif Bybit

Tout reconstruire sur l'OHLCV Bybit, les stamps de funding Bybit, les 5.5 bps Bybit. Même chemin de code, mêmes coupes walk-forward, même fonction d'impact. Sharpe 0.4. Avantage net moyen 0.9 bps, ce qui rentre dans le bruit d'une stratégie taker à 1 minute une fois qu'on arrête de lui offrir le premier regard de Binance.

C'était un marché différent, pas un marché plus bruyant. Le paper n'avait pas rejeté le backtest parce que le paper est « plus réaliste » dans l'abstrait. Le paper exécutait dans un carnet que la recherche n'avait jamais vu. Le 1.6 était cohérent en interne. Il était cohérent à propos de la mauvaise place.

Nous avons laissé la version Binance dans les archives avec une note sur le rapport : ne pas paper ce compte contre cette tape. La version Bybit est celle qui a le droit de continuer à tourner, à un chiffre dont personne n'écrirait un thread. C'est le bon résultat. Il me manque encore un peu le 1.6, et c'est comme ça qu'on sait qu'il faisait un travail qu'il n'avait pas mérité.

Ce qu'on sauterait la prochaine fois

Le raccourci était sociologique. Binance est la tape que chaque vendor, chaque notebook de recherche, chaque défaut d'agent veut vous tendre. Le compte est là où vous avez réellement pu l'ouvrir. Ces deux faits ont l'air d'un détail opérationnel. Ils sont le backtest.

  1. Choisissez d'abord la place d'exécution. Construisez la tape de recherche à partir des last prices, stamps de funding, marks, ticks et palier de frais de cette place. Si le défaut du vendor est Binance, ce n'est pas un défaut. C'est une stratégie différente.
  2. Si vous ne pouvez pas obtenir l'historique de la place sur laquelle vous allez paper, ne substituez pas une tape qui mène et n'appelez pas l'écart du slippage. Soit attendez, soit traitez la tape étrangère comme un signal retardé et laggez-la jusqu'à ce qu'elle ait pu être vue dans le carnet d'exécution.
  3. Quand vous comparez le paper au backtest, séparez la dérive : écart de last price sur les minutes tradées, ligne de frais, timestamps de funding, mark utilisé pour les stops. Le blotter de mardi mélangeait les quatre et les étiquetait slippage.
  4. Lancez le test croisé exprès. Signal sur A, fill sur B. Si c'est là que vit tout l'avantage, vous n'avez pas de stratégie. Vous avez un lead-lag sur lequel vous ne serez pas fillé en taille.

Est-ce que je jetterais encore un œil à Binance quand je trade Bybit ? Pour un sanity check discrétionnaire, bien sûr. Pour un fill, non. Le compte paper nous a déjà dit ce que ce coup d'œil vaut. Il vaut les 4.1 bps que l'autre salle a imprimés en premier, et ceux-là, nous ne les avons pas.

futures cryptobacktestingpaper tradingmicrostructure de marchélead-lag
← Tous les articles