Augmented Dickey-Fuller (ADF) test uitvoeren met Statsmodels
Stel je voor: je hebt een prachtige trading bot gebouwd in Python, je backtest draait soepel via de API van Interactive Brokers of Alpaca, en je risicomanagement lijkt waterdicht. Toch klopt er iets niet.
Je strategie presteert in de backtest, maar faalt live. Waarom? Omdat je marktdata mogelijk een tijdelijke trend volgt die eigenlijk nergens op gebaseerd is.
Hier komt de Augmented Dickey-Fuller (ADF) test om de hoek kijken. Het is een simpele, krachtige tool die je helpt te bepalen of je tijdreeks stationary is of niet. In algoritmische trading is dat het verschil tussen winst en verlies.
Wat is de ADF test en waarom moet je het gebruiken?
De Augmented Dickey-Fuller (ADF) test is een statistische toets die controleert of een tijdreeks stationary is. Een stationary tijdreeks heeft een gemiddelde en variantie die niet veranderen over tijd. Denk aan een ruis-signaal: het schommelt rond een vaste waarde.
Een niet-stationary tijdreeks, zoals een aandelenkoers die gestaag stijgt, heeft een trend die de data vertekent.
Waarom is dit belangrijk voor algoritmische trading? Omdat veel modellen, zoals ARIMA of mean-reversion strategieën, alleen werken als de data stationary is.
Als je een niet-stationary tijdreeks gebruikt, krijg je misleidende resultaten in je backtest. Je bot denkt een patroon te zien, maar het is gewoon ruis. De ADF test helpt je deze valkuil te omzeilen.
De test is vernoemd naar de economen David Dickey en Wayne Fuller.
Het is een uitbreiding van de eenvoudige Dickey-Fuller test en houdt rekening met autocorrelatie in de data. In Python voer je het uit met de Statsmodels bibliotheek, een must-have voor elke quantitative trader.
Hoe werkt de ADF test in de praktijk?
De kern van de ADF test is simpel: je test de nullhypothese dat de tijdreeks een unit root heeft.
Een unit root betekent dat de tijdreeks niet stationary is. Als de p-waarde laag is (meestal onder 0,05), verwerp je de nullhypothese en concludeer je dat de tijdreeks stationary is. Als de p-waarde hoog is, is de tijdreeks niet stationary. Om de test uit te voeren met Statsmodels, installeer je eerst de bibliotheek via pip install statsmodels.
Vervolgens laad je je tijdreeks, bijvoorbeeld de sluitingskoers van een aandeel zoals Apple (AAPL) of de EUR/USD wisselkoers. Gebruik een API van een broker zoals Interactive Brokers of Alpaca om real-time data te halen.
Voor backtesting kun je historische data van Yahoo Finance of Quandl laden.
De code is eenvoudig. Hier is een voorbeeld: from statsmodels.tsa.stattools import adfuller
import pandas as pd
data = pd.read_csv('aapl_prices.csv')
result = adfuller(data['Close'])
print('ADF Statistic:', result[0])
print('p-value:', result[1]) De output geeft je de ADF-statistiek en de p-waarde.
Een negatieve ADF-statistiek wijst op stationary, maar de p-waarde is de echte beslissende factor. Als die onder 0,05 ligt, is je tijdreeks stationary.
Varianten en toepassingen in trading bots
Er zijn varianten van de ADF test, zoals de Phillips-Perron test, die robuuster is tegen outliers.
Maar voor de meeste trading bots is de ADF test voldoende. Je kunt de test integreren in je Python bot om automatisch te controleren of je data stationary is voordat je een strategie toepast. Bijvoorbeeld, voor een mean-reversion strategie op EUR/USD, test je de tijdreeks van de wisselkoers.
Als deze stationary is, kun je een bot bouwen die inzet op terugkeer naar het gemiddelde. Een praktisch voorbeeld: stel je gebruikt een bot op Binance voor crypto trading.
Je laadt de Bitcoin-prijs in USD en voert de ADF test uit.
Als de p-waarde hoog is, is de prijs niet stationary en moet je de data differëntiëren (bijvoorbeeld de log-return berekenen) om het stationary te maken. Dit voorkomt dat je bot foute signalen geeft. Prijsindicaties: voor een backtest met 1 jaar data betaal je bij Quandl ongeveer €50-€100 per dataset, afhankelijk van de frequentie. Een API-abonnement bij Interactive Brokers kost €10-€20 per maand voor basisdata.
Gebruik deze kosten in je risicomanagement: als je bot €1000 per maand verdient, is €20 voor data een kleine investering. Voor risicomanagement kun je de ADF test combineren met andere statistieken, zoals de Hurst exponent of de KPSS test.
Deze geven een vollediger beeld van je tijdreeks. In een Python bot kun je statistische tests uitvoeren op tijdreeksen om automatisch de stationary check uit te voeren en je strategie aan te passen of uit te schakelen als de data niet betrouwbaar is.
Praktische tips voor algoritmische traders
Eerst, test altijd op meerdere tijdframes. Een tijdreeks kan stationary zijn op een 1-uur chart maar niet op een dagchart.
Gebruik verschillende datasets om je bot robuust te maken. Bijvoorbeeld, test EUR/USD op 1-uur, 4-uur en dagelijkse data via de API van je broker.
Twee, combineer de ADF test met visualisatie. Plot je tijdreeks en kijk naar trends. Als de lijn omhoog gaat, is de kans groot dat de tijdreeks niet stationary is.
Gebruik libraries zoals Matplotlib of Plotly in Python voor financiële analyse om interactieve charts te maken. Drie, pas op voor outliers.
De ADF test is gevoelig voor extreme waarden, zoals een crash in de aandelenmarkt. Verwijder of corrigeer deze eerst. In risicomanagement betekent dit dat je altijd een stop-loss instelt in je bot, bijvoorbeeld op 2% van je kapitaal. Vier, integreer de test in je backtesting workflow.
Gebruik Python packages zoals Backtrader of Zipline en vergeet niet om unit testing voor je trading logica toe te passen bij het testen met de ADF test als voorwaarde.
Als de tijdreeks niet stationary is, skip de trade. Dit verhoogt de betrouwbaarheid van je resultaten. Tot slot, houd rekening met kosten.
Een professionele setup met data-API's en serverkosten kan €100-€500 per maand zijn. Maar de inzichten van de ADF test kunnen je bot winstgevender maken, waardoor deze kosten snel terugverdienen. Onthoud: trading is risicovol, dus test altijd op een demo-account voordat je live gaat.
