6 oktober 2026 · onderzoek

Waarom werd mijn backtest uitgevoerd tegen een prijs die de markt nooit liet zien?

Waarom werd mijn backtest uitgevoerd tegen een prijs die de markt nooit liet zien?

Een backtest kan een fill rapporteren tegen een prijs die de markt nooit heeft getoond. Meestal heeft de simulator een aannemelijk ogende uitvoering afgeleid uit onvolledige data: de high en low van een candle, een midpoint of een limietprijs die door één transactie werd aangetikt. Daardoor kan het transactielogboek nauwkeurig lijken, terwijl het verbergt wat de markt daadwerkelijk bood.

Begin met de vraag met welke prijs je order in aanraking had kunnen komen. Een candle met laatste transactieprijzen laat zien tegen welke prijzen er binnen een interval is gehandeld. Die vertelt niet wat de bid en ask waren toen je order binnenkwam, hoeveel er beschikbaar was of je order vooraan in de wachtrij kon komen.

Waarom toont mijn backtest een fill buiten de marktprijs?

Wees eerst precies over wat je met ‘buiten’ bedoelt. Een buy-fill onder de low van de candle of een sell-fill boven de high is een duidelijke boekhoudkundige of timingfout. Ook een fill binnen de high-low-range kan fictief zijn: de prijs kan zijn verhandeld voordat de order bestond, aan de andere kant van de spread of in een te kleine hoeveelheid om je order te vullen.

Neem een candle van 1 minuut met een open van 100.00, een low van 99.80 en een close van 100.10. Je strategie ziet de voltooide candle, verstuurt een buy-order en de simulator vult die tegen 99.80. Die low kan bijna aan het begin van de minuut zijn bereikt, vijftig seconden vóór het signaal. De candle levert geen bewijs dat 99.80 na de beslissing beschikbaar was.

Beschikbare dataWat die vastlegtWat die niet kan vastleggen
OHLCV-candleWaargenomen bandbreedte van transactieprijzen en volume gedurende een intervalPrijsvolgorde, bid en ask of beschikbaarheid bij aankomst van de order
TransactieprintsGerapporteerde uitvoeringen met tijdstempels en prijzenPassieve liquiditeit of je plek in de wachtrij
Top-of-book-quotesBeste getoonde bid en ask op de meetmomentenDiepte voorbij het beste niveau of dat een quote tussen metingen bleef staan
OrderboekgebeurtenissenWijzigingen in getoonde diepte en gebeurtenissen in de wachtrij, afhankelijk van de dekking van de feedVerborgen liquiditeit, toegang tot handelsplatforms of gegarandeerde prioriteit

Een tweede veelvoorkomende oorzaak is verwarring tussen midpoint- en uitvoerbare prijzen. Als de quote 99.99 bid en 100.01 ask is, oogt een buy tegen het midpoint van 100.00 netjes in een rapport. Een direct uitvoerbare buy betaalt doorgaans de ask, plus eventuele marktimpact door de ordergrootte. Het midpoint als fill bestempelen haalt ongemerkt de helft van de spread weg.

Kan een limietorder worden gevuld alleen omdat de markt de prijs aantikte?

Een aanraking is bewijs dat er een transactie tegen de limietprijs is geprint. Het bewijst niet dat je rustende order zou zijn uitgevoerd. Stonden er andere orders voor je, dan was het handelsvolume tegen die prijs mogelijk te klein om jouw plek in de wachtrij te bereiken. De print kan ook afkomstig zijn van een ander handelsplatform, terwijl jouw order elders stond.

Stel dat je buy-limiet 50.00 is en de markt na het plaatsen van je order 200 aandelen tegen die prijs verhandelt. Een simulator die op basis van aanraking vult, vult alle 500 aandelen. Een voorzichtiger model kijkt hoeveel er na aankomst tegen of onder 50.00 is verhandeld en houdt vervolgens rekening met een schatting van de orders vóór die van jou in de wachtrij. Zonder orderniveaugegevens van het orderboek blijft die wachtrij een aanname. Die moet zichtbaar zijn in de resultaten en mag niet stilzwijgend als zekerheid worden voorgesteld.

Voor een klein onderzoekssysteem maak ik die aanname liever expliciet en test ik een bandbreedte, dan te doen alsof candledata de prioriteit in de wachtrij laat zien. De juiste bandbreedte hangt af van het handelsplatform, de ordergrootte en hoe vaak de strategie handelt. Een rustig aandeel bij opening en een dun verhandeld cryptocontract om 03:00 UTC zijn verschillende uitvoeringsproblemen.

Hoe kies ik een fillmodel voor candledata?

Stem het model af op zowel de data als de claim van de strategie. Een backtest op basis van candles kan nog steeds nuttig zijn voor langzame strategieën, maar de fills moeten rekening houden met wat de candles daadwerkelijk laten zien.

  1. Leg de beslis- en aankomsttijden vast. Gebruikt een signaal de slotkoers van de candle, verstuur de order dan na die slotkoers. Modelleer de uitvoering vanaf het eerstvolgende beschikbare interval of de eerstvolgende quote, niet vanaf een eerdere low in de voltooide candle.
  2. Gebruik de juiste kant van de spread. Begin bij direct uitvoerbare buys met de ask en bij sells met de bid. Heb je alleen transactiecandles, schat de spread dan aan de hand van een aparte bron of vermeld dat het model die buiten beschouwing laat.
  3. Beperk fills tot aannemelijke liquiditeit.Pas een participatielimiet toe op het waargenomen volume en neem fees en marktimpact mee. Het totale volume van een candle betekent niet dat alles daarvan beschikbaar was tegen de gekozen prijs.
  4. Test de aannames onder zwaardere omstandigheden.Vergelijk fills tegen de volgende opening met conservatieve slippage en test of het resultaat standhoudt bij slechtere uitvoering. Stem het fillmodel niet zo af dat de strategie wint.

Dit zijn modelkeuzes, geen recept om uit onvolledige data de ene ware fill te achterhalen. Is de strategie afhankelijk van het binnenhalen van een paar basispunten, dan biedt candledata mogelijk onvoldoende bewijs voor die claim.

Hoe achterhaal ik waar de onmogelijke fill in de backtest terechtkwam?

Volg één verdachte transactie van signaal tot grootboek. Houd het tijdstempel van de beslissing, het tijdstempel waarop de order werd verstuurd, de gesimuleerde aankomsttijd, de gekozen marktwaarneming, de fillprijs, de fillhoeveelheid en de fee als aparte velden bij. Controleer vervolgens, in deze volgorde:

Kun je die vragen niet beantwoorden aan de hand van het transactierecord, dan ontbreken uitvoeringsgegevens in de backtest. Voeg de velden toe, speel een handvol transacties handmatig opnieuw af met de ruwe data en controleer of de gerapporteerde fill had kunnen plaatsvinden volgens het beoogde model. Een strakke aandelenkapitaalcurve vangt geen prijs op die alleen in de simulator bestond.

backtestenmarktdatauitvoeringdata-engineering
← Alle artikelen