Unit testing schrijven voor je trading logica met Pytest
Je hebt je handelsstrategie gebouwd, de data gedownload van je broker, en je bot draait op een virtuele server. Maar werkt het echt?
Een unit test schrijven met Pytest is de manier om je trading logica op simpele, betrouwbare manier te controleren zonder direct geld te verliezen.
Het voelt als een veiligheidsnet onder je code.
Wat zijn unit tests eigenlijk?
Een unit test controleert één klein stukje code, oftewel een 'unit'. In trading is dat bijvoorbeeld een functie die een buy signaal berekent op basis van een RSI-waarde.
Je test niet je hele bot in één keer, maar pakt één blokje logica uit elkaar en kijkt of het doet wat het moet doen. Zo simpel is het. Stel je voor: je schrijft een functie die checkt of de koers boven de 50-day moving average ligt. Je geeft de functie een test-dataset met een bekende uitkomst.
Als de functie True teruggeeft wanneer dat moet, en False wanneer dat niet moet, dan weet je dat dit stukje logica klopt. Je test de input en de output, zonder de hele markt te simuleren.
Waarom doe je dit? Omdat je in Python vaak complexe berekeningen doet voor je strategie.
Een simpele fout in een indicatorberekening kan leiden tot foute trades. Met Pytest schrijf je in een paar regels code een test die deze fouten direct opspoort. Het is je eerste verdedigingslinie tegen bugs.
Pytest is een populair framework omdat het weinig moeite kost om te starten. Je installeert het met pip install pytest en je kunt direct beginnen. Geen uitgebreide setup, gewoon een mapje met testbestanden en je bent klaar om te gaan.
Waarom testen voor trading onmisbaar is
Stel je voor dat je een fout maakt in de logica voor je stop-loss. Je bot koopt 100 aandelen, maar de stop-loss wordt verkeerd berekend.
In plaats van een verlies van €50 te beperken, verkoop je bij een verlies van €500. Een unit test had deze fout kunnen vangen voordat je echt geld inzet. Het is een kleine moeite voor een grote gemoedsrust.
Trading bots draaien vaak 24/7, soms op een VPS van €5 per maand.
Je bent niet altijd aanwezig om in te grijpen. Tests geven je vertrouwen dat je bot doet wat hij moet doen, zelfs als je slaapt. Je weet zeker dat de risicomanagement-regels kloppen, zoals de maximale positiegrootte.
Denk ook aan het onderhoud van je code. Als je je strategie wilt aanpassen, bijvoorbeeld vanwege nieuwe marktcondities, kunnen tests laten zien of je bestaande logica nog steeds werkt.
Zonder tests verander je code in het duister, met het risico dat je iets kapotmaakt wat eerst wel werkte.
En het scheelt tijd. In plaats van handmatig charts te bekijken om te zien of een indicator klopt, draai je een test en krijg je direct een groen of rood vinkje. Dit versnelt je ontwikkelproces enorm, vooral als je meerdere strategieën parallel test bij brokers zoals Interactive Brokers of degiro.
De kern: hoe schrijf je een unit test voor trading logica?
Laten we een concreet voorbeeld nemen: een functie die bepaalt of we moeten kopen als de RSI onder 30 zit. We schrijven een test die controleert of de functie True teruggeeft bij een RSI van 25, en False bij een RSI van 35.
Dit is je basis-unit test. Je begint met een simpele Python-functie in je strategiebestand.
def should_buy(rsi_value): return rsi_value < 30
Stel je hebt deze functie: Om deze te testen, maak je een apart testbestand, bijvoorbeeld test_strategie.py. Daarin schrijf je met Pytest een testfunctie.
def test_should_buy_rsi_low(): assert should_buy(25) == True def test_should_buy_rsi_high(): assert should_buy(35) == False
Pytest herkent functies die beginnen met test_. Je gebruikt de assert-statement om de output te controleren.
Dit is alles. Je draait de test met het commando pytest in je terminal. Als beide tests slagen, krijg je een groene melding. Als er een fout is, laat Pytest precies zien waar het misgaat, inclusief de regelnummer.
Zo debug je snel je trading logica. Je kunt dit uitbreiden met meerdere inputs.
Test bijvoorbeeld de grens: wat gebeurt er bij een RSI van 30? Moet je kopen of niet? Je bepaalt die grens in je strategie. Schrijf een test voor elk scenario, zodat je zeker weet dat je logica robuust is voor verschillende marktsituaties.
Praktische voorbeelden en variaties voor je bot
Een andere veelvoorkomende test is voor een stop-loss functie. Stel je hebt een functie die de stop-loss prijs berekent op basis van de instapprijs en een percentage van 2%.
def test_stop_loss_calculation(): entry_price = 100.0 stop_loss_pct = 0.02 expected_stop = 98.0 assert calculate_stop_loss(entry_price, stop_loss_pct) == expected_stop
Je test of de berekening klopt voor een aandeel dat je koopt op €100. De stop-loss moet dan €98 zijn. Een simpele test vangt hier fouten in de wiskunde.
Voor meer complexe logica, zoals een trendvolgende strategie met een EMA crossover, schrijf je tests met een lijst van historische koersen.
Je geeft een kleine dataset van 5 dagen aan je functie en controleert of het juiste signaal wordt gegeven. Bijvoorbeeld: als de 5-day EMA boven de 10-day EMA ligt, moet je kopen. Je kunt ook mocks gebruiken voor externe data.
In plaats van live data van een broker API op te halen, simuleer je de data in je test. Zorg er voordat je begint voor dat je een virtuele omgeving (venv) opzet voor je trading project; dit maakt je tests sneller en onafhankelijk van internet of API-limieten.
Pytest heeft hier handige tools voor, zoals fixtures, om data op te zetten en weer af te breken.
Een variant is het testen van risicomanagement. Schrijf een test die controleert of je bot nooit meer dan 1% van je kapitaal riskeert per trade. Je simuleert een paar trades en checkt of de positiegrootte klopt. Dit voorkomt dat je bot te agressief wordt en je account leegtrekt.
Voor backtesting-logica schrijf je tests die controleren of je winstberekening klopt. Neem een eenvoudige dataset: koop op dag 1, verkoop op dag 3.
Bereken de winst en vergelijk dit met je test. Als je backtest-module klopt, weet je dat je strategiehistorisch goed presteert.
Praktische tips voor het testen van je trading code
Begin klein. Schrijf niet meteen 50 tests voor je hele bot, maar pak één functie per keer.
Kies voor de meest kritieke logica, zoals je entry- en exit-voorwaarden. Dit bouwt vertrouwen op zonder je overweldigd te voelen.
Gebruik fixtures in Pytest voor herbruikbare data. Bijvoorbeeld een fixture met een standaard dataset van koersen voor je tests. Dit bespaart tijd en houdt je testcode schoon. Je definieert het een keer en roept het aan in elke testfunctie.
Test ook edge cases. Wat als de markt sluit?
Wat als een API-call faalt? Schrijf tests voor fouten, zoals een lege lijst met koersen. Dit maakt je bot veerkrachtiger en voorkomt crashes tijdens live trading. Vergeet ook niet om hyperparameters te optimaliseren voor betere resultaten.
Integreer tests in je workflow. Draai ze elke keer als je code wijzigt, bijvoorbeeld met een simpele GitHub Action.
Dit kost niets extra en zorgt dat je geen regressies introduceert. Je bot blijft stabiel, of je nu handelt op Binance, Kraken, of een andere broker.
Test regelmatig met echte data. Na je unit tests, voeg integratietests toe die je bot laten draaien op historische data. Dit combineert je tests met een realistische backtest, waarbij je eenvoudig 80+ technische indicatoren kunt toepassen. Zo bouw je een betrouwbare trading bot die je met een gerust hart live kunt zetten.
