Wat is de Scipy library voor statistische arbitrage?
Stel je voor: je zit achter je scherm, de markten bewegen razendsnel en jij wilt weten of die spread tussen twee aandelen echt een kans is.
Scipy is dan je stille kracht achter de schermen. Het is de bibliotheek die al die statistische rekenwerk voor je doet, zonder dat je er ingewikkelde wiskunde voor hoeft te typen.
Je gebruikt het om correlaties te meten, spreads te berekenen en risico’s in te schatten, allemaal binnen je Python-omgeving voor algoritmische trading. Scipy zit vol met functies die speciaal zijn gemaakt voor statistiek, optimalisatie en wiskundige berekeningen. Je kunt er eenvoudig een hypothese toetsen, een verdeling fittingen of een spread berekenen tussen twee assets. Je hoeft niet vanaf nul te programmeren; je importeert gewoon de juiste submodule en je bent klaar om te rekenen. Dit bespaart je tijd en voorkomt fouten in je trading bot.
Waarom Scipy onmisbaar is voor statistische arbitrage
Statistische arbitrage draait om het vinden van tijdelijke onevenwichten tussen gerelateerde assets. Je wilt weten of een spread significant genoeg is om te verhandelen en hoe groot het risico is.
Scipy geeft je de tools om die vragen snel en betrouwbaar te beantwoorden. Zonder een goede statistische basis loop je het risico op false signals. Je bot gaat trades plaatsen op ruis in plaats van echte kansen.
Scipy helpt je om signaal van ruis te scheiden, zodat je strategie robuust blijft.
Je kunt je backtests vertrouwen en je live trading met meer zekerheid uitvoeren. Denk aan je broker API en je risicomanagement. Je wilt geen onnodige exposure nemen op basis van een simpele spread. Scipy stelt je in staat om betrouwbaarheidsintervallen te berekenen en stop-loss niveaus te bepalen. Zo blijft je bot binnen je risicobudget en voorkom je onverwachte verliezen.
De kern van Scipy voor statistische arbitrage
Scipy is opgebouwd uit submodule’s, en voor statistische arbitrage zijn er een paar die je constant gebruikt.
De submodule scipy.stats biedt distributies, toetsen en beschrijvende statistieken. Met scipy.optimize kun je parameters fitten, zoals de halfwaardetijd van een mean-reversion spread. En scipy.signal helpt bij het ontwerpen van filters voor je spread signalen. Een typische workflow start met het ophalen van prijsdata via je broker API, bijvoorbeeld van Interactive Brokers of een crypto exchange.
Je pakt twee gerelateerde aandelen, zoals ING en ABN AMRO, of een ETF en zijn onderliggende index. Je berekent de spread, bijvoorbeeld als een prijsverschil of een ratio.
Vervolgens test je met Scipy of de spread afwijkt van zijn historisch gemiddelde.
Je kunt een z-score berekenen: (spread - gemiddelde) / standaarddeviatie. Als de z-score verder dan 2 of 3 afwijkt, is de spread significant genoeg om te traden. Scipy’s norm distributie geeft je direct de p-waarde, zodat je weet hoe waarschijnlijk deze afwijking is.
Praktische voorbeeldcode: spread z-score
import numpy as np
from scipy.stats import norm
# Prijzen van twee aandelen, bijvoorbeeld ING en ABN AMRO
prices_ing = np.array([...]) # je eigen data
prices_abn = np.array([...])
spread = prices_ing - prices_abn
z_score = (spread - np.mean(spread)) / np.std(spread)
# p-waarde voor een z-score van 2.5
p_value = 2 * (1 - norm.cdf(2.5))
print(f"p-waarde: {p_value:.4f}") # bijv. 0.0124
Je kunt ook een ADF-test (augmented Dickey-Fuller) uitvoeren via scipy.stats om te checken of de mean-reversion sterker is dan een random walk. Deze code laat zien hoe je snel een z-score en p-waarde berekent.
Je kunt deze output gebruiken om een entry- en exit-signaal te generen. Je bot kan dan automatisch een long op de underpriced asset en een short op de overpriced asset plaatsen. Zorg dat je spread stabiel is en dat je transactiekosten meeneemt in je backtest.
Modellen en varianten met prijsindicaties
Je kunt verschillende modellen gebruiken voor statistische arbitrage, afhankelijk van je assets en timeframe. Een eenvoudige spread met z-score is geschikt voor aandelenparen met een hoge correlatie.
Voor crypto kun je een ratio-spread gebruiken, zoals BTC/ETH, omdat prijzen in dezelfde valuta lopen en de verhouding vaak mean-revert.
Prijsindicaties voor spreads kun je afleiden uit historische volatiliteit en transactiekosten. Stel, je ziet een spread van €1,50 tussen ING en ABN AMRO op een moment dat de gemiddelde spread €0,30 is met een standaarddeviatie van €0,50. Dan is de z-score 2,4 en is de spread significant.
Je kunt een target van €0,40 aanhouden voor winstneming, met een stop bij €2,00 om risico’s te beperken. Je kunt ook een cointegratiemodel toepassen via Scipy’s optimalisatiefuncties.
Je past een lineair model toe op de prijzen van twee assets en test of de residuen stationary zijn. Als de residuen stationary zijn, is de spread betrouwbaar voor mean-reversion trading. Dit is vooral handig voor ETF’s en indices, waarbij de onderliggende samenhang sterker is. Voor risicomanagement voeg je een volatility filter toe.
Je berekent de standaarddeviatie over de laatste 20 dagen en alleen trades met een z-score boven 2,5 worden geplaatst.
Je kunt ook een Kelly-criterium toepassen via Scipy’s optimalisatie voor trading om je positie te bepalen. Zo blijft je risico per trade binnen je vooraf bepaalde limiet, bijvoorbeeld 1% van je kapitaal.
Praktische tips voor je trading bot en backtesting
Gebruik Scipy altijd samen met een goede data pipeline. Haal je prijzen op via een broker API zoals Interactive Brokers of een crypto exchange en sla ze op in een gestructureerd formaat.
Je kunt Pandas gebruiken voor dataframes, maar voor het berekenen van technische indicatoren doet Scipy het zware rekenwerk voor je statistiek.
Zorg dat je data schoon is en geen gaps bevat, vooral voor aandelen op beursdagen. Bouw je backtest met Scipy’s statistiek om de betrouwbaarheid van je signalen te meten. Bereken de winstverdeling, de drawdown en de Sharpe-ratio.
Gebruik Scipy’s describe functie om snel inzicht te krijgen in je resultaten. Je kunt ook een Monte Carlo-simulatie uitvoeren of machine learning in trading inzetten om je strategie te testen onder verschillende marktcondities. Integreer je risicomanagement direct in je bot. Gebruik Scipy om betrouwbaarheidsintervallen te berekenen voor je spread en pas je positie grootte aan op basis van de volatiliteit.
Je kunt een eenvoudige stop-loss instellen op 2x de standaarddeviatie van de spread.
Zo voorkom je dat een enkele trade je hele bot onderuit haalt. Kies de juiste broker en API voor je setup.
Voor aandelen kun je Interactive Brokers gebruiken, voor crypto Binance of Kraken. Zorg dat je API-toegang stabiel is en dat je rate-limits respecteert. Test je bot eerst met een demo-account en kleine bedragen, bijvoorbeeld €100 tot €500, voordat je grotere posities inzet.
Onthoud dat Scipy een hulpmiddel is, geen magische formule. Je moet zelf de juiste parameters kiezen en je strategie blijven monitoren.
Pas je z-score drempels aan op basis van je backtest en de huidige marktomstandigheden. Blijf leren, experimenteer met nieuwe modellen en houd je risico’s altijd in de gaten.
