Z-Score berekenen voor Mean Reversion strategieën

Portret van Alex de Vries, Quantitatief Analist & Algo-Trading Expert
Alex de Vries
Quantitatief Analist & Algo-Trading Expert
Python Libraries voor Algoritmische Trading · 2026-02-15 · 6 min leestijd

Stel je voor: je kijkt naar een aandeel dat al dagen blijft hangen rond een bepaalde prijs, en je vraagt je af of het nu echt zo ver weg is van wat 'normaal' is.

Dat gevoel van afwijking is precies wat een Z-Score meet, en het is een gamechanger voor mean reversion strategieën in Python. Het helpt je niet alleen om overreacties te spotten, maar ook om op een gestructureerde manier in te stappen zonder op gevoel te handelen. Je gebruikt het om te bepalen of een prijs tijdelijk is uitgeweken en waarschijnlijk terugkeert naar zijn gemiddelde. In de wereld van algoritmische trading bots is dat een basis die je niet wilt missen.

Wat is een Z-Score en waarom doet het ertoe?

Een Z-Score zegt simpelweg hoeveel standaarddeviaties een waarde afwijkt van het gemiddelde. In plaats van te raden of een prijs 'hoog' of 'laag' is, krijg je een getal dat die perceptie objectief maakt.

Voor mean reversion betekent dit: een Z-Score van -2 suggereert dat de prijs ver beneden het gemiddelde ligt en mogelijk herstelt. Je gebruikt het om entry- en exitmomenten te timen, in plaats van achter het nieuws aan te lopen. Het is een simpele, krachtige filter die je risico beheerst en je bot meer discipline geeft.

Waarom is dit belangrijk voor jouw setup? Omdat je met backtesting in Python wilt zien hoe een strategie reageert onder verschillende marktomstandigheden.

Z-Score helpt je om scenario's te testen: wat als de markt scherp daalt, wat als hij zijwaarts beweegt? Je kunt de gevoeligheid van je parameters afstemmen op de volatiliteit van het instrument. Bij brokers zoals Interactive Brokers of LYNX, via hun API, zorg je voor een soepele uitvoer zodra je signaal verschijnt. Het resultaat is een robuustere bot die minder emotie en meer logica volgt.

De kern: zo bereken je de Z-Score in Python

Je begint met een tijdreeks van prijzen, bijvoorbeeld de slotkoersen van de afgelopen 20 dagen. Je berekent het gemiddelde en de standaarddeviatie over dat venster.

De Z-Score voor vandaag is (prijs_vandaag − gemiddelde) / standaarddeviatie. Een waarde van 0 betekent exact op het gemiddelde; een waarde van 1,5 betekent 1,5 standaarddeviaties erboven. Als je bot een drempel instelt, bijvoorbeeld Z > 1,8 voor short of Z < −1,8 voor long, krijg je een duidelijk entry-signaal.

In code ziet dat er zo uit: je laadt een DataFrame met pandas, gebruikt rolling(window=20) voor gemiddelde en standaarddeviatie, en telt de Z-Score toe.

Je kunt de functie in je trading bot integreren, zodat elke nieuwe candle automatisch wordt doorgerekend. Zorg dat je de NaN-waarden aan het begin van de reeks afvangt; zonder voldoende data kun je geen betrouwbare score berekenen. Test verschillende vensterlengtes: 10, 20, 50, afhankelijk van het instrument en de tijdframes die je handelt.

Z-Score is geen magische bol, maar een thermometer: je meet de temperatuur van de markt voordat je het zwembad in springt.

Op een 5-minuten grafiek werkt een korter venster vaak beter dan op een daggrafiek. Om je bot stabiel te houden, voeg je een ruisfilter toe.

Bijvoorbeeld: alleen een signaal als de Z-Score drie bars op rij boven je drempel blijft.

Dit voorkomt dat je in- en uitstapt op elke kleine beweging. Combineer dit met een stop-loss die rekening houdt met de standaarddeviatie, bijvoorbeeld 1,5× de dagelijkse volatiliteit. Je risicomanagement wordt zo meegenomen in de berekening, in plaats van later toegevoegd. Dat voelt directer en veiliger.

Varianten en modellen met prijsindicaties

De klassieke Z-Score op een enkele tijdreeks is een prima start, maar je kunt hem verfijnen. Gebruik een geëxponentialiseerde versie waarbij recente prijswegen zwaarder tellen.

Of bereken de Z-Score op residuals van een spread, zoals een pair trade tussen twee aandelen. Voor mean reversion op indices kan een Bollinger Band-achtige band helpen: de boven- en ondergrens zijn gemiddelde ± k × standaarddeviatie, en je Z-Score vertelt je waar je binnen die band staat. Voor een meer responsieve variant neem je een rolling z-score op een korter venster, maar combineer je dat met een langere trendfilter.

Prijsindicaties geven je concrete doelen. Stel je handelt een aandeel dat rond €45 noteert, met een gemiddelde van €44 en een standaarddeviatie van €1,2.

Een Z-Score van −2 ligt dan rond €41,6; een Z-Score van +2 rond €46,4. Je kunt je take-profit instellen op €44,5 voor een shortpositie, met een stop op €47,2 om rekening te houden met extra volatiliteit. Voor een crypto zoals BTC/USD op €30.000, met een standaarddeviatie van €1.000 over 20 uur, ligt een Z-Score van −2 rond €28.000. Je bot kan dan automatisch een long plaatsen met een target op €29.500 en een stop op €27.000.

Deze getallen geven je handel vorm en helpen bij risicomanagement via de API van je broker. Je kunt ook technische indicatoren berekenen om varianten te gebruiken die rekening houden met de verdeling van returns.

In plaats van alleen prijzen, bereken je de Z-Score op logreturns, wat beter werkt bij sterk wisselende volatiliteit. Je kunt een rolling Z-Score combineren met een volume-filter: alleen signalen als het volume 1,2× het gemiddelde is, om valse doorbraken te vermijden. Bij backtesting in Python test je deze modellen op verschillende datasets: aandelen, indices, crypto. Gebruik de Kelly Criterion formule in Python om je positiegrootte vervolgens optimaal te bepalen.

Je bekijkt de winstcurve, het maximum drawdown en de winst per transactie.

Zo stem je het model af op jouw broker en API, en voorkom je dat je bot te gevoelig wordt voor ruis.

Praktische tips voor je trading bot en backtesting

Begin klein. Test je Z-Score-strategie op een enkel instrument, bijvoorbeeld een AEX-aandeel of een populaire crypto, en draai minimaal 500 trades in backtest.

Gebruik een realistische transactiekostenstructuur, zoals €2 per trade bij een broker als LYNX, en neem slippage mee. Zorg dat je API-toegang stabiel is; een vertraging van een paar seconden kan je edge verliezen.

  • Stel een drempel in op basis van volatiliteit: Z > 1,8 voor short, Z < −1,8 voor long, en pas aan per instrument.
  • Filter met volume: alleen trades als volume 1,2× het gemiddelde is, om valse signalen te reduceren.
  • Gebruik een stop-loss en take-profit gebaseerd op standaarddeviatie: stop op 1,5× de dagelijkse volatiliteit, target op het gemiddelde.
  • Backtest op meerdere tijdframes: 5-minuten voor snelle mean reversion, dagelijks voor stabielere trades.
  • Monitor je bot live: log elke trade, analyseer de Z-Score bij entry en exit, en optimaliseer parameters na elke 100 trades.

Gebruik een aparte account voor live-trading en houd je risico per trade laag, bijvoorbeeld 0,5% tot 1% van je totale kapitaal. Denk aan risicomanagement: zet een maximum aan openstaande posities, bijvoorbeeld drie tegelijk, en diversifieer over sectoren. Gebruik een dashboard in Python, met libraries zoals Plotly of Streamlit, om je Z-Score en andere technische indicatoren in één oogopslag te zien. Combineer dit met alerts via je broker-API, zodat je bot direct reageert zonder dat je constant achter een scherm zit.

En tot slot: blijf experimenteren. Mean reversion werkt het beste in zijwaartse markten, maar kan in sterke trends verliezen opleveren.

Je bot moet kunnen schakelen, en de Z-Score helpt je om die keuze elke dag opnieuw te maken.

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 Python Libraries voor Algoritmische Trading
Ga naar overzicht →