Klockan 08:00 UTC en tisdag ändrade en kryptohandelsplats tickstorleken för ett perpetualkontrakt i mellanprisklassen. Vår basisstrategi märkte ingenting. Signalen såg fortfarande samma spread mellan spot och terminer, riskgränserna var oförändrade och backtestet fortsatte att ge samma resultat.
Pappershandeln märkte det åt den. Orderadaptern avrundade en köporder med limit nedåt till närmaste tillåtna pris. Det placerade ordern ett tick under nivån som backtestet hade modellerat. Marknaden nådde det gamla priset, den simulerade ordern fick avslut och pappersordern blev liggande utan avslut. Vid lunchtid var strategins lagerfördelning skev.
Händelsen såg ut som ett litet avrundningsfel. I själva verket handlade det om en gräns i modellen: strategin kände till priserna, men backtestet kände inte till handelsplatsens prissteg.
Vi handlade på en enkel basissignal: vi köpte spot och sålde ett perpetualkontrakt när terminspremien steg över en tröskel. Orderna var passiva eftersom den förväntade basisfördelen var liten. Några få tick kunde avgöra om positionen gav tillräckligt för att täcka avgifterna och den senare stängningen.
Vad förändrades när tickstorleken ändrades?
Före uppdateringen accepterade perpetualkontraktet priser i steg om 0.01. Därefter accepterade det steg om 0.05 i det aktuella prisintervallet. Signalen räknade fram ett målpris för försäljning på 42,318.03, ett giltigt pris enligt den gamla regeln. Enligt den nya var priset ogiltigt.
Börsen avvisade ogiltiga priser, men vår adapter hade en reservlösning: den avrundade säljpriset nedåt till 42,318.00. Även det priset var ogiltigt. En andra reservlösning avrundade på nytt, den här gången till 42,318.05, vilket var giltigt men mindre fördelaktigt för säljaren. Ordern kunde inte längre säljas till det modellerade priset. Kodvägen hade skrivits för en annan marknad och omvandlade i tysthet avvisningen till ett omprissatt orderpris.
Den här ordern aktualiserade två skilda frågor. För det första: vilket pris får handelsplatsen acceptera? För det andra: hur ska strategin agera när det önskade priset inte följer prisstegen? Börsen besvarar den första frågan. Strategin eller exekveringspolicyn måste besvara den andra.
| Orderavsikt | Prisregel | Vanlig avrundningsriktning | Möjlig påverkan |
|---|---|---|---|
| Köporder med limit | Priset måste vara en multipel av tickstorleken | Nedåt, så att priset håller sig vid eller under limitpriset | Lägre sannolikhet för avslut |
| Säljorder med limit | Priset måste vara en multipel av tickstorleken | Uppåt, så att priset håller sig vid eller över limitpriset | Lägre sannolikhet för avslut |
| Marknadsbar limitorder | Måste också följa prisgränserna | Beror på det högsta acceptabla priset | Om den går över spreaden |
Det finns ingen avrundningsregel som alltid är rätt. Avrundning av ett köp nedåt bevarar köparens prisgräns, men kan minska sannolikheten för avslut. Avrundning uppåt kan göra ordern marknadsbar, vilket påverkar avgifter och marknadspåverkan. För vår passiva basisposition var det fel att i tysthet flytta ordern. Strategin hade valt ett målpris; adaptern ändrade dess ekonomi.
Varför såg backtestet fortfarande bra ut?
Vår historiska ordersimulator behandlade limitpriser som kontinuerliga tal. Om stapelns lägsta pris nådde köppriset, eller dess högsta pris nådde säljpriset, räknade den med ett avslut. Det är redan en generös uppskattning för en passiv order, eftersom ett avslut till limitpriset inte säger något om positionen i orderkön. Men tickuppdateringen blottlade ett mer grundläggande glapp: ordern hade inte kunnat finnas till det priset.
Vi spelade upp samma beslut igen med det nya prissteget infört från dess giltighetstidpunkt. Flera avslut försvann. Några order avrundades till priser som gick över spreaden och fick takeravgifter i stället för makeravgifter. Därmed avvek positionsutvecklingen, så även senare hedgar och stängningar förändrades. En regel som såg ut som metadata hade ändrat hela handelssekvensen.
Uppdateringen var inte heller någon överraskning gömd i ett diagram. Handelsplatsen hade publicerat en ändring av instrumentreglerna med en giltighetstidpunkt. Vi lagrade marknadsdata noggrant, men instrumentmetadata låg i en cache som uppdaterades vid start. Backtestet använde dagens regler för alla historiska datum; pappershandeln hade gamla regler tills processen startades om. Ingen av miljöerna återgav vad handelsplatsen tillät vid varje tidpunkt.
Hur bör ett backtest modellera ändringar av tickstorleken?
Versionshantera instrumentregler med giltighetsintervall, precis som andra indata som beror på tidpunkten. Spara åtminstone giltighetstidpunkten och de regelvärden som behövs för att validera en order: tickstorlek, kvantitetssteg, minsta kvantitet och eventuella prisintervall. Simulatorn bör läsa in den regeluppsättning som gällde vid den simulerade beslutstidpunkten.
Gör sedan orderhanteringen uttrycklig. Om ett målpris är ogiltigt kan ni avvisa det, avrunda det enligt en dokumenterad policy eller räkna om målpriset så att det följer prisstegen. Registrera vilket alternativ som användes. Ett backtest som automatiskt korrigerar varje order kan vara användbart för att uppskatta en viss exekveringspolicy, men det bör inte dölja policyn genom att framställa den som ett börsavslut.
För passiva order är ett pris som följer tickstorleken bara det första villkoret för avslut. Ni behöver fortfarande modellera om marknaden handlade förbi ert pris, kön framför er, annulleringar och vilken avgiftsnivå ni skulle ha fått.
Vi lade till två kontroller. Den ena kör varje genererad order genom instrumentreglerna som gällde vid den aktuella tidpunkten och avbryter med ett tydligt fel vid ogiltiga priser eller kvantiteter. Den andra jämför backtestets och pappershandelns slutliga normaliserade order: sida, pris, kvantitet, giltighetstid och avgiftsavsikt. Om de skiljer sig åt betraktas körningen inte som jämförbar.
Därefter spelade vi upp tisdagens ändring igen. Backtestet hävdade inte längre att det fanns avslut till 42,318.03 efter att prissteget hade ändrats. Pappershandeln och simuleringen fattade samma beslut för varje ogiltigt målpris, även när beslutet var att hoppa över ordern.
Signalen hade inte gått sönder. Antagandena om det instrument den kunde handla hade blivit inaktuella. En strategi kan klara en ny tickstorlek, men bara om forskningssystemet behandlar handelsplatsens regler som en del av marknaden det simulerar.
← Alla inlägg


