Alle 10:14 UTC, una semplice strategia breakout ha acquistato un perpetual crypto dopo che il prezzo ha superato il massimo degli ultimi 20 minuti. Il backtest ha mostrato un’esecuzione a $64,210. Quel valore era presente nei dati, il segnale aveva la marcatura temporale corretta e l’ordine simulato è arrivato sulla barra successiva. Stavamo per considerarlo un risultato pulito.
Poi abbiamo allineato gli ID degli strumenti. Il segnale proveniva dal perpetual BTCUSDT. L’esecuzione era su un contratto inverso BTCUSD. Entrambi scambiavano intorno a $64,210 ed erano mercati liquidi. Ma avevano book degli ordini diversi, con prezzi, tick size, profondità e commissioni differenti. Il backtest aveva cucito insieme un mercato a cui nessun trader poteva accedere.
La strategia in sé era ordinaria: entrare alla chiusura sopra il massimo mobile, uscire alla chiusura sotto il minimo mobile e dimensionare ogni posizione in base a un rischio fisso in dollari. Il problema è emerso solo quando ci siamo posti una domanda più precisa di «quanto valeva BTC?». Ci siamo chiesti: «che cosa avrebbe potuto comprare questo ordine in questo preciso contratto, in quel momento?»
Il grafico era un composito già prima che la strategia venisse eseguita
Il nostro feed di ricerca rendeva facile confrontare le piattaforme. Normalizzava i simboli e mostrava una serie di prezzi aggregata. Era comodo per osservare il mercato, ma poco adatto come riferimento per l’esecuzione. Un composito può mostrare il miglior prezzo tra più exchange, anche se la strategia può inviare un ordine a una sola piattaforma.
Al momento del breakout, il massimo della barra aggregata era $64,205. L’ultimo scambio del contratto selezionato era già arrivato a $64,218. Nel frattempo, una quotazione memorizzata nella cache per il contratto inverso mostrava ancora un ask a $64,210. Il simulatore ha usato il breakout di una serie e l’ask vantaggioso di un’altra. Entrambi i valori erano reali. La loro combinazione era fittizia.
| Dato | Cosa ha usato il backtest | Cosa serviva all’ordine |
|---|---|---|
| Massimo del breakout | Prezzo aggregato di BTC | Storico dei prezzi del contratto selezionato |
| Riferimento d’ingresso | Ask memorizzato nella cache del contratto inverso | Ask aggiornato dello strumento negoziato |
| Quantità eseguita | Dimensione della posizione richiesta | Quantità disponibile a ogni livello di prezzo |
Una riga di una tabella di dati di mercato può sembrare completa, anche quando i suoi campi descrivono mercati diversi. Un alias del simbolo non dimostra che due strumenti condividano lo stesso book. L’ID del contratto, la piattaforma, la valuta di quotazione e la marcatura temporale devono restare associati durante la generazione del segnale e l’esecuzione.
Abbiamo riprodotto l’ordine sul book
Abbiamo ricalcolato l’ingresso usando il miglior ask del perpetual selezionato e gli aggiornamenti del book degli ordini disponibili al momento della decisione. La quotazione era aggiornata, ma al livello migliore c’erano solo 0.18 BTC. Il nostro ordine simulato era di 0.50 BTC. I restanti 0.32 BTC avrebbero raggiunto ask più alti.
Al netto delle commissioni, il prezzo d’ingresso corretto era di $21 più alto per BTC rispetto al prezzo di esecuzione riportato. È una differenza contenuta su una singola operazione. Nel complesso del test, però, la strategia realizzava gran parte del profitto lordo con una manciata di breakout rapidi. Riprodurre quegli ingressi sui book corretti ha ridotto il risultato lordo del 31%; le commissioni taker e l’impatto sul mercato lo hanno ridotto ulteriormente.
Abbiamo anche trovato due casi in cui la quotazione del primo livello del book è arrivata dopo il momento in cui il segnale aveva preso la decisione. Un backtest che abbina i dati in base alla marcatura temporale più vicina può selezionare di nascosto un aggiornamento futuro. Ora abbiniamo i dati andando a ritroso: la quotazione deve essere stata osservata entro il momento dell’invio dell’ordine e ne registriamo l’età. Se l’ultima quotazione utilizzabile è troppo vecchia, il simulatore segna l’ordine come non eseguibile oppure applica una regola esplicita per i dati obsoleti.
Cosa serve per avere un prezzo negoziabile
La chiusura di una barra è utile per calcolare un segnale. Non dimostra che un determinato ordine avrebbe potuto essere eseguito a quel prezzo. A tal fine, il prezzo deve appartenere allo strumento e alla piattaforma esatti, essere disponibile al momento dell’arrivo dell’ordine e avere una quantità sufficiente sul lato opposto per la dimensione richiesta. Se i dati non consentono di rispondere a queste domande, il risultato corretto è un intervallo o un’esecuzione mancante, non un prezzo esatto inventato.
Abbiamo mantenuto la serie aggregata per il contesto di mercato, togliendola dal flusso di esecuzione. Ora i segnali fanno riferimento allo storico del contratto scelto; gli ordini vengono riprodotti sul book di quel contratto, applicando le commissioni e la dimensione dopo aver calcolato l’esecuzione. Un po’ più di lavoro di collegamento e una curva azionaria molto meno lusinghiera.
Quel breakout c’è stato davvero. Semplicemente, il backtest gli ha assegnato un mercato migliore di quello che la strategia aveva selezionato.
← Tutti gli articoli


