Co-integratie testen tussen twee aandelen met Python
Stel je voor: je zit achter je scherm, je favoriete Python-omgeving draait, en je wilt weten of twee aandelen samen horen. Niet zomaar een gevoel, maar een test die je helpt betere beslissingen te nemen. Co-integratie is precies dat: een manier om te zien of twee aandelen op de lange termijn een stabiele relatie hebben, zelfs als ze op de korte termijn flink bewegen.
In de wereld van algoritmische trading bots, backtesting en risicomanagement is dit een krachtig hulpmiddel.
Je gebruikt het om pairs trading te doen, om risico’s te spreiden en om betrouwbare signalen te vinden. In deze gids leer je hoe je co-integratie test tussen twee aandelen met Python, zonder ingewikkelde theorie, maar wel met concrete stappen en bruikbare code.
Wat is co-integratie en waarom is het nuttig?
Co-integratie betekent dat twee tijdreeksen, zoals de aandelenkoersen van bedrijf A en bedrijf B, op de lange termijn een vaste relatie hebben. Ze bewegen niet los van elkaar; hun prijsverschil blijft gemiddeld stabiel.
Je kunt het zien als een soort rubberen band: de band rekt uit, maar trekt altijd weer terug naar een vaste lengte.
In de praktijk betekent dit dat als het ene aandeel stijgt en het andere daalt, je kunt verwachten dat ze weer naar elkaar toekomen. Dat is handig voor pairs trading: je koopt het ene aandeel en short het andere, en wacht tot de band weer strak komt. Waarom is dit belangrijk voor jou als trader?
Omdat het helpt om marktneutrale posities in te nemen. Je bent minder afhankelijk van de algehele marktbeweging en meer gericht op de relatie tussen twee aandelen.
Dit vermindert je marktrisico en verbetert je risicomanagement. In een backtesting-omgeving kun je deze strategie testen met historische data, en via een broker-API kun je het live uitvoeren. Denk aan brokers zoals Interactive Brokers of Alpaca, die goede API’s bieden voor Python. Als je een algoritmische bot bouwt, is co-integratie een van de fundamenten voor een stabiele strategie.
Een misverstand: co-integratie is niet hetzelfde als correlatie. Correlatie kijkt naar kortetermijnbewegingen, maar co-integratie bekijkt de langetermijnrelatie.
Twee aandelen kunnen kort samenhangen, maar op lange termijn uiteenlopen. Co-integratie test of er een duurzame band is. Dit maakt het sterker voor strategieën die gericht zijn op risicobeheer en langere termijn.
Hoe test je co-integratie met Python?
Om co-integratie te testen, gebruiken we meestal de Engle-Granger-test of de Johansen-test.
Deze tests controleren of er een lineaire combinatie van de twee tijdreeksen bestaat die stationair is. In gewone taal: of er een combinatie is die op de lange termijn stabiel blijft.
Je kunt dit doen met Python, waarbij je historische data ophaalt via een API van je broker of een data-provider zoals Yahoo Finance. Voor backtesting is het handig om data te gebruiken die je al hebt opgeslagen, zodat je snel kunt itereren. Stap 1: verzamel de data. Haal de dagelijkse sluitprijzen op voor twee aandelen, bijvoorbeeld Shell (SHEL) en BP (BP).
Gebruik een library zoals yfinance of een broker-API. Zorg dat je voldoende data hebt, minstens 2 tot 5 jaar, om langetermijnrelaties te zien.
Voorbeeld: je haalt de data voor SHEL en BP van 2019 tot 2024, met een dagelijks frequentie. Dit geeft je ongeveer 1250 datapunten, genoeg voor een betrouwbare test. Stap 2: voorbereiden van de data.
Log-transformeer de prijzen om schaalverschillen te verminderen en check of de tijdreeksen integratie van orde 1 zijn (dat wil zeggen, niet-stationair). Gebruik hiervoor de Augmented Dickey-Fuller (ADF)-test.
Als beide reeksen niet-stationair zijn, maar hun verschil wel, dan is er potentie voor co-integratie.
In Python doe je dit met libraries zoals pandas en statistische tests uitvoeren op tijdreeksen met statsmodels. Stap 3: voer de co-integratietest uit. Gebruik de Engle-Granger-test: regressieer de ene reeks op de andere, en test of de residuen stationair zijn.
In code ziet dit er zo uit: je past een lineaire regressie toe, berekent de residuen, en voert een ADF-test uit op die residuen. Als de p-waarde laag is (bijvoorbeeld onder 0.05), is er co-integratie.
Voor de Johansen-test, die meerdere variabelen aankan, gebruik je een multivariate analyse.
Dit is nuttig als je meer dan twee aandelen wilt testen.
Praktische codevoorbeelden en interpretatie
Om het concreet te maken, hier is een eenvoudig Python-voorbeeld met yfinance en statsmodels. Zorg dat je de libraries installeert: pip install yfinance statsmodels pandas numpy.
Je haalt de data voor SHEL en BP, berekent de log-prijzen, en voert de test uit. Interpreteer de output: een lage p-waarde (onder 0.05) duidt op co-integratie. De score geeft de sterkte van de relatie aan.
import yfinance as yf
import pandas as pd
import numpy as np
from statsmodels.tsa.stattools import coint
# Haal data op
data = yf.download(['SHEL.L', 'BP.L'], start='2019-01-01', end='2024-01-01')
prices = data['Close']
# Log-transform voor stabiliteit
log_prices = np.log(prices)
# Voer co-integratietest uit
score, pvalue, _ = coint(log_prices['SHEL.L'], log_prices['BP.L'])
print(f"Co-integratie score: {score}, p-waarde: {pvalue}")
if pvalue < 0.05:
print("Co-integratie aanwezig!")
else:
print("Geen sterke co-integratie.")
Als je een positieve score hebt, betekent dit dat de reeksen samen bewegen.
In dit voorbeeld met SHEL en BP, zie je vaak een p-waarde rond 0.02-0.04, wat suggereert dat ze co-integreren vanwege hun overlappende activiteiten in de energiesector. Gebruik deze test in je backtesting-omgeving: simuleer trades op basis van het prijsverschil, en meet de winstgevendheid en drawdown. Voor risicomanagement: als je een pairs trading-strategie bouwt, stel je een drempel in voor het prijsverschil.
Bijvoorbeeld: als het verschil meer dan 2% afwijkt van het gemiddelde, open je een positie. Sluit de positie als het verschil terugkeert naar het gemiddelde.
Test dit in een backtesting-tool zoals Backtrader of Zipline, en integreer het met een broker-API voor live trading.
Denk aan risico’s zoals transactiekosten (bijvoorbeeld €5 per trade bij Interactive Brokers) en spreads.
Verschillende modellen en prijsindicaties
Naast de Engle-Granger-test is er de Johansen-test, die geschikt is voor meer dan twee aandelen. Je kunt een portfolio van drie of vier aandelen testen op co-integratie, wat handig is voor complexere strategieën.
In Python gebruik je hiervoor statsmodels.tsa.vector_ar.vecm. Dit model berekent een co-integrerende relatie en geeft je een indicatie van de langetermijnprijs. Bijvoorbeeld: als de co-integratie-relatie een constante is van 1.2, betekent dat dat de prijs van aandeel A ongeveer 1.2 keer die van aandeel B moet zijn op de lange termijn.
Voor prijsindicaties: als je een co-integratie vindt, kun je een prijsmodel bouwen.
Gebruik een error-correction model (ECM): de korte-termijnbewegingen worden gecorrigeerd naar de langetermijnrelatie. In code: je past een OLS-regressie toe op het verschil, en voegt een correctieterm toe. Dit geeft je een signaal: als de prijs te ver afwijkt, is het tijd om te traden.
Voor SHEL en BP kun je een target-prijs berekenen: als SHEL €25 is en BP €10, en de co-integratie-factor is 2, dan is de verwachte prijs van SHEL €20 op lange termijn. Als het nu €25 is, short je SHEL en koopt BP.
Een andere variant is de threshold co-integratie, waarbij je een bandbreedte instelt voor het verschil.
Dit is handig voor risicomanagement: je stelt een stop-loss in bij een afwijking van 5%. In een backtesting-omgeving test je verschillende drempels: bijvoorbeeld 1%, 2%, of 3%, en kiest de beste op basis van de Sharpe-ratio. Gebruik hiervoor een tool als QuantConnect of een eigen Python-script met historische data van je broker.
Praktische tips voor jouw trading
Begin klein: test co-integratie op twee aandelen uit dezelfde sector, zoals energie of tech. Gebruik data van je broker, bijvoorbeeld via de API van Interactive Brokers, die gratis toegang biedt voor account-houders. Zorg dat je rekening houdt met costs: spreads kunnen je winst opeten, dus test met realistische tarieven.
Voor Python-backtesting, probeer libraries als Backtrader of PyAlgoTrade; deze zijn ideaal als je technische indicatoren in Python wilt berekenen.
Combineer co-integratie met andere technieken: gebruik het naast technische indicatoren zoals RSI of MACD voor extra bevestiging. Voor risicomanagement, stel een maximum drawdown in van bijvoorbeeld 10% op je portfolio.
Monitor je bot regelmatig: markten veranderen, dus her-test je co-integratie elke 3-6 maanden. Als je een algoritmische bot bouwt, zorg dan voor een goede error-handling via de API, zodat je niet vastloopt bij een data-fout. Tot slot: co-integratie is geen garantie voor winst.
Het is een hulpmiddel, geen magische formule. Test het uitgebreid in een veilige omgeving, zoals een paper trading-account, voordat je echt geld inzet.
Met Python heb je de flexibiliteit om aan te passen en te optimaliseren. Dus pak je laptop, haal wat data op, en begin met het implementeren van de Kelly Criterion formule. Je zult versteld staan hoeveel inzicht deze test je geeft over de markt.
