Sharpe Ratio berekenen met Python: Risico-rendement meten
Stel je voor: je hebt een gave Python-bot gebouwd die trades uitvoert via de API van Interactive Brokers of Bybit. Je backtest ziet er mooi uit, de equity curve stijgt.
Maar is het echt goed? Of neem je ongemerkt te veel risico voor dat rendement?
Hier komt de Sharpe Ratio om de hoek kijken. Het is je financiële kompas. Het zegt niet alleen hoeveel winst je maakt, maar vooral hoe soepel die winst tot stand komt. We gaan dit samen berekenen, zonder ingewikkelde theorie, maar meteen aan de slag in Python.
Wat is de Sharpe Ratio eigenlijk?
De Sharpe Ratio is een simpele formule die je rendement afzet tegen het risico.
Het antwoord is een getal. Hoe hoger, hoe beter. Een ratio van 1 is acceptabel, 2 is goed, en 3 of meer is vaak excellent.
Een negatieve Sharpe betekent dat je beter op de bank was blijven zitten. De kern is: (Gemiddeld rendement - Risicovrije rente) / Standaarddeviatie van het rendement.
Waarom boeit dit jou? Omdat een bot die 20% rendement maakt met pieken en dalen van 15% per maand, minder waardevol is dan een bot die 15% rendement maakt met een stabiele stijging.
Je wilt geen hobbelpaard, je wilt een lift omhoog. De Sharpe Ratio vertelt je of je strategie echt schaalbaar is. Het helpt je om appels met appels te vergelijken, of je nu handelt op Binance Futures of via de API van DEGIRO. Denk aan de risicovrije rente als je referentiepunt.
In 2024 ligt de rente op een staatsobligatie rond de 3-4%. Als je bot 8% rendement maakt, maar de standaarddeviatie is enorm, dan is je Sharpe laag.
Je neemt onnodig veel stress voor weinig extra's. Een bot met een Sharpe van 2.5 voelt als een oude vertrouwde auto: soepel, voorspelbaar en je komt veilig aan.
Waarom de Sharpe Ratio onmisbaar is voor algoritmische traders
Zonder Sharpe Ratio handel je op gevoel. En gevoel is vijand nummer één van algoritmische trading.
Je bot draait 24/7, maar jij slaapt. De ratio is je nachtwaker.
Hij waarschuwt je als de bot te agressief wordt. Bijvoorbeeld: een strategie die in een backtest 50% rendement haalt, maar met een drawdown van 40%, heeft een lage Sharpe. Dat betekent: risico is te hoog voor het rendement.
Broker- en API-keuzes spelen hier direct in. Als je via de API van Kraken of Bitvavo handelt, let dan op transactiekosten.
Een bot die vaak scalpt, kan een hoge Sharpe hebben in theorie, maar door hoge fees (€5-10 per trade) zakt de reële ratio in. Je moet de kosten meenemen in je Python-berekening. Gebruik historische data van je broker om fees te simuleren. Een voorbeeld uit de praktijk: je backtest een mean-reversion bot op EUR/USD via Interactive Brokers.
Je ziet 12% rendement op jaarbasis. Je berekent de Sharpe en krijgt 0.8. Dat is matig.
De standaarddeviatie is te hoog. Je besluit de stop-loss aan te passen van 20 pips naar 15 pips. De Sharpe stijgt naar 1.5. Simpel, maar effectief.
Dit is waarom je dit elke dag moet monitoren. De Sharpe Ratio helpt ook bij risicomanagement.
Je kunt meerdere bots vergelijken: bot A (Sharpe 2.1), bot B (Sharpe 1.2). Je kiest voor bot A, zelfs als bot B iets meer rendement heeft. Waarom? Omdat bot A stabiler is en dus beter schaalbaar.
Je kunt meer kapitaal inleggen zonder slapeloze nachten. Dat is de kracht van risico-rendement meten.
De kern: Sharpe Ratio berekenen in Python
Laten we aan de slag. We gebruiken Python met libraries als pandas en numpy. Je hebt historische prijsdata nodig, bijvoorbeeld via de API van je broker of een dienst als Yahoo Finance.
Stel: je hebt een CSV-bestand met dagelijkse returns van je trading bot.
Elke rij is een dag, de kolom is het rendement. We werken met een jaarlijkse risicovrije rente van 3%.
Eerst laden we de data en berekenen de gemiddelde return. In Python ziet dat er zo uit: importeer pandas, laad de CSV, en gebruik .mean() voor het gemiddelde. De risicovrije rente deel je door 252 (handelsdagen per jaar).
Dan trek je dat af van je gemiddelde rendement. Simpel: excess_return = avg_return - risk_free_rate.
Vervolgens de standaarddeviatie. In Python: std_dev = returns.std(). Dit is de volatiliteit van je bot. De Sharpe Ratio wordt dan: sharpe_ratio = excess_return / std_dev.
Als je dagelijkse returns hebt, vermenigvuldig je de ratio met sqrt(252) om een jaarlijkse schatting te krijgen. Dit voorkomt dat je denkt dat een dagelijkse Sharpe van 0.1 geweldig is.
Een concreet scriptje: import pandas as pd, import numpy as np. Data laden: df = pd.read_csv('bot_returns.csv').
Returns berekenen als kolom 'returns'. Gemiddelde: avg_return = df['returns'].mean(). Risicovrije rente: rf = 0.03 / 252.
Excess: excess = avg_return - rf. Standaarddeviatie: std = df['returns'].std(). Sharpe: sharpe = excess / std * np.sqrt(252). Print de uitkomst.
Als je Sharpe onder 1 ligt, wees alert. Test dit met een backtest van een bot op Binance Futures.
Stel je hebt 6 maanden data, met een gemiddelde daily return van 0.05% en een standaarddeviatie van 1%. De risicovrije rente is 0.012% per dag.
Excess = 0.05% - 0.012% = 0.038%. Sharpe = 0.038 / 1 * sqrt(252) ≈ 0.6. Niet super. Je ziet meteen dat de bot stabiel is, maar weinig extra's biedt boven de risicovrije rente.
Varianten en modellen: van basis naar geavanceerd
De klassieke Sharpe Ratio is een goed startpunt, maar niet perfect. Voor een diepere analyse is het slim om de Sortino Ratio vs Sharpe Ratio te vergelijken, aangezien de Sortino variant alleen neerwaartse risico's meeneemt.
Handig voor bots die veel winst maken maar af en toe een grote klap incasseren. In Python: bereken de standaarddeviatie alleen van negatieve returns. Dit geeft een realistischer beeld voor trendvolgende strategieën. Een andere aanpassing is de Annualized Sharpe, zoals hierboven.
Maar wat als je data niet normaal verdeeld is? Gebruik dan de Exponentially Weighted Moving Average (EWMA) voor de volatiliteit.
In Python via pandas ewm(). Dit geeft meer gewicht aan recente data, wat handig is voor live trading bots die snel veranderen.
Prijsindicaties voor tools: als je een professionele backtestomgeving wilt, kijk naar QuantConnect (vanaf €20 per maand voor basis). Voor Python-only: gratis libraries als backtrader of zipline. Geen dure software nodig; je laptop en een API-sleutel volstaan.
Test op een demo-account bij Interactive Brokers (kosteloos) om echte data te gebruiken zonder risico. Een geavanceerd model: de Conditional Sharpe Ratio, die rekening houdt met extreme gebeurtenissen (tail risk).
Gebruik historische simulatie of Monte Carlo in Python. Voor een bot die op opties handelt via Saxo Bank API, is dit cruciaal. Je simulatie toont aan dat een schijnbare Sharpe van 2.5 daalt naar 1.8 na meegenomen zwartepaardscenario's.
Experimenteer met verschillende tijdsframes. Een dagelijkse Sharpe van 1.5 kan wekelijks dalen naar 1.2 door weekend-gaps.
Pas je Python-script aan om meerdere horizonten te testen. Dit helpt bij het kiezen van de juiste broker en API voor je bot.
Praktische tips voor dagelijks gebruik
Begin klein: download 1 jaar aan data van je broker en bereken de Sharpe voor je huidige bot.
Gebruik een Jupyter Notebook voor snelle tests. Sla je resultaten op in een CSV, zodat je trends ziet.
Een Sharpe die daalt? Controleer op API-fouten of market regime changes. Combineer met andere metrics. Sharpe alleen is niet genoeg; kijk ook naar de Calmar Ratio voor een diepere drawdown analyse (bijvoorbeeld 10% voor een gezonde bot).
Gebruik Python libraries voor financiële analyse zoals pyfolio voor visualisaties: plot je equity curve en de Sharpe over tijd.
Dit maakt het concreet en leuk. Voorkom valkuilen: neem transactiekosten mee. Een bot met €1 per trade lijkt winstgevend, maar bij 100 trades per maand eet dat 1% van je rendement op.
Test op een live demo eerst. En onthoud: een hoge Sharpe betekent niet dat je bot onverslaanbaar is.
Markten veranderen, dus herbereken maandelijks. Als je net begint, probeer een eenvoudige Python-bot op een demo-account bij Bybit (gratis).
Bouw een moving-average crossover en bereken de Sharpe. Streef naar 1.5+ voor een stabiele start. Met tijd en tweaks wordt je bot een betrouwbare partner, niet een gokmachine.
