De gevaarlijkste timingfout in een backtest kan een perfecte controle van tijdstempels overleven. Twee gebeurtenissen kunnen allebei 10:00:00.000 aangeven en toch hebben plaatsgevonden in een volgorde die je simulator heeft gegokt.
Dat is van belang zodra een strategie reageert op meer dan afgeronde candles: een quote-update, een transactie, een financieringsbericht, een wijziging van de status van een beurs of de bevestiging van een eigen order. Een tijdstempel vertelt je wanneer een gebeurtenis is gelabeld. Mogelijk vertelt die niet wanneer je strategie erop kon reageren.
Wat verandert de volgorde van gebeurtenissen?
Stel je een strategie voor die koopt wanneer de beste laatprijs onder $100.00 zakt. Op dezelfde milliseconde registreert de feed een update van de laatprijs naar $99.99 en een transactie op $99.99. Als je backtest eerst de transactie verwerkt en daarna de quote, ziet de strategie de nieuwe laatprijs en plaatst ze een order. De quote eerst verwerken kan ook goed zijn, mits de gebeurtenis daadwerkelijk beschikbaar was. Maar als de transactie de zichtbare liquiditeit verbruikte voordat de order aankwam, is een uitvoering op $99.99 fictie.
Als je regels alleen op tijdstempel sorteert, moet de simulator zelf een volgorde kiezen voor gebeurtenissen met dezelfde tijdstempel. De volgorde in het bestand, de symboolvolgorde of een databasequeryplan kan zo onbedoeld een uitvoeringsregel worden. De aandelenlijn kan veranderen terwijl de onderliggende data gelijk blijft.
Je ziet goed hoe willekeurig dit kan uitpakken door gebeurtenissen met dezelfde tijdstempel op symboolnaam te sorteren in plaats van op volgorde van binnenkomst. Een strategie voor meerdere activa kan zich dan anders gedragen, alleen omdat de ene ticker alfabetisch eerder komt dan de andere.
Welke klokken moet een backtest bijhouden?
Bij marktdata en orderafhandeling spelen vaak verschillende tijdstippen een rol. Bewaar de velden die je bron levert en benoem nauwkeurig wat ze betekenen. Bij veel feeds zijn zowel de tijdstempel van de beurs als de lokale ontvangsttijd nuttig; geen van beide geeft universeel weer wat elke marktdeelnemer heeft gezien.
| Klok | Wat deze registreert | Wat deze op zichzelf niet kan bewijzen |
|---|---|---|
| Tijdstip van beursgebeurtenis | Wanneer de handelsplaats zegt dat een gebeurtenis heeft plaatsgevonden | In welke volgorde een andere feed of jouw proces de gebeurtenis heeft waargenomen |
| Ontvangsttijd | Wanneer je collector het bericht heeft ontvangen | Wanneer je strategie klaar was met de verwerking ervan |
| Beslissingstijd | Wanneer je code het signaal heeft beoordeeld | Dat de opgegeven prijs beschikbaar bleef |
| Aankomsttijd van de order | Wanneer de handelsplaats de order kon uitvoeren | Een uitvoering, tenzij de matchingregels en liquiditeit die ondersteunen |
Vermeld bij historische data zonder ontvangsttijden welke aannames je maakt. Een backtest kan beursgebeurtenissen op volgorde verwerken en een vaste vertraging van 5 ms tussen beslissing en aankomst van de order opleggen. Dat is een model, geen teruggevonden geschiedenis. Als je geen volgnummers hebt voor beursgebeurtenissen met dezelfde tijdstempel, is ook je regel om gelijke tijdstippen te ordenen een aanname.
Hoe modelleer ik gebeurtenissen met dezelfde tijdstempel?
Bewaar eerst de volgnummers uit de bron, als die er zijn. Een volgnummer geeft binnen de feed een betrouwbaardere volgorde dan een tijdstempel, al kunnen verschillende kanalen of producten aparte nummerreeksen hebben.
Maak vervolgens de verwerkingsregel van de simulator expliciet. Bepaal voor elke gebeurtenis of deze de informatie van de strategie kan bijwerken, de beschikbare liquiditeit kan veranderen, een order kan activeren of een order kan bevestigen. Dat zijn verschillende handelingen; ze samenvatten als ‘regel verwerken’ is hoe onmogelijke uitvoeringen binnensluipen.
- Pas alleen marktinformatie toe die vóór de beslissingstijd van de strategie is binnengekomen.
- Genereer de order en schuif de tijd vervolgens door naar de gemodelleerde aankomsttijd bij de handelsplaats.
- Sta uitvoering alleen toe tegen in aanmerking komende liquiditeit na aankomst, volgens de aannames voor het ordertype.
- Leg voor elke gesimuleerde uitvoering de gebruikte input, gebeurtenisvolgorde en vertraging vast.
Voor een strategie op basis van candles is dit misschien meer complexiteit dan nodig is voor de onderzoeksvraag. Als het signaal afgeronde candles van 1 minuut gebruikt en orders bij de opening van de volgende candle worden uitgevoerd met een conservatief kostenmodel, zal de volgorde op submillisecondeniveau de onderzoeksconclusie waarschijnlijk niet veranderen. Het gaat erom dat het timingdetail past bij de bewering die de backtest doet.
Kan ik een backtest vertrouwen zonder gegevens over aankomsttijden?
Je kunt hem nog steeds gebruiken, maar houd de beperking duidelijk in beeld. Als de strategie langzaam handelt en ruime risicolimieten heeft, zijn een paar milliseconden misschien niet van belang. Reageert ze op vluchtige quotes, concurreert ze om een plek in de wachtrij of hangt ze af van een lead-lagsignaal tussen beurzen, dan kunnen ontbrekende aankomsttijden doorslaggevend zijn voor het resultaat.
Critici hebben gelijk dat precieze timing van gebeurtenissen kan leiden tot schijnprecisie. Historische feeds zijn onvolledig, klokken lopen uiteen en tijdstempels van handelsplaatsen laten niet elke netwerkstap zien. Zelfs een simulator met velden op nanosecondeniveau kan nog steeds een grove aanname over uitvoering hanteren.
Test daarom de gevoeligheid in plaats van zekerheid te claimen: speel de data opnieuw af met aannemelijke volgordes voor gebeurtenissen met dezelfde tijdstempel en verschillende ordervertragingen, en vergelijk vervolgens het aantal transacties, de uitvoeringsprijs en welke signalen standhouden. Als het resultaat afhangt van een volgorde die de data niet kan vaststellen, hoort die afhankelijkheid thuis in het onderzoeksrapport. Een backtest kan nuttig zijn met een onnauwkeurige klok. Hij moet alleen duidelijk maken welke tijd hij daadwerkelijk kent.
← Alle artikelen


