Hoe optimaliseer je voor de 'Sortino Ratio' in plaats van pure winst?

Portret van Alex de Vries, Quantitatief Analist & Algo-Trading Expert
Alex de Vries
Quantitatief Analist & Algo-Trading Expert
Strategie Optimalisatie & Tuning · 2026-02-15 · 6 min leestijd

Je kent het wel: je bot draait als een zonnetje, de winst lijkt enorm, maar één rare dag en je bent je winst van drie maanden kwijt. Pure winst zegt niet alles.

Het gaat erom hoe die winst tot stand komt. Daarom is de Sortino Ratio je nieuwe beste vriend. Hij kijkt naar je winst, maar straft je niet voor de dagen dat de markt rustig omhoog ging.

Hij straft alleen voor de pijnlijke dalen. In deze handleiding leer je hoe je je Python-bot optimaliseert voor stabiele groei, niet voor gokkersgeluk.

Wat je nodig hebt voordat je begint

Je hoeft geen rocket scientist te zijn, maar een paar dingen moeten op orde zijn. Zonder data en een werkende bot is dit een theoretisch praatje. Reken op ongeveer 2 tot 3 uur voorbereiding: data downloaden, environment checken, en je bestaande script testen.

  • Een Python-omgeving (Python 3.9 of nieuwer) met libraries: pandas, numpy, matplotlib, en scipy.
  • Een broker-API met historische data. Denk aan Interactive Brokers (IBKR), Degiro API, of Binance API voor crypto. Zorg dat je toegang hebt tot minimaal 2 jaar dagelijkse data.
  • Een backtesting-framework. VectorBT of Backtrader werken perfect. Ik ga uit van vectorBT, want dat is snel en flexibel.
  • Een werkende trading bot-strategie. Dit is geen handleiding om een bot te schrijven, maar om een bestaande bot te tunen. Zorg dat je entry/exit-logica al in code staat.
  • Een broker die API-trading ondersteunt. Let op transactiekosten. Een voorbeeld: IBKR rekent circa €0,005 per aandeel, met een minimum van €1 per order. Voor een bot met 100 trades per maand tel je dat mee.

Stap 1: Verzamel en prepareer je data zoals een professional

De kwaliteit van je data bepaalt de kwaliteit van je optimalisatie. Vuile data levert vals optimisme op.

  1. Download OHLCV-data: Haal Open, High, Low, Close en Volume op voor je assets. Gebruik een API zoals IBKR of Binance. Sla op in een CSV of direct in een pandas DataFrame.
  2. Check voor splitsingen en dividends: Bij aandelen (via IBKR) zorg je dat je 'adjusted close' gebruikt. Anders lijk je winst te maken door een stock split die nooit plaatsvond.
  3. Verwijder NaN-waardes: Vul forward of drop missing data. vectorBT heeft hier handige methoden voor.
  4. Voeg transactiekosten toe: Dit is essentiel voor realisme. Voorbeeld: 0,1% per trade (voor crypto) of €1 vast per trade (voor aandelen via Degiro).

Tijdsindicatie: 30-45 minuten. Veelgemaakte fout: Vergeten om costs toe te voegen. Dit vernietigt je Sortino Ratio direct.

Stap 2: Bereken de Sortino Ratio handmatig in Python

De Sortino Ratio is (Gemiddelde Return - Risicovrije Rent) / Downside Deviation. De 'risicovrije rent' is vaak de rente op een staatsobligatie, bijvoorbeeld 2% per jaar.

import numpy as np
import pandas as pd

def sortino_ratio(returns, risk_free=0.02/252):  # 2% jaarlijks, gedeeld door 252 handelsdagen
    mean_return = returns.mean()
    downside_returns = returns[returns < 0]
    downside_std = np.std(downside_returns)
    
    if downside_std == 0:
        return 0  # Geen risico? Dan oneindig, maar we returnen 0 voor veiligheid
    
    sortino = (mean_return - risk_free) / downside_std
    return sortino * np.sqrt(252)  # Annualiseren

De 'Downside Deviation' telt alleen de dagen dat je verlies maakte. Deze functie stop je in je backtesting-script.

Je voert een lijst van dagelijkse returns in en krijgt één getal. Hoger is beter. Een waarde boven de 2 is goed, boven de 4 is excellent. Tijdsindicatie: 15 minuten. Veelgemaakte fout: Vergeten te annualiseren, waardoor je getallen niet vergeleken kunt met andere strategieën.

Stap 3: Je hyperparameters tunen voor maximale stabiliteit

Nu het echte werk. We gaan niet zoeken naar de hoogste piek, maar naar de breedste en stabielste berg.

  1. Kies je parameters: Denk aan RSI-periode (14), Stop-loss (2%), Take-profit (5%), of MACD-fast/slow (12/26).
  2. Defineer een range: Test RSI van 10 tot 30. Stop-loss van 1% tot 5%.
  3. Loop en meet: Gebruik een simpele for-loop of vectorBT's parameter sweep. Voor elke combinatie draai je de backtest en bereken je de Sortino Ratio.
  4. Sla resultaten op in een DataFrame: Kolommen: RSI, StopLoss, Sortino, Sharpe, Max Drawdown.
results = []
for rsi in range(10, 31, 2):
    for sl in np.arange(0.01, 0.06, 0.01):
        # Run backtest met deze settings
        returns = run_backtest(rsi=rsi, stop_loss=sl)
        sortino = sortino_ratio(returns)
        results.append({'rsi': rsi, 'stop_loss': sl, 'sortino': sortino})

df = pd.DataFrame(results)
best = df.loc[df['sortino'].idxmax()]
print(best)

Tijdsindicatie: 1 tot 2 uur, afhankelijk van je rekenkracht. Veelgemaakte fout: Overfitting. Je vindt een perfecte setting voor de afgelopen 2 jaar, maar die werkt volgend jaar niet. Leer daarom hoe je de Sharpe Ratio als fitness-functie in je algoritme gebruikt en test altijd op een aparte 'out-of-sample' dataset.

Stap 4: Backtesten met realistische condities

Een hoge Sortino Ratio in een ideale wereld is waardeloos. Je bot moet overleven in het wild.

  • Slippage toevoegen: De prijs die je ziet is niet de prijs die je krijgt. Voeg 0,05% tot 0,1% slippage toe per trade.
  • Sluitingsuren: Handel niet rondom market open/close. De spread is dan groter. Scherp je strategie aan om de eerste 30 minuten te vermijden.
  • Margin call simulatie: Zorg dat je bot niet all-in gaat. Houd max 20% van je kapitaal in één positie. Dit voorkomt geforceerde sluitingen.

Run je optimalisatie opnieuw met deze condities. Je zult zien dat de top 10 van beste parameters flink verandert. Dat is goed, want simplicity is key bij het beperken van parameters.

Dat is realiteit die zijn werk doet. Tijdsindicatie: 45 minuten. Veelgemaakte fout: Te weinig capital simuleren. Een bot die €10.000 test en €100.000 gaat inzetten, loopt tegen andere problemen aan (liquiditeit).

Stap 5: Kies de beste parameter combinatie

Nu je een lijst hebt met parameters en hun Sortino Ratio's, maak je een keuze. Pak niet zomaar de hoogste. Je bent nu klaar om deze settings te gebruiken in je live bot, op een demo account.

  1. Sorteer op Sortino: Pak de top 5.
  2. Check Max Drawdown: Van die top 5, welke heeft de laagste drawdown? Een Sortino van 4.0 met een drawdown van 40% is riskant. Een Sortino van 3.5 met een drawdown van 15% is goud waard.
  3. Check Winrate en Average Win/Loss: Je wilt geen strategie die 90% wint met €1 en 10% verliest met €20.
  4. Kies de meest stabiele: Kies de parameter-set die in meerdere marktomstandigheden (bull/bear) redelijk presteert.

Tijdsindicatie: 30 minuten. Veelgemaakte fout: De 'gouden standaard' vergeten. Als je huidige bot een Sortino van 1.5 heeft en je nieuwe setup 1.6 is, is de winst minimaal.

Je wilt minimaal 20-30% verbetering zien om het risico van wisselen waard te maken.

Verificatie-checklist

Voordat je op 'live' drukt, loop je deze lijst af. Eén 'nee' is een reden om terug te gaan.

  • Heb je minimaal 2 jaar historische data gebruikt? Ja/Nee
  • Zijn transactiekosten en slippage verwerkt? Ja/Nee
  • Is de Sortino Ratio geannualiseerd? Ja/Nee
  • Heb je getest op out-of-sample data (laatste 6 maanden niet meegenomen in optimalisatie)? Ja/Nee
  • Is de Max Drawdown lager dan 20%? Ja/Nee
  • Heb je de bot minimaal 1 week op een demo-account gedraaid met live data? Ja/Nee

Als je alle vinkjes hebt, ben je klaar. Door middel van strategie optimalisatie zorg je voor stabiele winst, niet voor gokkersroem. Dat is hoe professionals hun bot runnen.

Portret van Alex de Vries, Quantitatief Analist & Algo-Trading Expert
Over Alex de Vries

Alex is een ervaren quantitatief analist en Python-ontwikkelaar die complexe trading concepten vertaalt naar begrijpelijke, praktische handleidingen voor zowel beginners als gevorderden.

Volgende stap
Bekijk alle artikelen over Strategie Optimalisatie & Tuning
Ga naar overzicht →