Wat is '3D Surface Plotting' van parameters en hoe lees je het?
Stel je voor: je hebt een gave trading-strategie gebouwd in Python. Misschien gebruik je vectorbt of Backtrader.
Je hebt een mooi script dat draait op data van je broker, zoals Interactive Brokers of Degiro. Je bent er klaar voor om te gaan tunen. Je wilt weten: wat is de beste combinatie van parameters?
Een 3D Surface Plot is als een warmtekaart van je parameters. Het laat je in één oogopslag zien waar de winsten liggen en waar de verliezen.
Geen giswerk meer, maar een duidelijk beeld. Dit is hoe je die kaart maakt en leest.
Wat je nodig hebt (je toolkit)
Je hebt een computer met Python geïnstalleerd, bijvoorbeeld versie 3.9 of hoger. Je hoeft geen supercomputer te hebben, een stabiele internetverbinding is belangrijker.
Zorg dat je een code-editor hebt klaarstaan, zoals VS Code of Jupyter Notebooks.
Die laatste is ideaal voor dit soort werk omdat je direct de plaatjes ziet. Installeer de volgende bibliotheken via je terminal met pip install naam. We hebben er drie nodig: Pandas voor je data, Plotly voor die mooie interactieve 3D-plaatjes, en natuurlijk je backtesting-engine.
Kies je voor vectorbt? Installeer die. Gebruik je Backtrader? Zorg dat die goed staat.
Reken op een uurtje werk om je omgeving op te zetten als je dat nog niet hebt. De libraries zijn gratis. Een goede broker-API is cruciaal voor echte data. Je kunt een demo-account gebruiken bij Interactive Brokers of een API-key aanvragen bij een crypto-exchange als Binance.
Zo haal je echte prijzen binnen. Zonder goede data is je plaatje namelijk waardeloos.
Stap 1: Je data en strategie voorbereiden
Voordat we gaan plotten, moeten we de basis leggen. We beginnen met het laden van data. Laten we zeggen dat we kijken naar de EUR/USD-paar op een 1-uur grafiek.
Je haalt de data via de API van je broker of laadt een CSV-bestand in.
We hebben minimaal 1000 candles nodig voor een redelijke test. Definieer je parameters.
Kies twee variabelen die je wilt testen. Bijvoorbeeld de 'Fast Moving Average' (EMA) en de 'Slow Moving Average'. Stel een bereik vast.
Bijvoorbeeld: Fast EMA loopt van 10 tot 50 (stapgrootte 5) en Slow EMA loopt van 60 tot 100 (stapgrootte 5).
Dit zijn je assen op de grafiek. Veelgemaakte fout: Te veel parameters proberen in één keer. Houd het bij 2 variabelen. Anders wordt de plot een chaos.
Je bent nu 15 minuten bezig met het schrijven van de data-lading en het definieren van je parameter-lijsten. Zorg dat je script losse functies heeft voor je strategie-logica.
Stap 2: De grid-scan draaien
Dit is de rekenkracht-fase. Je moet alle combinaties van je parameters langs laten gaan.
Schrijf een simpele lus (loop) die door je parameter-lijsten gaat. Voor elke combinatie (bijv.
Fast=15, Slow=70) draai je je backtest op de historische data. Bewaar de uitkomst. Je wilt niet alleen de totale winst bewaren, maar ook de 'Sharpe Ratio' of het 'Max Drawdown'.
Voor deze 3D-plot hebben we een getal nodig dat we kunnen plotten. Laten we de totale Return on Investment (ROI) gebruiken.
Sla dit op in een lijst of een dictionary. Tip: Gebruik vectorbt als je kunt. Die library is gebouerd voor dit soort snelle berekeningen. Een simpele Python-lus kan traag zijn.
Als je 20x20 combinaties draait (400 runs), duurt dat op een normale laptop misschien 5 tot 10 minuten.
Als het langer duurt, kijk dan naar je data-lengte of je code-efficiëntie.
Stap 3: De 3D Surface Plot maken
Nu het leuke gedeelte: visualiseren. We gebruiken Plotly omdat het interactief is.
Je kunt draaien en inzoomen. We maken een oppervlakte-plot (Surface Plot). De X-as is je Slow EMA, de Y-as is je Fast EMA, en de Z-as (de hoogte) is je winst.
Hier is een concept-codeblokje (in pseudocode, want je moet je eigen data inladen):
import plotly.graph_objects as go
# X-as: Slow EMA waarden (bijv. 60 t/m 100)
x_values = [60, 65, ..., 100]
# Y-as: Fast EMA waarden (bijv. 10 t/m 50)
y_values = [10, 15, ..., 50]
# Z-as: Winst matrix (2D array van resultaten)
z_values = [[-2, 5, ...], [10, 15, ...]]
fig = go.Figure(data=[go.Surface(x=x_values, y=y_values, z=z_values)])
fig.update_layout(title='ROI Heatmap: Fast vs Slow EMA', autosize=False, width=700, height=700)
fig.show()
Run dit stuk code in je Jupyter Notebook. Er zou een venster moeten openen met een 3D-berg. Je kunt met je muis draaien. Veelgemaakte fout: De assen verwarren.
Zorg dat je X en Y arrays kloppen met de data die je in stap 2 hebt gebruikt. Een verkeerde volgorde geeft een nutteloze berg.
Stap 4: De kaart lezen: waar zit de schat?
Je hebt nu een driedimensionale berg voor je neus. Dit is je 'parameterlandschap'.
De hoge pieken (hoogste Z-waarde) zijn de meest winstgevende parameter-combinaties. De diepe dalen zijn verliesgevend. Zoek naar 'plateaus'.
Een hoge piek is vaak toeval. Een hoog plateau dat breed is, is veel beter.
Dat betekent dat je strategie robuust is. Als de winst inzakt zodra je de parameter een beetje aanpast, is je strategie te gevoelig. Voorkom over-optimization in volatiele markten door te zoeken naar een brede groene zone.
Kijk naar de randen van je plot. Stopt de winst plotseling bij een bepaalde waarde?
Dan heb je misschien je parameter-bereik te klein gekozen. Of je bent slachtoffer geworden van parameter sniffing bij het optimaliseren van je code die alleen opduikt bij extreme waarden.
Een goede plot voelt stabiel aan.
Stap 5: De valkuilen vermijden
Er zitten addertjes onder het gras. De grootste is 'Overfitting'.
Je vindt een geweldige piek in de plot op specifieke getallen, bijvoorbeeld Fast=33 en Slow=87.
Als je die getallen nu blind gebruikt in de live markt, verlies je waarschijnlijk geld. De markt verandert. Test je plot op 'Out-of-Sample' data. Splits je data op.
Gebruik 2022 voor de plot (In-Sample). Kijk of de groene zones in 2023 (Out-of-Sample) ook winstgevend zijn. Als de berg in 2023 een andere vorm heeft, is je strategie waarschijnlijk te specifiek voor die ene periode. Een andere valkuil is de 'Look-ahead bias'.
Zorg dat je bij het backtesten nooit data gebruikt die je op dat moment nog niet had.
Je script moet elke candle alsof het echt is behandelen. Doe je dit niet, dan glinstert je plot vals.
Stap 6: Van plot naar actie
Je hebt de kaart gelezen. Nu moet je kiezen.
Pak de top 3 van beste parameter-combinaties. Zet ze op een rijtje. Kies niet per se de allerhoogste piek, maar degene die het meest logisch aanvoelt en het minste risico lijkt te nemen (lage drawdown). Test deze top 3 in een 'Forward Test'.
Dit is een test op live data, maar dan met nepgeld. De meeste brokers (zoals Interactive Brokers of OANDA) hebben hiervoor een paper trading omgeving.
Laat je bot 1 week draaien met de gekozen parameters. Kijk of de resultaten lijken op je 3D-plot.
Als de forward test goed gaat, pas je de parameters toe op je live bot. Zet je risicomanagement aan (bijv. max 1% risico per trade). Je bent nu niet meer aan het gokken; je hebt een data-gestuurde beslissing genomen, waarbij je valkuilen zoals curve fitting hebt vermeden.
Verificatie-checklist
Voordat je je script uitzet en gaat slapen, loop deze lijst even na. Dit voorkomt teleurstellingen en verloren tijd.
- Data kwaliteit: Is je data schoon? Zitten er geen gaten in?
- Parameter range: Is je bereik breed genoeg maar niet te breed?
- Visualisatie: Kan je de plot draaien en inzoomen?
- Robuustheid: Zie je een plateau of alleen een spitse piek?
- Out-of-Sample: Werkt de strategie op data die de plot niet heeft gezien?
- Risico: Zijn de verliezen in de dalen beheersbaar?
Als je hier een 'ja' op hebt, ben je klaar. Je hebt nu een krachtig instrument in handen om je algoritmische trading strategie te verfijnen.
Veel succes met het tunen van je bot!
