Waarom werkt mijn geoptimaliseerde strategie niet in de live markt?
Je hebt een strategie getest, uren achter je scherm gezeten, en de cijfers glanzen.
In de backtest met Python en je broker-API draait hij als een zonnetje. Je ziet winst, een mooie equity curve, en een scherpe Sharpe ratio. Maar zodra je live gaat, voelt het alsof je in een andere wereld stapt. De winst verdwijnt, de drawdown wordt groter, en je vertrouwen brokkelt af.
Waarom werkt je geoptimaliseerde strategie niet in de live markt? Het antwoord is minder mysterieus dan het lijkt, en met een paar slimme aanpassingen kun je het tij keren.
Overfitting: de schijnbare perfectie die je in de steek laat
Overfitting is de meest voorkomende valkuil bij het optimaliseren van een strategie. Je past je model te strak aan op historische data, waardoor het elke rimpel in het verleden perfect volgt.
In Python test je bijvoorbeeld met een GridSearchCV of een optimisatiebibliotheek als Optuna, en je vindt parameters die op de backtest perfect presteren.
Maar die perfectie is vaak toeval, geen structuur. Een voorbeeld: je test een mean-reversion strategie op EUR/USD met een lookback van 20 tot 60 periods en een threshold van 0,001 tot 0,005. Je vindt een combinatie die 12% rendement geeft met een drawdown van 4% op een jaar data.
Als je die parameters live test bij je broker zoals Interactive Brokers of LYNX, blijkt de drawdown plots 12% te zijn en het rendement 3%. De markt is niet hetzelfde als je testperiode.
Overfitting ontstaat doordat je te veel vrijheid geeft aan je model. Je test te veel combinaties, en de kans op toeval stijgt. Een praktische vuistregel: beperk het aantal variabelen. Test maximaal 5 tot 10 parametercombinaties op een realistische dataset, en gebruik een out-of-sample periode van minimaal 20% van je data. Zo voorkom je dat je een strategie bouwt die alleen op papier werkt.
Data en kosten: de verborgen frictie die je winst vreet
Backtests zijn schoon, live markten zijn ruw. In je Python-script gebruik je waarschijnlijk historische data van een broker of een dienst als Alpaca of degiro.
Maar live data bevat vertragingen, slippage en spreads die in een backtest vaak worden genegeerd.
Een strategie die in de backtest €1000 winst maakt, kan live maar €600 zijn omdat elke trade €0,50 tot €2,00 aan spread en commissie kost. Neem een concreet voorbeeld: je handelt 100 trades per dag op een aandeel van €50. In de backtest reken je met een spread van 0,01% en een commissie van €0,01 per aandeel.
Live betaal je bij een broker als DEGIRO €2,00 transactiekosten per trade en een spread van 0,05%. Op 100 trades kom je uit op €200 aan commissies en €250 aan spread, terwijl je backtest maar €50 aan kosten rekent.
Dat is een verschil van €400 per dag, of €8.000 per maand. Een andere valkuil is datakwaliteit. Gebruik tickdata voor snelle strategieën, niet alleen 1-minuut candles. Bij Python-bibliotheken als backtrader of zipline kun je slippage en commissies instellen.
Test met realistische waarden: een spread van 0,02% voor grote aandelen, 0,1% voor small-caps, en een commissie van €0,01 tot €0,02 per aandeel.
Zo bouw je een realistisch beeld van je live performance.
Marktcondities en regime-verandering: de markt is geen statisch plaatje
De markt verandert voortdurend. Een strategie die goed werkt in een stijgende markt, kan falen in een zijwaartse of dalende markt.
Je backtest kan een bullish periode hebben meegenomen, maar live kom je in een ander regime.
Bijvoorbeeld: een momentum-strategie op tech-aandelen presteerde in 2020 en 2021 fantastisch, maar in 2022, met renteverhogingen, liep de strategie vast. Een praktische aanpak is regime-detectie. Gebruik een eenvoudige indicator zoals de ADX (Average Directional Index) om te bepalen of de markt trending of zijwaarts is.
Schakel je strategie uit als de ADX onder 20 zit, en activeer hem weer boven 25. In Python kun je dit met een paar regels code implementeren.
Zo voorkom je dat je strategie trades plaatst in een markt die niet bij je model past. Denk ook aan externe factoren. Een aandelenstrategie kan beïnvloed worden door earnings releases, macro-cijfers of nieuws. Bij een broker als Interactive Brokers kun je via de API kalenderdata ophalen en je strategie pauzeren tijdens hoog-risico momenten.
Een eenvoudige filter: geen trades 30 minuten voor en na een Fed-persconferentie.
Dit verkleint de kans op onverwachte verliezen.
Risicomanagement: de rem die je winst beschermt
Een strategie optimaliseren zonder te overfitten is essentieel, want zonder risicomanagement is het als een raceauto zonder remmen. In de backtest zie je misschien een mooie equity curve, maar live kan één slechte trade je account slopen.
Een praktische regel: riskeer nooit meer dan 1% van je kapitaal per trade.
Bij een account van €10.000 betekent dit dat je verlieslimiet per trade €100 is. Gebruik een stop-loss en een take-profit op basis van de volatiliteit van het instrument. Bij een aandeel van €50 met een dagelijkse standaardafwijking van 2% (€1), zet je een stop-loss op 1,5% (€0,75) en een take-profit op 3% (€1,50).
In Python kun je dit berekenen met de ATR (Average True Range). Zo sluit je verliezen snel af en laat je winsten lopen. Position sizing is cruciaal. Gebruik de Kelly-criterium of een eenvoudige variant: deel je risicobudget door de stop-loss afstand, waarbij je objective functions zoals Sharpe en drawdown meeweegt in je model.
Bij een risico van 1% en een stop-loss van €0,75 op een aandeel van €50, koop je 133 aandelen (€100 / €0,75).
Zorg dat je totale exposure onder de 10% van je kapitaal blijft. Dit voorkomt dat één trade je account te zwaar raakt.
Praktische stappen om je strategie live te laten werken
Begin met een realistische backtest. Gebruik Python-bibliotheken als backtrader, vectorbt of zipline, en zet slippage, spreads en commissies aan.
Test op minimaal twee jaar data, en deel je data in een train- en testperiode. Gebruik een out-of-sample test van 20% tot 30% van je data. Als je strategie daar nog steeds positief is, is de kans groter dat hij live werkt.
Test live met een paper trading account. Bij brokers als Interactive Brokers, LYNX of DEGIRO kun je een demo-account openen.
Handel een week of twee met nepgeld en vergelijk de resultaten met je backtest. Als je live performance meer dan 20% afwijkt, zoek dan naar de oorzaak: kosten, slippage, of marktomstandigheden. Implementeer een risicomanagementsysteem.
Stel een dagelijkse drawdown-limiet in van 2% en een wekelijkse limiet van 5%. Als je die limiet raakt, stop dan met traden voor de dag of week.
Gebruik de API van je broker om automatisch posities te sluiten bij stop-losses.
Zo voorkom je emotionele beslissingen en blijf je discipline houden. Monitor en pas aan, maar niet te veel. Houd een logboek bij van elke trade: entry, exit, reden, en marktcondities. Analyseer wekelijks je resultaten en zoek naar patronen.
Pas je strategie alleen aan als er een structureel probleem is, niet om één verliesdag te compenseren. Door je strategie aan te passen aan een specifieke marktsituatie, zoals het verhogen van je stop-loss met 0,1%, kan een kleine aanpassing een groot verschil maken.
Denk aan de kosten van je infrastructuur. Een VPS van €10 tot €20 per maand zorgt voor stabiele verbindingen met je broker-API. Gebruik een betrouwbare datafeed, zoals die van je broker of een dienst als Polygon (vanaf €20 per maand).
Zorg dat je code robuust is: foutafhandeling, herstel na disconnecties, en logging. Een kleine investering in infrastructuur voorkomt grote verliezen.
Tot slot, wees geduldig. Een strategie die in de backtest 10% rendement geeft, kan live 5% tot 7% halen door frictie. Dat is normaal. Richt je op consistentie en risicobeheersing, niet op maximale winst.
Met een realistische aanpak, een goede broker-API, en strak risicomanagement kun je je geoptimaliseerde strategie live laten werken.
En als het dan nog niet loopt? Pas aan, test opnieuw, en blijf leren. De markt is een marathon, geen sprint.
