De gevaren van 'Curve Fitting' en hoe je het herkent
Je strategie ziet er op papier perfect uit. De backtest toont een gestage stijging van je vermogen, met weinig drawdowns. Je voelt je zelfverzekerd, zet echt geld in en... dan gebeurt het. De bot stort in elkaar. Wat is er misgegaan? Waarschijnlijk heb je te maken met curve fitting, oftewel: je hebt je strategie zo strak getuned op historische data dat ie in de toekomst faalt.Dit is de nachtmerrie van elke algoritmische trader. Je hebt uren gespendeerd in Python, je backtests draaien op je laptop en je hebt een broker API gekozen die perfect lijkt te passen.
Maar er is een fijngevoeligheid die je moet begrijpen. We gaan stap voor stap door het proces van het herkennen van deze valkuil.
Je hoeft geen wiskundig genie te zijn; het gaat om logisch nadenken en een beetje discipline. Pak je favoriete notitieblok en laten we beginnen.
Wat je nodig hebt voordat je start
Voordat we de diepte induiken, zorgen we dat je de juiste tools bij de hand hebt. Je hebt niet veel nodig, maar wat je hebt moet goed werken.
- Een Python omgeving: Gebruik Anaconda of een schone Python installatie (versie 3.8 of hoger). Zorg dat je Jupyter Notebook of VS Code geïnstalleerd hebt.
- Essentiële libraries: Installeer pandas, numpy, matplotlib en backtrader of vectorbt. Voor €0,- zijn deze open-source libraries krachtig genoeg voor dit werk.
- Historische data: Je hebt data nodig van een broker of een provider. Denk aan data van Interactive Brokers (via hun API) of een dienst als Alpaca (vaak gratis voor basisdata). Zorg dat je minimaal 5 tot 10 jaar aan dagelijkse data hebt.
- Een testomgeving: Gebruik een apart script voor je backtests. Zorg dat je rauwe data niet overschrijft; werk met kopieën.
We werken met Python, dus zorg dat je een omgeving hebt opgezet met de juiste libraries. Reken op ongeveer 30 minuten om je omgeving op te zetten als je dit nog niet hebt. Veelgemaakte fout hier? Te weinig data gebruiken. Test nooit alleen op een bull market (stijgende markt) van 2 jaar; dat is vragen om moeilijkheden.
Stap 1: De basisstrategie definiëren
Elke goede bot begint met een simpele logica. Laten we een voorbeeld nemen: een moving average crossover systeem.
Je koopt wanneer de korte Moving Average (MA) de lange MA kruist en verkoopt bij het tegenovergestelde. Simpel, maar een klassieke valkuil voor curve fitting. Zo pak je het aan in Python:
- Schrijf de basis logic: Gebruik pandas om je data in te laden. Bereken de 50-daagse en 200-daagse MA.
- Stel de parameters in: Begin met standaard waarden. Bijvoorbeeld: long_ma = 200, short_ma = 50.
- Backtest de basis: Draai de simulatie op je historische data. Kijk naar het totaalrendement en de drawdown. Dit duurt slechts seconden in Python.
Deze stap duurt ongeveer 1 uur. Je doel is nu niet winst maximaliseren, maar de logica valideren.
Veelgemaakte fout: te snel tevreden zijn met een hoge winst. Als je winst te hoog is (bijv. 50% per jaar op aandelen), is de kans op curve fitting groot.
Stap 2: Optimalisatie zonder te overdrijven
Hier begint het gevaar. Je wilt de beste parameters vinden, dus je begint met parameter optimization om je model te tunen.
Je past de MA lengtes aan: misschien 40 en 180? Of 60 en 250?
- Beperk je variabelen: Kies maximaal 2-3 parameters om te tunen. Voor een MA crossover, houd het bij de lengtes van de gemiddelden.
- Gebruik een grid search: Schrijf een Python script dat een reeks waarden test. Bijvoorbeeld: short_ma van 20 tot 100 (stap 10), long_ma van 150 tot 300 (stap 20). Gebruik libraries zoals itertools voor efficiëntie.
- Bewaar de resultaten: Sla niet alleen de winst op, maar ook de drawdown, de Sharpe ratio en het aantal trades. Gebruik een DataFrame in pandas om dit netjes bij te houden.
Dit is waar curve fitting om de hoek komt kijken. Je past je model te strak op de data. Om dit te voorkomen, volg je deze stappen:
Reken op 2-4 uur voor een volledige optimalisatie, afhankelijk van je rekenkracht. Een veelgemaakte fout is het tunen op de volledige dataset. Doe dit niet; je traint je bot op data die hij al "kent". Vraag je je af hoe vaak je je parameters opnieuw moet optimaliseren? Gebruik in plaats daarvan een trainingsset (bijv. 2010-2018) en een testset (2019-2024).
"Een strategie die perfect werkt op oude data, faalt vaak op nieuwe data. Het is als een sleutel die alleen maar op één deur past."
Stap 3: De testset en out-of-sample data
Om curve fitting te herkennen, moet je je strategie testen op data die hij nog nooit heeft gezien.
Dit heet out-of-sample testing. Zonder dit stap je in een valkuil die je portfolio vernietigt.
- Split je data: Deel je historische data in tweeën. Gebruik 70% voor training (optimalisatie) en 30% voor testen. Voor 10 jaar data is dat ongeveer 7 jaar trainen en 3 jaar testen.
- Draai de backtest op de testset: Gebruik de "beste" parameters uit je optimalisatie op de ongeziene data. Kijk of de winst vergelijkbaar is.
- Vergelijk prestaties: Als de winst op de testset meer dan 30% lager ligt dan op de trainingsset, heb je waarschijnlijk curve fitting.
Volg deze concrete stappen: Dit proces duurt ongeveer 1 uur, inclusief coderen. Tip: gebruik een broker API zoals die van Interactive Brokers voor real-time data, maar test altijd offline eerst. Veelgemaakte fout: de testset te klein maken. Zorg voor minimaal 200-300 trades in je testperiode voor statistische significantie.
Stap 4: Walk-Forward Analyse
Wil je nog zekerder zijn? Gebruik walk-forward analyse. Dit is een stap verder dan simpele splitsing.
Je verschuift je trainings- en testvenster steeds, net als in de echte wereld waar je steeds nieuwe data krijgt. Hoe je dit doet in Python:
- Definieer vensters: Kies een trainingsvenster van bijv. 3 jaar en een testvenster van 1 jaar.
- Loop door de tijd: Optimaliseer op jaar 1-3, test op jaar 4. Schuif op naar jaar 2-4, test op jaar 5, enzovoort.
- Meet consistentie: Bereken de gemiddelde winst en drawdown over alle stappen. Als de resultaten sterk variëren, is je strategie niet robuust.
Deze analyse duurt langer, ongeveer 3-6 uur, afhankelijk van je data. Gebruik libraries zoals backtrader voor geavanceerde voorbeelden. Veelgemaakte fout: te complexe vensters kiezen. Houd het simpel: 4-5 stappen volstaan voor de meeste bots.
Stap 5: Risicomanagement integreren
Curve fitting gaat niet alleen over winst; het raakt ook risicomanagement. Een bot die in de backtest weinig drawdown heeft, kan in de live markt door een API-fout of extreme volatiliteit instorten.
Voeg deze checks toe: Reken op een week voor volledige integratie. Veelgemaakte fout: risicomanagement overslaan omdat de backtest "perfect" lijkt. Doe dit nooit; de markt is onvoorspelbaar.
- Position sizing: Gebruik een vaste fractie van je kapitaal, bijv. 1-2% per trade. Test dit in je backtest met Python code voor Monte Carlo simulaties.
- Stop-loss levels: Implementeer harde stops. Test hoeveel winst je verliest als je stop vaak raakt, maar het voorkomt catastrofes.
- Live paper trading: Test je bot 1-2 maanden op een paper account via je broker (bijv. Interactive Brokers of eToro). Kijk of de live prestatie matcht met de backtest.
Verificatie-checklist
Voordat je live gaat, loop je deze checklist af. Beantwoord elk punt met ja of nee.
- Heb ik minimaal 5 jaar historische data gebruikt? (Ja/Nee)
- Zijn mijn parameters beperkt tot 2-3 variabelen? (Ja/Nee)
- Heb ik een out-of-sample test uitgevoerd met vergelijkbare resultaten? (Ja/Nee)
- Is de winst op de testset niet meer dan 30% lager dan op de trainingsset? (Ja/Nee)
- Heb ik walk-forward analyse gedaan en is de variatie in resultaten klein? (Ja/Nee)
- Is risicomanagement (position sizing, stops) geïntegreerd en getest? (Ja/Nee)
- Heb ik paper trading gedraaid voor minstens 1 maand? (Ja/Nee)
Als je meer dan één nee hebt, stop en verbeter je strategie. Als je alle ja's hebt, ben je klaar om je bot live te zetten. Onthoud: geen enkele strategie is perfect, maar met deze stappen minimaliseer je de gevaren van curve fitting. Leer hier hoe je een trading strategie optimaliseert zonder te overfitten. Blijf leren, blijf testen, en succes met je algoritmische trading!
