De rol van 'Objective Functions' in je optimalisatie script

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

Stel je voor: je hebt een gave trading bot gebouwd in Python, je hebt een broker API gekozen, en je backtest draait soepel op je laptop. Maar hoe bepaal je eigenlijk of je bot écht goed is?

Hier komt de objective function om de hoek kijken. Het is het kompas van je optimalisatie script.

Zonder een goede objective function loop je het risico dat je bot prachtig presteert in de backtest, maar in de live markt met Interactive Brokers of LMAX faalt. Het is de kern van je strategie tuning.

Wat is een objective function eigenlijk?

Een objective function is een simpele functie die een getal teruggeeft. Dit getal vertelt je hoe goed een bepaalde set parameters presteert. Stel je voor dat je een momentum strategie test met een EMA crossover.

Je kunt tientallen parameters instellen, zoals de snelheid van de korte en lange EMA.

De objective function neemt de resultaten van je backtest, berekent een score, en geeft die score terug. Denk aan een simpele formule: winst minus risico.

Je script roept de functie aan voor elke parameter combinatie. De optimizer zoekt vervolgens naar de hoogste of laagste score, afhankelijk van wat je wilt. In Python libraries zoals Backtrader of Zipline wordt dit vaak als een aparte functie gedefinieerd die je kunt wisselen zonder je hele strategie code aan te passen.

Het doel is niet altijd puur maximale winst. Soms wil je stabiliteit.

Een objective function kan rekening houden met drawdown, winstpercentage of de Sharpe ratio. Zonder deze functie zou je optimalisatie script lukraak parameters testen zonder een duidelijk meetbaar doel. Het is de stille coach die je bot beter maakt.

Waarom is het zo belangrijk voor je bot?

Een objective function beschermt je tegen overfitting. Stel je backtest een strategie die perfect draait op historische data van de afgelopen 3 jaar, maar faalt zodra je live gaat bij een broker zoals Degiro of Interactive Brokers.

Een goede objective function kijkt verder dan alleen de totale winst. Het beloont robuustheid. Stel je voor dat je een bot bouwt voor de DAX future. Je backtest laat een winst zien van €5.000 over 100 trades. Maar als je objective function alleen naar totale winst kijkt, mis je de drawdown van €2.000 in één week.

Een betere functie zou de Sharpe ratio of de Calmar ratio gebruiken. Dit zorgt ervoor dat je bot niet alleen wint, maar ook stabiel blijft onder marktdruk.

De keuze van je objective function bepaalt ook hoe je optimalisatie script reageert op data.

Als je een functie kiest die alleen winst maximaliseert, zal je script geneigd zijn om parameters te kiezen die in de backtest extreem hoge winsten laten zien, maar in de praktijk vaak falen. Een evenwichtige functie helpt je om realistische, haalbare parameters te vinden.

Hoe werkt het in de praktijk? Kern en werking

Stel je voor dat je een Python script schrijft voor een mean reversion strategie op de AEX.

def objective_function(results):
    total_return = results['return'].sum()
    max_drawdown = results['drawdown'].max()
    sharpe = results['sharpe'].iloc[0]
    return sharpe - (max_drawdown * 0.5)

Je gebruikt de API van je broker om historische data op te halen. In je script definieer je een functie die de resultaten van een backtest analyseert. Bijvoorbeeld: Deze functie combineert de Sharpe ratio met de drawdown. Je script roept deze functie aan voor elke parameter set die de optimizer test.

De optimizer probeert de hoogste score te vinden. Je kunt libraries als Optuna of Scipy gebruiken om deze zoektocht te automatiseren, maar pas walk-forward optimization toe voor betrouwbaardere resultaten.

In een backtest van 1.000 trades op de DAX future, kan een parameter set met een EMA crossover van 10 en 30 dagen een Sharpe ratio van 1.8 geven, maar een drawdown van 8%.

Een andere set met 20 en 50 dagen heeft een Sharpe van 1.6 en een drawdown van 3%. Je objective function kiest de tweede als je stabiliteit belangrijker vindt dan pure winst. Dit soort afwegingen maakt je bot robuuster.

Je kunt de objective function ook aanpassen voor specifieke doelen. Voor een high-frequency bot op LMAX wil je misschien de winst per trade maximaliseren en de slippage minimaliseren.

Voor een swing trading bot op aandelen bij Degiro wil je misschien de winstpercentage en de gemiddelde hold-tijd meenemen. De functie is flexibel en past zich aan je strategie aan.

Verschillende soorten objective functions en hun impact

Er zijn veel soorten objective functions. De meest bekende is de Sharpe ratio.

Deze meet de risicovrije return per eenheid risico. Een Sharpe van 2 is goed, boven de 1 is acceptabel.

Voor een bot die op de S&P 500 future handelt, wil je een Sharpe van minimaal 1.5 om de transactiekosten te dekken. Een lage Sharpe betekent dat je bot te veel risico neemt voor de return. Een andere veelgebruikte is de Calmar ratio.

Deze deelt de jaarlijkse return door de maximale drawdown. Stel je voor dat je bot €10.000 wint per jaar maar een drawdown van €5.000 heeft.

De Calmar is dan 2. Een Calmar boven de 1 is goed. Voor een bot op een volatile markt zoals crypto, wil je een Calmar van minimaal 1.5 om te zorgen dat je niet te diep in het rood gaat. Je kunt ook een custom objective function maken.

Bijvoorbeeld: winst percentage x gemiddelde winst - verlies percentage x gemiddelde verlies.

Dit beloont strategieën die veel kleine winsten boeken en weinig grote verliezen. Voor een bot op de DAX future met een API van Interactive Brokers, kun je deze functie aanpassen om rekening te houden met commissies en slippage. Een prijsindicatie: een API key voor LMAX kost ongeveer €50 per maand, en een backtest server op AWS draait voor €20-€50 per maand, afhankelijk van de rekenkracht.

Er zijn ook minder bekende varianten zoals de Sortino ratio, die alleen neerwaarts risico meet. Of de Omega ratio, die de verdeling van returns meeneemt.

Voor een bot die op aandelen handelt via Degiro, kan de Omega ratio helpen om de impact van extreme events te meten. Kies een functie die past bij je markt en risicoprofiel.

Praktische tips voor je optimalisatie script

Begin met een simpele objective function en breid langzaam uit. Test je functie op een kleine dataset, bijvoorbeeld 1 jaar historische data van de DAX, voordat je naar 5 jaar gaat.

Gebruik een train-test split: optimaliseer op de eerste 70% van de data en valideer op de laatste 30%. Dit voorkomt overfitting en helpt je te bepalen hoe vaak je je bot moet her-optimaliseren.

Gebruik libraries zoals Optuna of Scipy voor de optimalisatie. Het gebruik van 'Particle Swarm Optimization' is ook een krachtige methode die goed werkt met Python backtesting frameworks. Stel een tijdslimiet in, bijvoorbeeld 2 uur, om te voorkomen dat je script dagenlang draait.

Monitor de resultaten met een simpele dashboard in Streamlit of Jupyter. Pas je objective function aan voor je broker.

Bij Interactive Brokers betaal je commissies per trade, dus neem die mee in je functie. Voor LMAX zijn de spreads belangrijk, dus voeg slippage toe als parameter. Test met realistische bedragen: begin met €10.000 kapitaal en kijk hoe je bot presteert onder transactiekosten van €5-€10 per trade. Experimenteer met verschillende functies en vergelijk de resultaten.

Soms leidt een simpele winst-functie tot betere live performance dan een complexe Sharpe ratio, vooral voor snelle bots op crypto.

Houd een logboek bij van elke run: welke functie, welke parameters, welke resultaten. Dit helpt je om patronen te herkennen en je bot continu te verbeteren.

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 →