Data cleaning: Uitschieters (outliers) verwijderen uit je dataset

Portret van Alex de Vries, Quantitatief Analist & Algo-Trading Expert
Alex de Vries
Quantitatief Analist & Algo-Trading Expert
Financiële Data & Kwaliteit · 2026-02-15 · 8 min leestijd

Stel je voor: je hebt een prachtige backtest gebouwd in Python, je broker-API knippert vrolijk, en je algoritmische bot staat op het punt om de markt te veroveren. Maar dan gebeurt het.

Eén rare prijspiek in je dataset, een uitschieter van 50% omhoog in één minuut, en je bot denkt dat het de heilige graal heeft gevonden.

Je equity curve ziet er fantastisch uit, tot je het echte geld inzet. Bam. De bot gaat door het lint. Dit is de realiteit van data cleaning.

Uitschieters, of outliers, zijn die vervelende data-punten die je model op het verkeerde been zetten. Ze zien eruit als een kans, maar zijn meestal een val.

Wat zijn uitschieters eigenlijk?

Een uitschieter is simpelweg een data-punt dat ver afwijkt van de rest. In de wereld van financiële data gaat het bijna altijd om een prijs die plotseling extreem hoog of laag is, zonder logische reden.

Stel je voor dat de EUR/USD-paar de hele dag tussen de 1,0850 en 1,0860 beweegt. Dan is er opeens een tick op 1,2000. Dat is een uitschieter.

Het is niet de markt die ineens 1500 pips springt; het is waarschijnlijk een data-fout van je data provider of een bug in je API-fetch script.

Waarom is dit zo gevaarlijk voor een algoritmische trader? Omdat je bot geen context heeft. Hij ziet die 1,2000 en denkt: "Wow, een winst van 1140 pips in één tick!

Een uitschieter is als een valse noot in een symfonie: één verkeerde toon kan het hele stuk verpesten.

Dit moet een signaal zijn om te kopen." Hij gaat short op de normale prijs en long op die ene piek, wat je risicomanagement volledig ontregelt. Je positiegrootte wordt berekend op basis van verkeerde volatility data, je stop-losses worden getriggerd op foute niveaus, en je hele backtest resultaat is gebaseerd op lucht.

Deze afwijkingen komen in alle soorten en maten voor. Je hebt prijs-uitschieters, volume-uitschieters (een trade volume van 1 miljard lot op een normale markt), en zelfs tijd-uitschieters (een candle die ineens 4 uur duurt in plaats van 1 minuut).

In de kern is elke afwijking die je niet kunt verklaren met marktlogica een outlier die schoongemaakt moet worden.

Waarom je dataset opschonen essentieel is

Je backtest is je glazen bol. Als je dataset vol gaten en pieken zit, kijk je door een gebroken lens.

Een backtest op een dataset met uitschieters geeft je een vertekend beeld van de werkelijkheid. Je denkt dat je strategie een Sharpe ratio van 3.0 haalt, maar in de echte markt kom je niet verder dan 0.5. Het vertrouwen in je bot brokkelt af op het moment dat je live gaat, en dat is het duurste wat je als trader kunt meemaken.

Risicomanagement draait om het beheersen van het onbekende. Uitschieters introduceren ruis in je data, wat leidt tot foute beslissingen.

Je VaR (Value at Risk) berekening wordt onbetrouwbaar. Je model denkt dat de markt extreem volatiel is, terwijl het gewoon om een data-fout gaat.

Je bot gaat dan te defensief traden, of juist te agressief, afhankelijk van hoe de outlier je statistieken beïnvloedt. In de wereld van Python backtesting, waar elke tick telt, is schone data je grootste asset. Stel je voor dat je een mean-reversion strategie draait op de AEX-index. Je bot koopt als de prijs ver onder het gemiddelde duikt.

Als er een uitschieter van 20% naar beneden is in je data, denkt je bot dat hij een koopje heeft gevonden. In werkelijkheid is het een fout.

Je bot koopt op een verkeerd moment en zit vervolgens vast in een positie die nooit had moeten bestaan. Het resultaat? Verlies op verlies, terwijl je backtest liet zien dat de strategie winstgevend was. Bovendien beïnvloeden uitschieters je optimisatieproces.

Als je parameters tune op een dataset met outliers, past je model zich aan die ruis aan.

Je vindt de perfecte instellingen voor een dataset die niet bestaat. Zodra je live gaat, faalt de strategie omdat de echte markt schoon is. Het opschonen van je data is dus niet alleen een kwestie van netheid; het is een kwestie van overleven.

Hoe vind en verwijder je uitschieters?

Het proces begint bij je data provider. Sommige brokers, zoals Interactive Brokers of LMAX, leveren redelijk schone data, maar zelfs daar sluipen fouten binnen.

Je eerste stap is visualisatie. Gebruik Python libraries zoals Matplotlib of Plotly om je prijsreeks te plotten. Zoom in op de staarten van de distributie. Zie je een candle die eruit springt als een zere duim?

Dat is je eerste kandidaat. Maar visuele inspectie alleen is niet genoeg voor een algoritmische bot; je hebt een systematische aanpak nodig.

Een populaire methode is de Z-score. Je berekent voor elke prijs de afwijking van het gemiddelde, gedeeld door de standaardafwijking.

Een Z-score groter dan 3 of kleiner dan -3 wordt vaak als outlier beschouwd. Voordat je dit berekent, is het verstandig om missende data te interpoleren met Pandas: df['z_score'] = (df['close'] - df['close'].mean()) / df['close'].std()

Vervolgens filter je de rijen waar de Z-score buiten [-3, 3] valt. Dit werkt goed voor normale verdelingen, maar financiële data is vaak scheef (skewed).

Daarom is de interkwartielafstand (IQR) een beter alternatief. Je berekent Q1 (25e percentiel) en Q3 (75e percentiel), trekt Q1 af van Q3, en bepaalt de onder- en bovengrens als Q1 - 1.5*IQR en Q3 + 1.5*IQR. Alles daarbuiten is een outlier. In Python:

Q1 = df['close'].quantile(0.25)
Q3 = df['close'].quantile(0.75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR

Maar wees voorzichtig. In financiële data zijn extreme bewegingen soms legitiem, zoals tijdens een flash crash of een grote nieuwsgebeurtenis.

Je wilt deze niet zomaar verwijderen. In plaats daarvan kun je outliers vervangen door het gemiddelde van de voorgaande en volgende candle, of door interpolatie.

Variatie 1: Rolling Window voor dynamische detectie

Voor een algoritmische bot die op tick-data draait, is dit cruciaal. Geen rekening houden met bad ticks kan een gat in je dataset creëren dat je bot onbedoelde signalen geeft. Voor volume-uitschieters geldt hetzelfde. Een volume-piek kan wijzen op een grote institutionele trade, maar het kan ook een data-fout zijn.

Gebruik een vergelijkbare IQR-aanpak op volume, maar houd rekening met de marktcontext. In Python, met libraries als TA-Lib, kun je technische indicatoren zoals Average True Range (ATR) gebruiken om abnormaliteiten te detecteren.

Als de ATR ineens 10x hoger is dan normaal, is dat een rode vlag.

Voor intraday trading bots is een statische Z-score niet altijd voldoende. Gebruik een rolling window van bijvoorbeeld 20 candles om het gemiddelde en de standaardafwijking dynamisch te berekenen. Dit vangt tijdelijke volatiliteitspieken op zonder je hele dataset te vervuilen. In Python:

df['rolling_mean'] = df['close'].rolling(window=20).mean()
df['rolling_std'] = df['close'].rolling(window=20).std()
df['z_score_roll'] = (df['close'] - df['rolling_mean']) / df['rolling_std']
Dit is ideaal voor brokers zoals MetaTrader of cTrader, waar de API data in batches aanlevert.

Je past dit toe op elke batch voordat je de backtest draait. Prijzen voor een data feed van een broker als Interactive Brokers liggen rond de €50-€100 per maand voor futures data, afhankelijk van de markt. Voor geavanceerde bots kun je machine learning inzetten.

Variatie 2: Machine Learning benadering

Gebruik een Isolation Forest of een Local Outlier Factor (LOF) model via scikit-learn.

Deze algoritmen leren wat "normaal" is op basis van meerdere features, zoals prijs, volume, en tijd. Train het model op historische data van je broker, en pas het toe op nieuwe ticks.

Dit is krachtig voor high-frequency trading bots waarbij elke micro-piek telt. De kosten?

Scikit-learn is gratis, maar de rekenkracht voor training kan oplopen. Een AWS EC2 instance voor ML training kost ongeveer €0.10 per uur, maar voor grootschalige backtests met jaren aan tick-data kan dit €50-€200 per maand worden. Het voordeel is een robuuster model dat beter omgaat met marktanomalieën zoals de flash crash van 2010.

Praktische tips voor algoritmische traders

Begin altijd met ruwe data inspectie voordat je een enkele regel code schrijft. Let bij het kopen van historische data altijd op de kwaliteit; download een week aan tick-data van je broker, plot het, en kijk naar abnormaliteiten.

Gebruik tools zoals Jupyter Notebooks voor interactieve analyse. Zet je broker-API zo in dat je raw data archiveert; je wilt altijd kunnen terugvallen op het origineel. Test je cleaning proces op een aparte dataset.

Draai een backtest op ruwe data en op geschoonde data, en vergelijk de resultaten.

Als het verschil groot is, weet je dat outliers een impact hebben. Voor risicomanagement, stel altijd een maximum in op het aantal verwijderde punten; bijvoorbeeld niet meer dan 1% van je dataset. Dit voorkomt dat je te veel data verliest. Integreer cleaning in je pipeline.

Gebruik Python functies die automatisch outliers detecteren en vervangen elke keer dat je nieuwe data fetcht van je broker. Voor trading bots op platforms zoals QuantConnect of Backtrader, kun je dit als pre-processing stap opnemen.

Denk aan kosten: een goede data provider kost €20-€100 per maand, maar het bespaart je duizenden euro's aan verkeerde trades. Tot slot, vergeet niet je risicomanagement aan te passen. Als je uitschieters verwijdert, hercalculeer dan je volatiliteitsmetingen.

Gebruik ATR of Bollinger Bands om de echte marktomstandigheden te vangen. Zo bouw je een bot die niet alleen slim is, maar ook veilig.

Ga aan de slag, schoon je data, en trade met vertrouwen.

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.

Volgende stap
Bekijk alle artikelen over Financiële Data & Kwaliteit
Ga naar overzicht →