Klokken 08:00 UTC en tirsdag endret en kryptobørs tickstørrelsen for en evigvarende kontrakt med middels prisnivå. Basissstrategien vår merket ingenting. Signalet så fortsatt det samme spreadet mellom spot og futures, risikogrensene var uendret, og backtesten fortsatte å vise de samme resultatene.
Papirsimuleringen oppdaget det for strategien. Ordretilpasningen rundet en kjøpslimit ned til nærmeste tillatte pris. Dermed lå ordren ett tick under nivået backtesten hadde modellert. Markedet berørte den gamle prisen, den simulerte ordren ble fylt, mens papirordren ble liggende urørt. Ved lunsjtider var strategiens beholdning skjevfordelt.
Hendelsen så ut som en liten avrundingsfeil. I realiteten var det et problem ved modellgrensen: Strategien kjente prisene, men backtesten kjente ikke børsens prisgrid.
Vi handlet på et enkelt basissignal: kjøpte spot og solgte en evigvarende kontrakt når futurespremien oversteg en terskel. Ordrene var passive fordi den forventede basisgevinsten var liten. Noen få tick kunne avgjøre om inngangen ga nok til å dekke gebyrene og det senere salget.
Hva endret seg da tickstørrelsen ble endret?
Før oppdateringen godtok den evigvarende kontrakten priser i trinn på 0.01. Etterpå godtok den trinn på 0.05 i det aktuelle prisintervallet. Signalet beregnet en målpris for salg på 42,318.03, som var gyldig etter den gamle regelen. Etter den nye regelen var prisen ugyldig.
Børsen avviste ugyldige priser, men tilpasningen vår hadde en reservefunksjon: Den rundet salgsprisen ned til 42,318.00. Det var fortsatt ugyldig. En ny reservefunksjon rundet prisen enda en gang, denne gangen til 42,318.05, som var gyldig, men mindre aggressiv for en selger. Ordren kunne ikke lenger selges til den modellerte prisen. Kodebanen var skrevet for et annet marked og gjorde i det stille en avvisning om til en ordre med justert pris.
Denne ene ordren reiste to ulike spørsmål. For det første: Hvilken pris kan børsen godta? For det andre: Hvordan skal en strategi reagere når ønsket pris ikke ligger på prisgriden? Børsen svarer på det første. Strategien eller utførelsesreglene må svare på det andre.
| Ordreintensjon | Gridregel | Vanlig avrundingsretning | Mulig konsekvens |
|---|---|---|---|
| Kjøpslimit | Prisen må være et multiplum av tickstørrelsen | Ned for å holde seg på eller under limitprisen | Lavere sannsynlighet for å bli fylt |
| Salgslimit | Prisen må være et multiplum av tickstørrelsen | Opp for å holde seg på eller over limitprisen | Lavere sannsynlighet for å bli fylt |
| Markedsrettet limitordre | Må også overholde prisgrensene | Avhenger av høyeste akseptable pris | Om ordren krysser spreadet |
Det finnes ingen avrundingsregel som alltid er riktig. Å runde en kjøpsordre ned ivaretar kjøperens prisgrense, men kan redusere sannsynligheten for å bli fylt. Avrunding opp kan gjøre ordren markedsrettet, noe som endrer gebyrer og markedspåvirkning. For den passive inngangen i basisstrategien vår var det feil å flytte ordren i det stille. Strategien hadde valgt et mål; ordretilpasningen endret økonomien i handelen.
Hvorfor så backtesten fortsatt bra ut?
Den historiske ordresimulatoren vår behandlet limitpriser som kontinuerlige tall. Hvis barens laveste pris nådde kjøpsprisen, eller høyeste pris nådde salgsprisen, registrerte den en handel. Det er allerede en raus tilnærming for en passiv ordre, siden en omsatt pris på limitprisen ikke sier noe om køposisjonen. Men tickoppdateringen avdekket et mer grunnleggende gap: Ordren kunne ikke ha eksistert til den prisen.
Vi spilte av de samme beslutningene med det nye prisgriden gjeldende fra tidspunktet det trådte i kraft. Flere handler forsvant. Noen ordrer ble rundet til priser som krysset spreadet og utløste takergebyrer i stedet for makergebyrer. Dermed avvek også posisjonsforløpet, og senere sikringer og avslutninger ble endret. En regel som så ut som metadata, hadde endret hele handelssekvensen.
Og oppdateringen var ingen overraskelse skjult i et diagram. Børsen hadde publisert en endring i instrumentreglene med et tidspunkt for ikrafttredelse. Vi lagret markedsdata nøye, men instrumentmetadata lå i en hurtigbuffer som ble oppdatert ved oppstart. Backtesten brukte dagens regler for alle historiske datoer; papirsimuleringen hadde utdaterte regler helt til prosessen ble startet på nytt. Ingen av miljøene gjenspeilte hva børsen tillot på hvert tidspunkt.
Hvordan bør en backtest modellere endringer i tickstørrelse?
Versjoner instrumentreglene med gyldighetsintervaller, på samme måte som andre punkt-i-tid-inndata. Behold som et minimum tidspunktet reglene trådte i kraft, og regelverdiene som trengs for å validere en ordre: tickstørrelse, mengdetrinn, minste mengde og eventuelle prisintervaller. Simulatoren bør laste inn regelsettet som gjaldt på det simulerte beslutningstidspunktet.
Gjør deretter ordrehåndteringen eksplisitt. Hvis en målpris er ugyldig, kan dere avvise den, runde den etter en dokumentert policy eller beregne målet på nytt på prisgriden. Registrer hva som skjedde. En backtest som automatisk reparerer alle ordrer, kan være nyttig for å anslå en bestemt utførelsespolicy, men den bør ikke fremstille denne policyen som en børsutført handel.
For passive ordrer er en pris som følger tickreglene bare det første vilkåret for å bli fylt. Dere trenger fortsatt en modell for om markedet handlet gjennom prisen deres, køen foran dere, kanselleringer og gebyrnivået dere ville ha fått.
Vi la til to kontroller. Den ene kjører hver genererte ordre gjennom instrumentreglene som gjaldt på det aktuelle tidspunktet, og stopper med en tydelig feil ved ugyldige priser eller mengder. Den andre sammenligner den endelig normaliserte ordren fra backtesten og papirtilpasningen: side, pris, mengde, tid-i-kraft og gebyrintensjon. Hvis de er uenige, regnes ikke kjøringene som sammenlignbare.
Deretter spilte vi av tirsdagens endring på nytt. Backtesten hevdet ikke lenger at ordren ble fylt til 42,318.03 etter at prisgriden var oppdatert. Papirsimuleringen og simuleringen tok samme beslutning for hvert ugyldige mål, også når beslutningen var å hoppe over ordren.
Sign alert var ikke ødelagt. Forutsetningene om hva den kunne handle, var blitt utdaterte. En strategi kan tåle en ny tickstørrelse, men bare hvis analysesystemet behandler børsreglene som en del av markedet det simulerer.
← Alle innlegg


