Kl. 10:14 UTC köpte en enkel utbrottsstrategi en evig kryptotermin efter att priset passerat sin 20-minutershögsta. Backtestet visade en fill på $64,210. Det talet fanns i datan, signalen hade korrekt tidsstämpel och den simulerade ordern kom fram på nästa stapel. Vi var nära att kalla resultatet rent.
Sedan jämförde vi instrument-ID:n. Signalen kom från den eviga BTCUSDT-terminen. Fillen kom från ett BTCUSD-inverskontrakt. Båda handlades nära $64,210, och båda var likvida marknader. Ändå var det olika orderböcker, med olika priser, tickstorlekar, djup och avgiftsstrukturer. Backtestet hade sytt ihop en marknad som ingen handlare kunde nå.
Strategin i sig var okomplicerad: gå in vid en stängning över det rullande högsta värdet, gå ur vid en stängning under det rullande lägsta värdet och dimensionera varje position efter en fast risk i dollar. Problemet visade sig först när vi ställde en mer precis fråga än ”vad var BTC värt?” Vi frågade: ”Vad hade den här ordern kunnat köpa i exakt det här kontraktet vid den tidpunkten?”
Diagrammet var ett sammansatt diagram redan innan strategin kördes
Vårt researchflöde gjorde det enkelt att jämföra handelsplatser. Det normaliserade symboler och visade en konsoliderad prisserie. Det var praktiskt för att följa marknaden, men en dålig referens för exekvering. En sammansatt serie kan visa det bästa priset över flera börser, trots att strategin bara kan skicka en order till en enda handelsplats.
Vid utbrottet var den konsoliderade stapelns högsta värde $64,205. Det valda kontraktets egen senaste handel hade redan nått $64,218. Samtidigt visade en cachad kurs för inverskontraktet fortfarande en säljkurs på $64,210. Simuleringen använde utbrottet från en serie och den fördelaktiga säljkursen från en annan. Båda värdena var verkliga. Kombinationen var påhittad.
| Indata | Vad backtestet använde | Vad ordern behövde |
|---|---|---|
| Utbrottets högsta värde | Konsoliderat BTC-pris | Det valda kontraktets egen prishistorik |
| Referens för inträde | Cachad säljkurs för inverskontraktet | Färsk säljkurs för det handlade instrumentet |
| Fillkvantitet | Begärd positionsstorlek | Kvantitet tillgänglig på varje prisnivå |
En rad i en marknadsdatatabell kan se komplett ut, samtidigt som fälten beskriver olika marknader. Ett symbolalias bevisar inte att två instrument delar orderbok. Kontrakts-ID, handelsplats, noteringsvaluta och tidsstämpel måste följa med genom hela kedjan från signalgenerering till exekvering.
Vi spelade upp ordern mot orderboken
Vi körde om inträdet med den valda eviga terminens egen bästa säljkurs och de orderboksuppdateringar som fanns tillgängliga vid beslutstillfället. Kursen var färsk, men endast 0.18 BTC fanns på den översta nivån. Vår simulerade order var 0.50 BTC. Återstående 0.32 BTC skulle ha tagit likviditet på högre säljkurser.
Det justerade inträdet låg $21 sämre per BTC än det angivna fillpriset, före avgifter. Det är en liten skillnad på en enskild affär. Men under testet kom det mesta av strategins bruttovinst från en handfull snabba utbrott. När vi spelade upp inträdena mot rätt orderböcker sjönk bruttoresultatet med 31 %; taker-avgifter och priseffekt minskade det ytterligare.
Vi hittade också två fall där kursen från orderbokens bästa nivå kom fram efter signalens beslutstid. Ett backtest som kopplar ihop data via närmaste tidsstämpel kan i tysthet välja en framtida uppdatering. Nu kopplar vi i stället bakåt: kursen måste ha observerats när ordern skickades, och vi registrerar dess ålder. Om den senaste användbara kursen är för gammal markerar simuleringen ordern som omöjlig att fylla eller tillämpar en uttrycklig regel för inaktuell data.
Vad som krävs för ett handlingsbart pris
En stapelstängning är användbar för att beräkna en signal. Den visar inte att en viss order hade kunnat fyllas där. För det måste priset gälla exakt rätt instrument och handelsplats, vara tillgängligt när ordern anländer och ha tillräcklig kvantitet på motsatt sida för den begärda storleken. När datan inte kan besvara de frågorna är ett intervall eller en utebliven fill det ärliga resultatet, inte ett påhittat exakt pris.
Vi behöll den konsoliderade serien för marknadssammanhang och tog bort den från exekveringsflödet. Signalerna hänvisar nu till det valda kontraktets egen historik; order spelas upp mot kontraktets orderbok, och avgifter och storlek tillämpas efter att fillen har beräknats. Lite mer kringarbete, och en betydligt mindre smickrande avkastningskurva.
Det där utbrottet inträffade faktiskt. Backtestet gav det bara en bättre marknad än den strategin hade valt.
← Alla inlägg


