Wat is de Kelly Criterion en hoe bereken je de optimale positiegrootte?
Stel je voor: je hebt een Python trading bot die op basis van een backtest met een API van Interactive Brokers of Alpaca een gemiddelde winst van 2% per trade laat zien.
Je bent enthousiast, je zet hem live, en na drie dagen sta je met 40% drawdown aan de kant. Wat ging er mis? Positiegrootte. De Kelly Criterion is een simpele formule die je vertelt hoeveel risico je precies per trade mag nemen, zonder dat je account implodeert. In dit artikel leer je die stap voor stap berekenen voor je algoritmische setup.
Wat je nodig hebt voordat je begint
Je hebt geen rocket science nodig, maar wel een paar dingen op een rij. Een broker met een API (denk Interactive Brokers, Alpaca of Bybit voor crypto) en een Python-omgeving met packages als numpy, pandas en eventueel backtrader of zipline.
Een historische dataset van je strategie, bijvoorbeeld 500 tot 1000 trades uit je backtest.
- Python 3.9+ met numpy en pandas geïnstalleerd
- CSV met trade-level data: entry, exit, winst/verlies in euro’s
- Broker-fee overzicht (bijv. €0,01 per aandeel of €2 per trade bij IBKR)
- Risicobudget: bedrag dat je per trade maximaal mag verliezen (bijv. 1% van je totaal)
Een spreadsheet of Jupyter notebook om te rekenen. Reken op 30–60 minuten voor je eerste berekening. Checklist materiaal:
Veelgemaakte fout: je start zonder schone data. Als je trades met partial fills of slippage niet meeneemt, klopt je Kelly-waarde niet. Zorg dat je CSV ook de werkelijke orderkosten bevat.
Stap 1: verzamel en schoon je trade-data
Open je backtestresultaten en exporteer elke trade als één regel. Zorg dat je entry, exit, positiegrootte (aantal aandelen of contracten), en netto-winst in euro’s hebt.
Als je met leverage werkt (bijv. futures op CME), reken dan met de werkelijke margin en niet alleen met de notionele grootte.
Voeg een kolom ‘winst_na_kosten’ toe. Trek transactiekosten en slippage af. Voor een aandelentraadje bij IBKR: reken €0,01 per aandeel en minimaal €2 per order.
- Je vergeet slippage, vooral bij small-caps of illiquide crypto-paren.
- Je neemt alleen de winnende trades mee, waardoor je kansen overschat.
Voor een crypto-perpetual op Binance: reken 0,04% maker/taker en funding kosten apart. Typische fouten: Tijdsindicatie: 10–20 minuten. Controle: je dataset heeft minimaal 200 trades, met zowel winst als verlies.
Stap 2: bereken de verhouding gemiddelde winst versus gemiddeld verlies
De Kelly formule heeft drie getallen: de kans op winst (p), de gemiddelde winst (W) en het gemiddelde verlies (L).
import numpy as np
winst = df['winst_na_kosten']
p = np.mean(winst > 0) # winstkans
W = np.mean(winst[winst > 0]) # gemiddelde winst
L = np.abs(np.mean(winst[winst < 0])) # gemiddeld verlies
In Python doe je dit met numpy. Voorbeeldcode: Stel je hebt 600 trades: 360 winnaars, 240 verliezen. Gemiddelde winst €120, gemiddeld verlies €80. Dan is p = 0,6, W = 120, L = 80.
De W/L-ratio is 120 / 80 = 1,5. Dat is een gezonde verhouding voor momentum-strategieën.
Veelgemaakte fout: W en L berekenen op basis van ruwe bedragen zonder kosten.
Doe dit altijd na kosten. Tijdsindicatie: 5–10 minuten.
Stap 3: pas de Kelly Criterion formule toe
De klassieke Kelly-formule is: f* = p − (1 − p) / (W / L). In Python: Voorbeeld: p = 0,6, W/L = 1,5.
f_star = p - (1 - p) / (W / L)
Dan is f_star = 0,6 − 0,4 / 1,5 = 0,6 − 0,267 = 0,333.
Dat betekent 33,3% van je account riskeren per trade. Dat is te agressief voor de meeste algoritmische systemen. Gebruik daarom half-Kelly (f_star / 2) of pas de 1% regel voor risicomanagement toe als vaste cap per trade.
Wat betekent dit in de praktijk? Als je account €10.000 is en je kiest voor half-Kelly van 16,7%, riskeer je per trade maximaal €1.670.
Bij een gemiddeld verlies van €80 per trade kun je ongeveer 20 posities aan voordat je op nul staat, mits je risico per trade gelijk blijft. Veelgemaakte fout: je past Kelly toe op een te kleine steekproef (minder dan 200 trades). Dan is de schatting onstabiel. Tijdsindicatie: 5 minuten.
Stap 4: vertaal f* naar een concrete positiegrootte
Zet het risicopercentage om in een aantal aandelen, contracten of crypto-eenheden. Formule: positiegrootte = (account × risicopercentage) / (entry − stoploss). Wil je je risico kwantificeren met de Value at Risk? In code:
account = 10000
risk_pct = f_star / 2 # half-Kelly
stoploss = 2.0 # €2 onder entry
positie = (account * risk_pct) / stoploss
Voorbeeld: account €10.000, risk_pct = 0,167, stoploss €2. Positie = 1670 / 2 = 835 aandelen. Bij een aandeel van €50 is dat een notionele grootte van €41.750. Check je broker-marge: bij IBKR is de margin voor aandelen vaak 25–50%, dus je hebt minimaal €10.000–€20.000 nodig.
Voor futures reken je met de initiele margin (bijv. €4.000 per E-mini contract). Specifieke voorbeelden:
- Alpaca aandelen: €0,01 per aandeel fee, stoploss €1,50 → positie = 1670 / 1,5 ≈ 1113 aandelen.
- Bybit BTC perpetual: stoploss 0,5% van de positie, account €5.000, risk_pct 0,1 → positie = 500 / 0,005 = €100.000 notioneel, leverage 20x → margin €5.000.
Veelgemaakte fout: je neemt geen slippage mee in de stoploss. Bij small-caps of crypto kan slippage 0,1–0,5% zijn.
Reken altijd met een conservatieve stop. Tijdsindicatie: 10–15 minuten.
Stap 5: veranker je risicobudget en caps
Kelly geeft een theoretisch optimum, maar de markt is geen lab. Zet harde limieten: max 2–5% risico per trade, max 10–15% exposure per sector of crypto-paar, en een dagelijkse drawdown-cap van 3–5%.
Als je bot live gaat, start met 25–50% van de Kelly-waarde. Integreer dit in je Python-bot: Veelgemaakte fout: je past Kelly toe op elke trade zonder rekening te houden met correlatie.
- Check voor elke order: (account × risk_pct) / stoploss ≥ minimale positie (bijv. 1 aandeel of 0,001 BTC).
- Log de berekende positie en de daadwerkelijke fill. Schrijf weg naar een CSV voor controle.
- Herbereken f_star wekelijks met nieuwe trade-data.
Als je 5 posities tegelijk opent in dezelfde sector, verhoog je het systeemrisico.
Spreid of verlaag het risico per trade en vergeet niet om maximum drawdown limieten in je trading code in te stellen.
Stap 6: verifieer en test je setup
Voer een snelle sanity-check uit: Verificatie-checklist:
- Dataset: minimaal 200 trades, W en L na kosten.
- Formule: f_star berekend, half-Kelly toegepast.
- Positie: stoploss realistisch, rekening gehouden met fees en slippage.
- Risicobudget: per-trade limiet ingesteld (bijv. max €200 risico op €10.000).
- Live test: start met 25–50% van de Kelly-waarde, monitor 20–50 trades.
Als je deze stappen volgt, heb je een robuuste Kelly-positiegrootte voor je algoritmische trading bot. Je bent niet meer aan het gokken, je stuurt op kansen en risico. En dat voelt een stuk beter als je Python-bot om 17:00 uur zijn trades draait en jij rustig kunt ademen.
- CSV bevat entry, exit, positiegrootte, winst_na_kosten
- f_star en half-Kelly zijn berekend en gelogd
- Stoploss en take-profit zijn ingesteld in de broker-API
- Dagelijkse drawdown-cap is geactiveerd (bijv. 3%)
- Logbestanden worden elke trade geschreven en wekelijks geanalyseerd
