31 Ottobre 2026 · microstruttura

Abbiamo fatto il backtest su Binance e il paper trading su Bybit. L'edge era il lag.

Abbiamo fatto il backtest su Binance e il paper trading su Bybit. L'edge era il lag.

Avevamo una strategia momentum BTC a 1 minuto che su Binance sembrava onesta. Fee taker, funding, un termine di impatto a radice quadrata che avevamo già reso un po' troppo cattivo. Un walk-forward che non ci faceva sfigurare. Il conto paper viveva su Bybit, perché lì c'erano le chiavi. Mi ripetevo che BTC è BTC. Entro venerdì avevo una strategia che stava tradando un lead-lag che non potevamo fillare, e uno Sharpe che apparteneva a un exchange su cui non avevamo un conto.

Lunedì: un backtest pulito su Binance

L'agente aveva sputato fuori qualcosa di quasi noioso: rendimento a 15 barre contro una media lenta, long o short sull'open della barra successiva, flatten su uno stop o dopo 12 minuti. L'abbiamo forzata su Binance USD-M BTCUSDT, dal 2023 all'inizio del 2026, e ci siamo rifiutati di guardare qualsiasi cosa al lordo dei costi.

Dopo 4.0 bps taker, funding orario e impatto, lo Sharpe walk-forward stava a 1.6. L'edge netto medio per fill era 3.4 bps. Il numero di trade era abbastanza alto da farmi smettere di stuzzicare il bootstrap. Il padding di latenza che aggiungiamo già per il nostro stack (dal segnale all'ordine, 40 millisecondi in una buona giornata) lo muoveva a malapena. Ricordo di essere rimasto leggermente infastidito che non fosse più fragile.

Martedì: il conto paper inizia a "slittare"

Il paper è andato live alle 09:12 UTC. Stesso codice, stessi parametri, stessa regola del "next open", puntato sul BTCUSDT linear di Bybit. Il primo pomeriggio sembrava una sfilza di sfortuna. Fillavamo 2–8 bps peggio del replay Binance degli stessi minuti, sempre nella direzione del trade. Il blotter diceva slippage. Ho creduto al blotter finché i miss non si sono concentrati sui minuti in cui Binance aveva già iniziato a correre.

Nella notte il gap non ha fatto mean-revert nel modo in cui un modello di fill rumoroso fa mean-revert. È rimasto lì. Un buy su Bybit stampava a un prezzo che Binance aveva mostrato un attimo prima, poi arrivava Bybit, poi lo pagavamo. E i minuti che la strategia voleva erano i minuti in cui i due tape non erano d'accordo. Nei minuti quieti i close stavano uno sopra l'altro e alla strategia non importava. Stava selezionando la divergenza e chiamandola alpha.

3.4 bpsedge netto medio per fill Binance
4.1 bpsgap mediano del close sui minuti in cui abbiamo effettivamente tradato
1.6 → 0.4Sharpe walk-forward dopo un rerun nativo Bybit

Mercoledì: due tape, un orologio

Abbiamo tirato giù entrambi i feed last-trade, allineati sui timestamp degli exchange, e abbiamo fatto una domanda scomoda: quando BTC si muoveva di almeno 2 tick, quale venue stampava per prima? Nelle ore calme Binance guidava Bybit su circa due terzi di quei burst, lead mediano intorno ai 40 millisecondi, che sta dentro a un sacco di conversazioni da "abbiamo aggiunto latenza" e fuori da una barra da 1 minuto. Durante il dato CPI di martedì il lead si è allungato a centinaia di millisecondi, e per qualche secondo brutto i due last price distavano $80. Ero lì con entrambe le ladder aperte, a guardare Bybit rincorrere un film che Binance aveva già proiettato.

Quello era il sapore della settimana, e non sta nello Sharpe. Puoi saperlo, intellettualmente, che i last price crypto sono locali alla venue. È un'altra cosa vedere la stessa coin in due finestre e rendersi conto che una delle due vive nel passato.

Poi abbiamo fatto il test che avrei dovuto pretendere lunedì. Tieni il segnale Binance. Fill all'open successivo di Bybit. Quello è il vero information set del conto paper se sbirci il tape liquido e tradi altrove, ed è anche una forma di lookahead che non otterrai mai in size: stai usando un prezzo che la venue di esecuzione non ha ancora stampato. L'edge è andato a 0.6 bps. Invertilo (segnale Bybit, fill Binance) e conii una fantasia. Stessa venue Binance è rimasto a 3.4. La "strategia" era soprattutto stare sul book più veloce.

Se la venue del segnale guida la venue di esecuzione, ogni fill next-bar nel tape di ricerca è un prezzo che al conto non è ancora stato offerto. Mischiare quei clock non è un parametro di slippage. È un fill inventato.

Il gap del close a 1 minuto sui minuti in cui abbiamo tradato aveva una mediana di 4.1 bps. Incondizionato, su tutti i minuti, era circa 1.5. Ovvio. Il segnale scatta quando qualcuno ha già iniziato a muoversi. Stavamo misurando l'edge sul campione selezionato, che è esattamente dove vive il disaccordo tra venue.

Pensavo che il peggior bug di venue fosse il mapping dei simboli, BTCUSDT contro BTC-PERP, una join che duplica in silenzio una posizione. Quella è contabilità. Questo era guardare due book durante il CPI e accorgermi di aver ricercato un mercato che non trado.

Giovedì: funding, mark e fee non erano lo stesso mercato neanche loro

Una volta ammesso che i last price sono diversi, devi ammettere che lo è anche il resto del contratto di market data. Avevamo copiato il fee schedule di Binance in un conto paper Bybit e poi ci chiedevamo perché la riga dei costi andava alla deriva.

Inputbacktest Binancepaper Bybit, quella settimana
Ultimo prezzoBinance USD-MBybit linear
Fee taker4.0 bps5.5 bps
Intervallo di fundingorario00 / 08 / 16 UTC
Mark / indexpaniere Binancepaniere Bybit
Min qty / tick0.001 / 0.100.001 / 0.10
Matematica di liquidazionemai scattata, BTCmark diverso, comunque mai scattata

Tick e lot su BTC coincidevano per caso. Non generalizzerei. Sul book SOL che abbiamo sbirciato giovedì sera, tick size e min notional differivano entrambi, e il gap del close sui minuti di trade era 11 bps. Il funding era la fuga più lenta. Binance pagava ogni ora. Bybit era ancora sull'orologio da 8 ore per quel linear. Una posizione tenuta attraverso le 01:00 UTC prendeva un addebito Binance nel ledger di ricerca e silenzio nel paper, poi un grumo alle 08:00 che il backtest aveva già gocciolato. Il carry coincideva su una settimana e divergiva su un pomeriggio, che è esattamente l'orizzonte su cui viveva questa strategia.

Le fee erano quasi noiose, e comunque si sono mangiate 1.5 bps di una storia da 3.4 bps. La gente tratta 4.0 contro 5.5 come una nota a piè di pagina perché sembra piccolo accanto a un movimento giornaliero del 2%. Non è piccolo accanto a un edge di 3.4 bps. Lo sapevamo già. Avevamo solo applicato la conoscenza allo schedule della venue sbagliata.

Venerdì: un rerun nativo Bybit

Ricostruito tutto su OHLCV Bybit, timestamp di funding Bybit, 5.5 bps Bybit. Stesso code path, stessi tagli walk-forward, stessa funzione di impatto. Sharpe 0.4. Edge netto medio 0.9 bps, che sta dentro al rumore di una strategia taker a 1 minuto una volta che smetti di regalarti il first look di Binance.

Era un mercato diverso, non uno più rumoroso. Il paper non aveva bocciato il backtest perché il paper è "più realistico" in astratto. Il paper stava eseguendo in un book che la ricerca non aveva mai visto. L'1.6 era internamente coerente. Era coerente sull'exchange sbagliato.

Abbiamo lasciato la versione Binance in archivio con una nota sul report: non fare paper di questo conto contro questo tape. La versione Bybit è quella che può continuare a girare, a un numero di cui nessuno scriverebbe un thread. È l'esito corretto. Mi manca ancora un po' l'1.6, ed è così che capisci che stava facendo un lavoro che non si era guadagnato.

Cosa salteremmo la prossima volta

La scorciatoia era sociologica. Binance è il tape che ogni vendor, ogni notebook di ricerca, ogni default dell'agente vuole metterti in mano. Il conto è dovunque sei riuscito ad aprirlo davvero. Quei due fatti sembrano un dettaglio operativo. Sono il backtest.

  1. Scegli prima la venue di esecuzione. Costruisci il tape di ricerca dai last price, timestamp di funding, mark, tick e fee tier di quella venue. Se il default del vendor è Binance, quello non è un default. È una strategia diversa.
  2. Se non riesci a ottenere lo storico della venue su cui farai paper, non sostituire un tape che guida e chiamare slippage il gap. O aspetti, o tratti il tape straniero come un segnale ritardato e lo laghi finché avrebbe potuto essere visto nel book di esecuzione.
  3. Quando confronti paper e backtest, spezza il drift: gap del last price sui minuti di trade, riga delle fee, timestamp di funding, mark usato per gli stop. Il blotter di martedì mescolava tutti e quattro e li etichettava slippage.
  4. Fai apposta il test incrociato. Segnale su A, fill su B. Se è lì che vive tutto l'edge, non hai una strategia. Hai un lead-lag su cui non verrai fillato in size.

Darei ancora un'occhiata a Binance mentre trado Bybit? Per un sanity check discrezionale, certo. Per un fill, no. Il conto paper ci ha già detto quanto vale quella sbirciata. Vale i 4.1 bps che l'altra stanza ha stampato per prima, e quelli non li prendiamo.

futures cryptobacktestingpaper tradingmicrostruttura di mercatolead-lag
← Tutti gli articoli