Hoeveel trades heb je minimaal nodig voor een statistisch significante backtest?
Je staat te popelen om je Python-trading bot live te zetten. Je hebt een strategie gebouwd, de backtest draait en de resultaten zien er mooi uit.
Maar dan die vraag: zijn deze cijfers echt, of gewoon geluk? Om dat te weten te komen, moet je weten hoeveel trades je minimaal nodig hebt voor een statistisch significante backtest. Zonder genoeg data is je bot een gokmachine met een mooi jasje. Stel je voor: je test een mean-reversion strategie op EUR/USD via de Interactive Brokers API.
Je ziet een winst van 5% in een week. Geweldig! Maar als je maar 10 trades hebt gedraaid, zegt dat nog niets.
Misschien had je net die ene goede dag te pakken. We gaan samen uitzoeken hoe je zekerheid krijgt, zonder ingewikkelde wiskunde die je hoofd op hol brengt.
Wat je nodig hebt voordat je begint
Voordat we tellen, moet je basis op orde zijn. Je hebt een functionerende trading bot nodig, gebouwd in Python.
Gebruik libraries zoals Backtrader of Zipline voor je backtesting engine. Zorg dat je historische data hebt van minimaal 2 à 3 jaar, bijvoorbeeld via de API van je broker (zoals Interactive Brokers of LMAX) of een dienst als Alpaca voor aandelen.
Je broker-account moet live data kunnen streamen, maar voor deze stap heb je alleen historische data nodig. Zorg dat je data schoon is: geen gaten in de candlesticks, correcte splitsingen en dividends. Gebruik een tool als Pandas om dit te controleren. Een snelle check: run een simpele script die de data inladen en laat je niet verrassen door missing values.
Verder heb je een risicomanagement-plan nodig. Weet wat je maximale drawdown is (bijvoorbeeld 10-20%) en je position sizing.
Geen zin om je hele account te verliezen tijdens het testen. Tot slot, een rustige mindset. Dit is geen sprint; het is een marathon van precisie.
Stap 1: Bepaal je doel en strategie-type
Elke strategie heeft een ander karakter. Een daghandel-bot op crypto (bijvoorbeeld BTC/USD op Binance) doet veel trades per dag, terwijl een swing-trading bot op aandelen maar een paar trades per week maakt. Je eerste stap is helder krijgen wat je zoekt: een hoog aantal trades voor snelle statistiek of kwaliteit over kwantiteit?
- Schrijf je strategie-regels op: Exacte entry- en exit-criteria. Bijvoorbeeld: "Koop als RSI onder 30 komt op de 1-uur grafiek, verkoop bij RSI boven 70."
- Kies je tijdsframe: 1-minuut voor scalping, 1-uur voor daghandel, 1-dag voor swing. Dit bepaalt je trade-frequentie.
- Stel je backtest-periode vast: Minimaal 1 jaar historische data, liever 3-5 jaar voor robuustheid.
- Definieer succes: Is het winstpercentage, Sharpe-ratio, of max drawdown? Wees specifiek, bijvoorbeeld "Sharpe > 1.5 en drawdown < 15%."
Tijdsindicatie: 1-2 uur om dit op te schrijven en je code aan te passen. Veelgemaakte fout: Te vaag blijven.
"Ik wil winst maken" is geen doel. Wees concreet, anders meet je niets.
Stap 2: Bereken het minimale aantal trades
Hier komt de kern: hoeveel trades heb je nodig? Er is geen magisch getal, maar er zijn vuistregels.
Voor statistische significantie kijk je naar de betrouwbaarheid van je gemiddelde winst per trade en de standaardafwijking. Een simpele benadering is de 't-test' op je trade-reeks, maar we houden het praktisch. Gebruik de formule voor het benodigde sample size: n = (Z-score * standaardafwijking / marge van fout)^2.
- Verzamel je trade-data: Run je backtest en exporteer elke trade naar een CSV: entry, exit, winst/verlies, datum.
- Bereken gemiddelde en standaardafwijking: Gebruik Python met Pandas:
mean_winst = df['winst'].mean()enstd_dev = df['winst'].std(). - Pas de formule toe: Voor een marge van 1% en std dev 1.5%, minimaal 86 trades (round up naar 100 voor veiligheid).
- Check frequentie: Als je bot maar 1 trade per week doet, heb je minimaal 2 jaar data nodig voor 100 trades.
Voor een 95% betrouwbaarheid (Z-score 1.96), met een marge van fout van 1% op je gemiddelde winst, en een typische standaardafwijking van 2% (bijvoorbeeld bij een volatiele crypto-strategie), kom je uit op ongeveer 150-200 trades.
Voor minder volatiele aandelen (std dev 1%) zijn 50-100 trades vaak genoeg. Tijdsindicatie: 30-60 minuten om te rekenen met Python. Veelgemaakte fout: Niet kijken naar de verdeling van je trades. Een paar enorme winsten kunnen je gemiddelde vertekenen; gebruik de mediane winst voor een beter beeld.
Statistiek is als een veiligheidsriem: je wilt hem niet gebruiken, maar zonder crash je hard.
Stap 3: Voer de backtest uit en analyseer de resultaten
Nu draaien maar! Leer hoe je een event-driven backtester bouwt in Python om je strategie op de gekozen periode te runnen.
Bijvoorbeeld: een momentum-strategie op S&P 500 aandelen via de IBKR API, met 100 trades over 3 jaar. Check of je resultaten consistent zijn over subperiodes (bijvoorbeeld jaar 1 vs. jaar 2). Tijdsindicatie: 1-2 uur per run, afhankelijk van je data-grootte. Veelgemaakte fout: Alleen kijken naar totale winst.
- Run de backtest: Gebruik Backtrader of je eigen script. Log elke trade in een DataFrame voor analyse.
- Verdeel je data: Splits in train- en test-set (bijv. 70% voor optimalisatie, 30% voor validatie). Dit voorkomt overfitting.
- Bereken statistieken: Win/loss ratio, gemiddelde winst, Sharpe-ratio, max drawdown. Voor significantie: voer een t-test uit op je winst-reeks (gebruik scipy.stats.ttest_1samp).
- Check voor bias: Is je backtest beïnvloed door survivorship bias (alleen succesvolle aandelen)? Gebruik een universe van alle aandelen van een index.
Een strategie met 100 trades en 10% winst kan riskanter zijn dan een met 50 trades en 8% winst door hogere drawdown.
Focus op risico-adjusted returns.
Stap 4: Valideer met out-of-sample data en Monte Carlo
Backtests liegen niet, maar pas op voor overfitting in je trading strategie. Valideer je resultaten om zeker te zijn dat je minimaal aantal trades voldoet.
- Run out-of-sample test: Neem de laatste 6-12 maanden data die je nog niet hebt gezien. Draai je bot erop en tel de trades. Minimaal 20-30 trades voor een snelle check.
- Monte Carlo-simulatie: Herschik je trade-winsten 1000 keer willekeurig (gebruik Python numpy). Bekijk de verdeling van je gemiddelde winst. Als 95% van de simulaties positief is, is je strategie robuust.
- Check trade-frequentie: Als je minder trades hebt dan je minimum (bijv. 50), overweeg dan een kleiner tijdsframe of meer markten (bijv. meerdere crypto-paren).
- Test op verschillende markten: Draai je bot op EUR/USD en GBP/USD. Zijn de resultaten vergelijkbaar? Zo niet, pas je risicomanagement aan.
Gebruik out-of-sample data (data die je niet hebt gebruikt voor optimalisatie) en een Monte Carlo-simulatie voor extra zekerheid.
Tijdsindicatie: 2-3 uur voor simulaties. Veelgemaakte fout: Te snel tevreden zijn met out-of-sample resultaten op een kleine set. Minimaal 50 trades nodig voor betrouwbaarheid, anders herbegin je stap 2.
Verificatie-checklist
Voordat je live gaat, loop deze lijst na. Elk item moet 'ja' zijn voor een statistisch significante backtest.
- Minimaal aantal trades: 100+ voor volatiele markten (crypto), 50+ voor stabiele (aandelen/forex). Is dit behaald?
- Historische data: 3+ jaar zonder gaten? Check je CSV's op missing values.
- Statistische test: T-test p-waarde < 0.05? Je gemiddelde winst is significant verschillend van nul.
- Risicomanagement: Max drawdown < 20% en position sizing vastgelegd? Gebruik een stop-loss van 1-2% per trade.
- Out-of-sample validatie: 20+ trades op ongeziene data met vergelijkbare resultaten?
- Geen overfitting: Parameters beperkt (bijv. max 5 variabelen) en getest op meerdere markten?
- Broker-compatibiliteit: Je API (bijv. IBKR of Binance) ondersteunt de benodigde data en order types? Test een paper-trading account eerst.
Als je alle checkmarks hebt, is je bot klaar voor de volgende stap: live trading met kleine bedragen (bijv. €100-500).
Onthoud: geen enkele backtest is perfect, maar door deze gids voor backtesting te volgen, minimaliseer je het risico op een onaangename verrassing. Succes!
