10 stappen om een backtest resultaat te verifiëren

Portret van Alex de Vries, Quantitatief Analist & Algo-Trading Expert
Alex de Vries
Quantitatief Analist & Algo-Trading Expert
Backtesting & Validatie · 2026-02-15 · 11 min leestijd

Je hebt een prachtige backtest staan. Winnaar na winnaar. De equity curve gaat pijlsnel omhoog.

Je voelt al hoe de broker je volgende storting staat te wachten. Toch? Stop even. Die cijfers kunnen een illusie zijn.

Een backtest is een simulatie en elke simulatie heeft valkuilen. Voordat je ook maar één echte euro inzet, moet je die resultaten keihard verifiëren. Geen zorgen, ik help je erdoorheen. Dit is je stappenplan. Pak je Python script erbij, zet je broker API open en laten we beginnen.

Stap 1: Check de datakwaliteit en de bron

Alles begint met goede data. Slechte data in = rotzooi uit.

Je kunt de mooiste machine learning bot niet trainen op een fundament van rotte cijfers. Kijk allereerst naar de bron van je data. Haal je die via de API van een broker zoals Interactive Brokers of LMAX, of gebruik je een dienst als Alpaca of Polygon?

Check de volledigheid. Zoek naar gaten in de tijdlijn, vooral tijdens weekenden of feestdagen.

Een gemiste candle op 1 minuut-niveau kan je hele short-strategie verpesten. Controleer ook de splitsingen en dividendcorrecties. Als je aandelen zoals Apple (AAPL) verhandelt, moeten de historische prijzen gecorrigeerd zijn voor splitsingen.

Zonder die correctie lijkt je backtest winstgevend, maar is de realiteit anders. Gebruik een script om de data te valideren.

Veelgemaakte fouten

  • Gebruik maken van toekomstige data (look-ahead bias) door splitsingsdata pas na de datum toe te passen.
  • Vergeten om overnight gaps te verwerken in je intraday data.
  • Data van een free-tier provider gebruiken die te weinig historie heeft voor lange-termijn strategieën.

In Python kun je met Pandas eenvoudig controleren op null-waarden en afwijkingen in het tijdsvak.

Een simpele check: print de eerste en laatste 5 rijen van je dataset en vergelijk deze met een live ticker van je broker. Zorg dat de tijdzones kloppen; een UTC-tijd vs. New York-tijd verschil kan al voor chaos zorgen. Tijdsindicatie: 30 minuten tot 1 uur.

Stap 2: Simuleer de transactiekosten realistisch

Veel beginnende traders denken dat transactiekosten nihil zijn. Dat is een fatale vergissing.

Je strategie kan winstgevend lijken op papier, maar door de spread en commissies van je broker volledig op te slokken.

Neem de werkelijke kosten van je broker mee. Handel je bijvoorbeeld bij DEGIRO? Reken dan met €2,00 + 0,03% per trade.

Handel je futures via Interactive Brokers? Gebruik hun exacte commissiestructuur. Voeg de spread toe. Als je op een EUR/USD paar handelt, is de spread niet altijd de ingestelde 0,1 pips.

Tijdens de Aziatische sessie kan dit oplopen naar 1-2 pips. Zorg dat je backtest-engine deze variabele spread kan verwerken.

Veelgemaakte fouten

  • Een vaste commissie gebruiken die niet klopt met de broker voor dat specifieke instrument.
  • Spreads vergeten mee te nemen bij scalping-strategieën op lage tijdframes.
  • Financieringskosten van CFDs negeren bij lange-termijn posities.

Gebruik hiervoor een eenvoudige functie in Python die de entry- en exit-prijs aanpast op basis van de marktcondities op dat moment. Vergeet de financieringskosten niet.

Als je een hefboomproduct of een CFD gebruikt, betaal je overnight swap fees. Als je een 'buy and hold' bot bouwt op een hefboomproduct, kunnen deze kosten je winst compleet opeten. Reken dit door voor elke positie die langer dan 24 uur openstaat. Tijdsindicatie: 20-40 minuten.

Stap 3: Pas slippage toe op elke trade

Slippage is het verschil tussen de verwachte prijs en de uitgevoerde prijs. In een backtest zonder slippage handel je als een god: elke trade wordt exact op de slotkoers uitgevoerd.

In de echte wereld werkt dat niet zo. Zeker bij market orders of tijdens nieuwsuitbraken glipt de prijs vaak van je af.

Meet de slippage voor je specifieke instrument. Als je handelt in crypto op Binance, is de slippage vaak klein, maar bij illiquide altcoins kan deze oplopen tot 5%. Voor aandelen op NYSE is de slippage vaak minimaal, tenzij je grotere orders plaatst dan het orderboek aankan.

Veelgemaakte fouten

  • Slippage volledig uitschakelen voor een 'schone' equity curve.
  • Slippage constant houden, terwijl deze in werkelijkheid varieert met de volatiliteit.
  • Geen rekening houden met de ordergrootte; een order van 10.000 aandelen heeft meer slippage dan 100 aandelen.

Pas in je Python-script een willekeurige slippage toe (bijvoorbeeld 0,05% tot 0,1% per trade) of gebruik historische tick-data om de exacte slippage te simuleren. Test je strategie onder extreme slippage. Zet de slippage eens op 0,5% en kijk of je strategie nog steeds positief is. Als je strategie dan faalt, is deze niet robuust genoeg voor de live markt.

Je wilt namelijk overleven als de markt onverwachts reageert. Tijdsindicatie: 30 minuten.

Stap 4: Voer een Walk-Forward analyse uit

Een backtest op historische data is leuk, maar hoe presteert je bot op data die hij nog nooit heeft gezien? Hier komt de Walk-Forward analyse om de hoek kijken.

Dit is de ultieme test voor de robuustheid van je algoritmische bot.

Deel je historische data op in 'in-sample' en 'out-of-sample' periodes. Bijvoorbeeld: optimaliseer je parameters op data van 2020-2022 (in-sample), en test deze op data van 2023 (out-of-sample). Herhaal dit proces met een schuivend venster.

Veelgemaakte fouten

  • De hele dataset gebruiken voor optimalisatie (overfitting).
  • Een te kleine out-of-sample dataset gebruiken (statistisch niet significant).
  • De parameters te vaak aanpassen tijdens de walk-forward test.

Als je bot in de out-of-sample fase net zo goed presteert als in de optimalisatiefase, heb je een winner te pakken. Gebruik Python libraries zoals backtesting.py of VectorBT om deze analyse te automatiseren en je strategie te valideren met de permutation test. Je wilt zien of je parameters stabiel blijven of dat je constant nieuwe parameters moet aanpassen (curve-fitting). Als je elke maand nieuwe parameters nodig hebt, is je strategie waarschijnlijk te kwetsbaar. Tijdsindicatie: 1-2 uur.

Stap 5: Analyseer de drawdown en risico-reward

Winst is leuk, maar drawdown is wat je account vernietigt. Kijk niet alleen naar de totale winst, maar naar de maximale drawdown.

Als je backtest een winst van €10.000 laat zien, maar een drawdown van €8.000 heeft gehad, is de kans op een margin call enorm.

Een gezonde strategie heeft meestal een maximum drawdown van minder dan 20% van je startkapitaal. Bereken de risico-reward verhouding per trade en voor de gehele portefeuille. Een gemiddelde winst van €500 en een gemiddeld verlies van €200 is fantastisch (2.5:1).

Als je echter 100 trades wint en 99 verliest, ben je alsnog blut. Focus op de expectancy: (Winstkans x Gemiddelde Winst) - (Verlieskans x Gemiddelde Verlies).

Veelgemaakte fouten

  • Alleen kijken naar de eindsaldowinst en niet naar de pieken en dalen tussendoor.
  • Een te hoge hefboom gebruiken in de backtest zonder rekening te houden met margin calls.
  • De winstgevendheid van een enkele trade extrapoleren naar de toekomst.

Als dit getal positief is, heb je een wiskundig voordeel. Gebruik de Sharpe Ratio niet blind. Een Sharpe Ratio van 3 ziet er geweldig uit, maar als de return-volatiliteit laag is door een te kleine dataset, is het misleidend. Kijk ook naar de Sortino Ratio, die alleen de neerwaartse volatiliteit meeneemt.

Dit geeft een realistischer beeld van je risico. Tijdsindicatie: 45 minuten.

Stap 6: Test op verschillende marktcondities

Een trendvolgende bot doet het geweldig in een stijgende markt, maar faalt volledig in een zijwaartse range.

Je moet je bot testen op verschillende marktregimes. Verdeel je historische data in trending, range-bound en extreem volatiele periodes.

Gebruik technische indicatoren om de marktconditie te bepalen. Bijvoorbeeld: als de ADX (Average Directional Index) boven de 25 ligt, is de markt trending. Is de ADX laag, dan is de markt zijwaarts. Test je strategie op beide condities.

Als je bot alleen geld verdient tijdens de crypto-bullrun van 2021, maar faalt in een stabiele markt, is hij niet geschikt voor het hele jaar.

Veelgemaakte fouten

  • Alleen testen op de afgelopen 2 jaar (een beperkte marktperiode).
  • Geen rekening houden met beurstijden (pre-market, after-hours) voor aandelen.
  • Vergeten dat marktcondities kunnen veranderen (regime switches).

Simuleer een flash crash. Stel je Python-script in om op een bepaalde dag de prijs plotseling met 10% te laten dalen. Zorgt je risicomanagement ervoor dat de posities automatisch gesloten worden?

Of blijf je vastzitten aan een verliesgevende positie? Deze stress-test is essentieel voor algoritmische traders. Tijdsindicatie: 1 uur.

Stap 7: Valideer de position sizing en leverage

Hoeveel risico neem je per trade? In een backtest is het verleidelijk om te streven naar een onrealistisch hoge winrate, maar 100% van je kapitaal inzetten op een trade is vragen om problemen.

In de echte wereld werkt dat niet. Je position sizing moet gebaseerd zijn op je risicopercentage per trade, meestal 1% tot 2% van je account.

Test hoe je bot reageert met hefboom. Als je handelt met 10x hefboom op Bitcoin, verandert een 10% prijsdaling je account in nul. Pas de hefboom toe in je backtest en kijk naar de impact op de drawdown.

Veelgemaakte fouten

  • Vaste aantal aandelen/coins gebruiken in plaats van een percentage van het kapitaal.
  • Te hoge hefboom toepassen zonder de impact op de drawdown te berekenen.
  • Vergeten dat sommige brokers een minimum ordergrootte hebben (bijv. 1 lot).

Veel Python backtesting libraries ondersteunen leverage standaard, maar je moet het wel activeren en correct berekenen. Gebruik een vaste procentuele risico-instelling.

Als je account groeit, groeit je positie mee. Als je account krimpt, verkleint je positie. Dit heet 'compounding'. Zonder compounding lijk je minder winst te maken, maar het beschermt je tijdens verliesperiodes. Tijdsindicatie: 30 minuten.

Stap 8: Controleer op data-dumping en biased tijdreeksen

Data-dumping is een valkuil waarbij je per ongeluk toekomstige informatie in je huidige data stopt. Dit gebeurt vaak bij het samenvoegen van verschillende datasets.

Bijvoorbeeld: je voegt economische kalenderdata toe aan je prijsdata, maar de tijdzone klopt niet waardoor de marktreactie op het nieuws al is verwerkt voordat je de indicator berekent.

Gebruik een 'Purged Cross-Validation' techniek. Zorg dat er een buffer is tussen je trainingsdata en testdata om leakage te voorkomen. In Python kun je dit doen door tijd toe te voegen tussen de datasets.

Veelgemaakte fouten

  • Gebruik maken van de 'close' prijs voor een trade die eigenlijk op de 'open' zou moeten plaatsvinden.
  • Vergeten dat brokers slippage en fill-rates hebben die afwijken van de backtest.
  • Geen rekening houden met de tijd die nodig is om een order te verzenden via de API.

Zorg er ook voor dat je live API-gegevens niet gecached zijn op een manier die oude data serveert. Test je strategie op een demo-rekening met live data voordat je echt geld inzet.

Dit is de ultieme real-time validatie. Als je demo-rekening consistent hetzelfde gedrag vertoont als je backtest, is de kans op biased data kleiner. Tijdsindicatie: 45 minuten.

Stap 9: Simuleer de API latency en downtime

Als je een algoritmische bot draait, communiceer je via een API. Die API heeft een vertraging (latency).

Als je bot een signaal krijgt op 10:00:00, maar de order wordt pas uitgevoerd om 10:00:02 vanwege een trage verbinding of serverdrukte, is de prijs al veranderd. Test je bot op een server dichtbij de exchange. Als je handelt op Binance Futures, draai je bot het beste op een server in Tokyo of Singapore.

Gebruik een Python script om de ping-tijd naar de API te meten.

Simuleer deze vertraging in je multi-asset backtest door een willekeurige vertraging (bijv. 100-500ms) toe te voegen aan elke trade-exit. Controleer op API downtime. Soms is de API van een broker tijdelijk down.

Veelgemaakte fouten

  • Vertragen van de API negeren, wat leidt tot 'over-optimisme' in de backtest.
  • Geen error-handling programmeren voor HTTP 429 (rate limits) of 500 (server errors).
  • Vergeten dat sommige brokers kosten rekenen voor het aanroepen van de API (zeldzaam, maar het bestaat).

Je bot moet hiermee om kunnen gaan. Zorg voor error-handling in je code: als de API faalt, moet de bot stoppen of veilig naar een demo-modus schakelen.

Test dit door je internetverbinding tijdelijk te verbreken tijdens een simulatie. Tijdsindicatie: 30 minuten.

Stap 10: Maak een verificatie-checklist

Nu je alle stappen hebt doorlopen, is het tijd om alles op een rijtje te zetten.

  • Data: Is de historische data gecorrigeerd voor splitsingen en dividend?
  • Kosten: Zijn de exacte commissies en spreads van je broker toegepast?
  • Slippage: Is er rekening gehouden met variabele slippage per instrument?
  • Walk-Forward: Heeft de strategie positief gepresteerd op out-of-sample data?
  • Drawdown: Is de maximale drawdown acceptabel voor je risicoprofiel (bijv. <20%)?
  • Marktcondities: Werkt de bot in trending, range-bound en volatiele markten?
  • Position Sizing: Is het risico per trade beperkt tot 1-2% van het kapitaal?
  • Data-integriteit: Is er geen look-ahead bias of data leakage?
  • API: Is rekening gehouden met latency en potentiële downtime?
  • Emotieloos: Is de strategie volledig automatisch en zonder menselijke tussenkomst?

Gebruik deze checklist om de integriteit van je backtest te garanderen. Print deze uit of zet hem in je Notion-dashboard.

Als je op alle punten 'ja' kunt antwoorden, ben je klaar om de live markt te betreden. Vergeet niet om klein te beginnen. Zet in de eerste week maar €100 tot €500 in, afhankelijk van je totale kapitaal. Monitor elke trade en vergelijk de live resultaten met je backtest. Alleen door constant te meten en bij te sturen, blijf je winstgevend in de wereld van algoritmische trading.

Portret van Alex de Vries, Quantitatief Analist & Algo-Trading Expert
Over Alex de Vries

Alex is een ervaren quantitatief analist en Python-ontwikkelaar die complexe trading concepten vertaalt naar begrijpelijke, praktische handleidingen voor zowel beginners als gevorderden.