Wat is 'Stationarity' en waarom moet je data transformeren voor AI?

Portret van Alex de Vries, Quantitatief Analist & Algo-Trading Expert
Alex de Vries
Quantitatief Analist & Algo-Trading Expert
Machine Learning & AI in Trading · 2026-02-15 · 8 min leestijd

Stel je voor: je bouwt een gave trading bot in Python. Je haalt historische data op via de API van je broker, zoals Interactive Brokers of Alpaca, en je test je strategie met backtesting libraries als Backtrader of VectorBT.

Je ziet prachtige resultaten. Je zet de bot live en... poef.

De bot faalt compleet. Waarom? Omdat de data die je gebruikte voor de training niet hetzelfde was als de data die de bot nu tegenkomt. Dat is precies waar stationarity – oftewel stationariteit – om de hoek komt kijken. Het is het onzichtbare fundament waar elke succesvolle AI-model voor algoritmische handel op rust.

Wat is stationariteit eigenlijk?

Stel je een rivier voor. Als je naar de waterstand kijkt, heb je eb en vloed.

Elke dag piekt en daalt het water op ongeveer dezelfde manier, met een beetje variatie door wind en regen. De gemiddelde waterstand en de manier waarop het stijgt en daalt veranderen niet structureel. Dat is stationair. De tegenhanger is een rivier die door klimaatverandering langzaam verandert.

Misschien begint de zeespiegel te stijgen, waardoor de gemiddelde waterstand elk jaar iets hoger komt te liggen.

Of er komt een nieuwe dam, waardoor de pieken en dalen compleet anders worden. Dat is niet stationair. In de wereld van trading bots noemen we de rivier de tijdreeks – de prijsgegevens. Een stationaire tijdreeks heeft:

  • Een constant gemiddelde (mean) over tijd.
  • Een constante variantie (hoeveel de prijs schommelt).
  • Een stabiele relatie tussen punten in de tijd (autocorrelatie).

Veel financiële data, zoals de Bitcoin koers of de S&P 500 index, zijn niet stationair. De gemiddelde prijs over de afgelopen 10 jaar ligt vele malen hoger dan 10 jaar geleden.

De schommelingen worden ook groter naarmate de prijs stijgt. AI-modellen, zoals die in je Python bot, gedijen slecht op deze bewegende bodem.

Waarom je AI bot faalt zonder transformatie

AI-modellen, en dan specifiek regressiemodellen of tijdreeksmodellen zoals LSTM of ARIMA, zijn statistische machines. Ze zoeken patronen in historische data om toekomstige waarden te voorspellen.

Ze gaan er impliciet van uit dat de regels die golden in het verleden, ook gelden in de toekomst. Als je niet-stationaire data voedt aan een model, leert het verkeerde lessen. Neem een simpel voorbeeld: je traint een bot op de prijs van Apple aandelen (AAPL) van 2010 tot 2020.

De prijs steeg van €30 naar €130. Het model leert: "als de prijs stijgt, koop meer." Dat werkt prima in een bull market.

Maar als de markt draait en de prijs daalt naar €100, denkt het model dat dit een tijdelijke correctie is en koopt het door. De bot zit nu vast in een dalende markt. Het model heeft de trend geleerd, niet de onderliggende relatie tussen vraag en aanbod.

De variantie is ook veranderd; in 2010 bewoog de prijs €0.50 per dag, in 2020 was dat €5.00. Je risicomanagement wordt hierdoor volledig ondermijnd.

Als je data niet stationair is, vergelijk je appels met peren. Je model traint op de prijs van gisteren, maar de markt van vandaag is een heel andere wereld.

Wanneer je de data transformeert, maak je de speelveld gelijk. Je haalt de trend en de veranderende variantie weg, zodat het model puur kijkt naar de relatieve beweging.

Dit is essentieel voor risicomanagement en het behouden van een stabiele winstgevendheid.

De kern: Hoe transformeer je data voor trading bots?

Er zijn een paar simpele manieren om niet-stationaire data om te toveren tot stationaire data die je direct kunt gebruiken in je Python backtesting scripts.

We focussen op de meest praktische voor algoritmische handel. 1. Log Returns (Logaritmische rendementen)
Dit is de gouden standaard.

  • Waarom? Log returns zijn symmetrisch. Een stijging van 10% en een daling van 10% hebben dezelfde magnitude.
  • Voordeel: De gemiddelde log return over tijd is vaak stabiel, zelfs als de prijs explodeert.
  • Praktisch: In Python met Pandas is dit een enkele regel code: df['returns'] = np.log(df['close'] / df['close'].shift(1)).

In plaats van de absolute prijs te gebruiken, bereken je het procentuele verschil tussen opeenvolgende prijzen, maar dan in logaritme. De formule is simpel: ln(Prijs_t / Prijs_t-1).

Gebruik dit voor bijna elke bot die je bouwt. Het is de basis voor risicomanagement omdat het de impact van compound interest correct weergeeft.

  • Wanneer gebruik je dit? Als je een eenvoudig momentum model bouwt dat kijkt naar prijsverschillen in euro's.
  • Nadeel: De variantie is nog steeds afhankelijk van de absolute prijs. Een verschil van €10 op een aandeel van €100 is anders dan op een aandeel van €1000.

2. Differencing (Eerste orde differencing)
Soms is de prijs lineair aan het stijgen. Door de huidige prijs af te trekken van de vorige prijs, verwijder je de lineaire trend. Je houdt over: Prijs_t - Prijs_t-1.

Dit is het absolute verschil, niet het procentuele. Voor de meeste trading bots zijn log returns dus superieur.

Ze normaliseren de data automatisch. 3. Rolling Statistics Normalisatie
Stel je voor: je handelt in Forex paren, zoals EUR/USD.

De prijs beweegt tussen 1.05 en 1.15. Om de bot te helpen, kun je de prijs normaliseren ten opzichte van een bewegend gemiddelde.

De formule is: (Prijs_t - MovingAverage) / StandardDeviation. Dit heet Z-score normalisatie. Je zet de data om in standaardafwijkingen.

Als de prijs 2 standaardafwijkingen boven het gemiddelde ligt, weet de bot dat het extreem is.

Dit is cruciaal voor AI-modellen die gevoelig zijn voor de schaal van de input, zoals neurale netwerken. Door middel van slimme feature engineering zorg je ervoor dat de gewichten in het netwerk wél kunnen convergeren.

Varianten en modellen met prijsindicaties

Welke transformatie kies je voor welk type bot? Dit hangt af van je broker en je strategie. Laten we een paar concrete voorbeelden bekijken.

Voor Mean Reversion Bots (Terugkeer naar gemiddelde)
Als je een bot bouwt die ervan uitgaat dat de prijs terugkeert naar een gemiddelde (bijvoorbeeld een Bollinger Bands strategie), moet je data stationair zijn.

Gebruik hier de Z-score normalisatie. Stel: je gebruikt de API van TradingView of een broker zoals Degiro via Python.

Je haalt de 20-daagse Moving Average en de standaarddeviatie. Je berekent de Z-score. Als de Z-score onder -2 duikt, koop je.

Dit werkt omdat de verdeling van de data stabiel blijft. Prijsindicatie: Een bot voor Mean Reversion op aandelen zoals ING (rond €12-€15) vereist weinig rekenkracht.

Een backtest op een laptop duurt maar een paar seconden. Voor Trend Following Bots
Hier wil je de log returns gebruiken. Waarom? Omdat je geïnteresseerd bent in de kracht van de beweging, niet de absolute hoogte. Stel je voor dat je een bot bouwt voor crypto via de Binance API.

Bitcoin schiet van €20.000 naar €60.000. Als je de ruwe prijs gebruikt, denkt het model dat de beweging extreem groot is.

Als je log returns gebruikt, zie je dat de versnelling stabiel is.

Combineer dit met een risicomanagement script dat de Annualized Sharpe Ratio berekent. De Sharpe ratio is een maat voor risicogecorrigeerde return. Door log returns te gebruiken, wordt deze berekening veel nauwkeuriger.

Deep Learning Modellen (LSTM/GRU)
Voor complexe AI modellen in Python (met libraries als TensorFlow of PyTorch) is normalisatie niet optioneel, het is verplicht. Zonder het toepassen van Min-Max scaling (data schalen tussen 0 en 1) of Z-score, zal je model nooit leren. Stel je een LSTM-bot voor die voorspelt of de volgende candle groen of rood is, al falen veel AI-bots door regime change in de echte markt.

De input features kunnen zijn: Price, Volume, RSI, MACD. Zonder normalisatie zal de 'Price' feature (bijv. €150) de 'RSI' feature (bijv.

70) volledig overheersen in de berekening van de fout.

Praktische tips voor je Python backtesting

Oké, genoeg theorie. Hoe pas je dit toe in je code zonder gek te worden?

  1. Haal schone data op: Gebruik een library als yfinance of een API van je broker. Zorg dat er geen gaten (NaNs) in zitten. Een foutieve candle van €0.01 kan je hele normalisatie verpesten.
  2. Bereken returns vóór de split: Deel je data nooit zomaar op in train en test sets voor je de transformatie hebt toegepast. Doe de normalisatie op de volledige dataset, of bereken de rolling statistics alleen op de trainset en pas die toe op de testset (look-ahead bias voorkomen!).
  3. Check de distributie: Gebruik een histogram in Matplotlib of Seaborn. Ziet de verdeling van je data eruit als een mooie bel (normale verdeling)? Goed. Is het scheef? Dan is transformatie nodig.
  4. Backtest met risicomanagement: Als je log returns gebruikt, pas dan je position sizing aan. Als je bot zegt: "Koop 100 aandelen", reken dan uit wat 100 aandelen doen met je portefeuille op basis van de historische volatiliteit (standaarddeviatie van de returns).
  5. Live forward test: Zet je getransformeerde model live op een demo account bij je broker. Kijk of de bot reageert zoals je verwachtte. De markt is nooit perfect stationair, dus hou de parameters scherp.

Hier is een stappenplan voor je volgende backtest. Een fout die beginners vaak maken: ze normaliseren de toekomstige data met parameters uit de toekomst.

Dat is vals spelen. Gebruik in je Python code altijd de mean en std van de train set voor de test set. Stationariteit is geen academische grap.

Het is het verschil tussen een bot die €500 verliest en een bot die consistent €50 per week verdient. Door je data te transformeren, geef je je AI model de beste kans om te slagen in de chaotische wereld van de financiële markten. Nu is het tijd om via machine learning voor trading van theorie naar live bot je Python script open te trekken en je data eens goed te bekijken.

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 Machine Learning & AI in Trading
Ga naar overzicht →