Outliers verwijderen: Hoe voorkom je dat 'bad ticks' je backtest verpesten?
Je staat te popelen om je algoritmische bot te testen, maar je backtest resultaten zien er te mooi uit om waar te zijn? Grote kans dat er 'bad ticks' tussen zitten – extreme data-punten die je totaal verkeerde beslissingen laten nemen.
Laten we even samen aan tafel zitten en dit oplossen. We gaan outliers verwijderen op een manier die je backtest betrouwbaar maakt, zonder dat je per ongeluk echte marktkansen weggooit.
Wanneer moet ik een outlier verwijderen uit mijn dataset?
Stel je voor: je backtest draait op Python met data van een broker zoals Interactive Brokers of Alpaca.
Je ziet een candle met een prijs van €0,01 terwijl de markt op €50,00 staat. Dat is geen natuurlijke variatie; het is een meetfout. Maar een piek naar €55,00 tijdens een news event?
Dat kan echt zijn. De vuistregel is simpel: verwijder alleen data die onmogelijk klopt.
Echte uitschieters (true outliers)
Een outlier is een waarde die ver afwijkt van de rest, maar je moet eerst checken of het een fout is of een echte uitschieter.
Doe je dit niet, dan train je je bot op fabeltjes en verliest hij geld in de live markt. Echte uitschieters horen bij de markt. Denk aan een flash crash of een extreme volatiliteit piek na een Fed-announcement. Deze waarden zijn zeldzaam maar legitiem.
Als je ze verwijdert, mis je belangrijke risico-scenario's die je bot juist moet leren overleven. Neem de S&P 500 data van 2020: de crash naar beneden was extreem, maar echt.
Je bot moet weten hoe die omgaat met een daling van 10% in een uur. Verwijder je die? Dan train je een bot die denkt dat de markt alleen omhoog gaat. Gebruik gezond verstand: als de data overeenkomt met nieuwsfeiten, bewaar het.
Overige uitschieters
Deze zijn het gevaarlijkst voor je backtest. Denk aan 'bad ticks' door data-leveranciers fouten, verkeerde API responses, of invoerfouten in je Python script.
Een prijs van €1000 op een aandeel van €10? Dat is geen marktactie; het is ruis die je bot verward maakt. Waarom zijn ze gevaarlijk?
Ze vertekenen je gemiddelde en standaardafwijking. Je bot denkt dat winst makkelijk is, maar in de echte wereld triggeren deze ticks verkeerde orders.
Bij risicomanagement wil je geen foute data in je Monte Carlo simulaties.
Hoe leg je uit dat je soms outliers moet verwijderen?
Probeer het uit te leggen aan een collega die geen statisticus is: stel je een dataset voor als een bak appels.
De meeste zijn rood en rond, maar er zit een rotte appel tussen. Die rotte appel verteert niet goed en maakt de hele sap slecht. Outliers verwijderen is als die rotte appel eruit halen – niet om te valsspelen, maar om eerlijke sap te maken.
Of denk aan je backtest voor een trading bot op Binance futures. Je API haalt data op, maar soms mislukt een request en krijg je een nul-waarde terug.
Eenvoudige voorbeelden voor niet-statistici
Dat is niet de markt; het is een technische glitch. Uitleggen aan je team: "We gooien de rotte appels eruit zodat de bot leert van echte marktgedrag, niet van bugs."
Voorbeeld 1: Je backtest op EUR/USD data laat een prijs van €0,001 zien op een normale dag. Dat is geen marktcrash; het is een data-fout van je broker API. Leg uit: "Dit is als een weergave-error in je dashboard – het beïnvloedt je risico-berekening verkeerd." Voorbeeld 2: Een candle sluit op €500 terwijl de open €50 was, zonder nieuws.
Check het nieuwsarchief: geen gebeurtenis. Dit is een bad tick.
Zeg tegen je team: "We verwijderen dit omdat het de bot dwingt te handelen op foute prijzen, wat leidt tot onnodige verliezen in live trading." Voorbeeld 3: Gebruik de interkwartielafstand (IQR) methoden. Bereken Q1 (25e percentiel) en Q3 (75e percentiel).
IQR = Q3 - Q1. Outliers zitten buiten [Q1 - 1.5*IQR, Q3 + 1.5*IQR].
In Python met pandas: df['price'][(df['price'] < Q1 - 1.5*IQR) | (df['price'] > Q3 + 1.5*IQR)]. Dit is objectief en makkelijk uit te leggen: "We meten de 'normale' range en gooien alleen extreme uitschieters eruit."
Stap-voor-stap handleiding: Outliers verwijderen voor je backtest
Wat je nodig hebt: Een Python omgeving met libraries als pandas, numpy en matplotlib (gratis). Data van een broker API zoals Alpaca of Interactive Brokers (kosteloze tier beschikbaar).
Een computer met minimaal 8GB RAM voor datasets tot 1GB. Tijd: 30-60 minuten voor een simpele dataset, afhankelijk van grootte.
Zorg dat je backtest framework (bijv. Backtrader of Zipline) geïnstalleerd is.
- Laad je data in Python: Gebruik pandas om je CSV of API-data in te laden. Bijvoorbeeld:
import pandas as pd; df = pd.read_csv('your_data.csv'). Controleer de eerste 5 rijen metdf.head(). Tijd: 5 minuten. Veelgemaakte fout: Vergeet niet de tijdzone te checken – market data moet UTC zijn om bad ticks te vermijden door tijdsverschillen. - Identificeer outliers visueel: Plot je prijsdata met matplotlib:
import matplotlib.pyplot as plt; plt.plot(df['close']); plt.show(). Kijk naar extreme pieken of dalen. Tijd: 10 minuten. Fout: Alleen kijken naar getallen – check altijd of het overeenkomt met marktgebeurtenissen via nieuws feeds. - Bereken statistieken objectief: Gebruik IQR methoden. Bereken Q1, Q3 en IQR:
Q1 = df['close'].quantile(0.25); Q3 = df['close'].quantile(0.75); IQR = Q3 - Q1. Definieer limieten: lower = Q1 - 1.5*IQR, upper = Q3 + 1.5*IQR. Tijd: 10 minuten. Fout: Gebruik niet alleen gemiddelde en standaardafwijking – die worden snel vertekend door outliers zelf. - Filter en documenteer: Verwijder outliers:
clean_df = df[(df['close'] >= lower) & (df['close'] <= upper)]. Log elke verwijderde waarde in een apart bestand voor transparantie. Tijd: 10 minuten. Fout: Verwijderen zonder reden – noteer altijd waarom (bijv. "bad tick door API error op datum X"). - Backtest op schone data: Draai je algoritmische bot op de gereinigde dataset. Vergelijk resultaten met de originele. Tijd: 15 minuten. Fout: Niet controleren of de bot nu realistischer presteert – check drawdown en winst/risk ratio's.
- Verifieer en tune: Herhaal de backtest met verschillende IQR multipliers (bijv. 1.0 of 2.0) om te zien wat het beste werkt voor je asset. Tijd: 10 minuten. Fout: Te strak filteren – je wilt geen echte kansen missen.
Veelgemaakte fouten en hoe ze te voorkomen
Een grote fout is outliers blindelings verwijderen zonder onderzoek. Doe altijd een check: is dit een meetfout of natuurlijk? Bij Python bots betekent dit je API logs nalopen – bijvoorbeeld bij CCXT voor crypto, check of de exchange downtime had en voorkom fouten door look-ahead bias.
Een andere val: aannemen dat alle extreme waarden fout zijn. Bij high-volatility assets zoals crypto op Binance, kunnen pieken echt zijn.
Gebruik altijd context: vergelijk met volume data. Als volume laag is bij een piek, is het waarschijnlijk een onbetrouwbare tick data.
Voor risicomanagement: verlaag je position sizing niet op basis van gefilterde data alleen. Test met een demo account bij je broker om live prestaties te valideren. Kosten: meestal gratis, maar houd rekening met €10-50 aan transactiekosten voor echte tests.
Verificatie-checklist voor je backtest
Voordat je live gaat, loop deze lijst na. Dit zorgt dat je bot betrouwbaar is en geen foute data gebruikt.
- Is elke outlier verwijderd met een documenteerbare reden? (Check logs)
- Heb je IQR of een objectieve methode gebruikt? (Niet subjectief)
- Komen overgebleven data overeen met marktgebeurtenissen? (Nieuws check)
- Zijn backtest resultaten realistisch? (Vergelijk met benchmark zoals S&P 500)
- Heb je risico's getest? (Drawdown <20%, winst/risk >1.5)
- Is je Python script geoptimaliseerd voor snelheid? (Pandas efficient gebruikt)
- Check live: Draai een kleine forward test op je broker API (bijv. €100 kapitaal).
Als je dit volgt, is je backtest een stuk schoner en je bot klaar voor de markt. Bepaal eerst hoeveel jaar aan data je nodig hebt voor een betrouwbare backtest. Heb je vragen over specifieke data van je broker? Laat het weten – we zitten hier om te helpen.
