Waarom je nooit 'onbeperkte' marktorders moet gebruiken in je code
Stel je voor: je hebt een prachtige Python-bot gebouwd die een strategie draait op de DAX of de S&P 500.
Je backtest ziet er perfect uit, je risicomanagement is strak, en dan gebeurt het: de markt klapt omlaag tijdens een nieuwsbericht en je bot probeert een onbeperkte marktorder uit te voeren. Pats, boem, je bent veel meer kwijt dan je had gedacht. Dit is geen theorie; het is een scenario dat algoritmische traders dagelijks overkomt. We gaan het hebben over waarom je nooit, echt nooit, onbeperkte marktorders in je code moet gebruiken.
Wat is een onbeperkte marktorder eigenlijk?
Een onbeperkte marktorder is simpelweg een order zonder limiet. Je zegt tegen je broker: "Koop of verkoop nu, tegen de beste beschikbare prijs, wat die ook is." In theorie klinkt dit snel en efficiënt. In de praktijk is het een open cheque voor de markt om te doen wat ze wil.
Stel je voor dat je een aandeel wilt kopen dat op €100 staat.
Je stuurt een marktorder zonder limiet. Als er op dat moment maar één verkoper is met een prijs van €150, dan koop jij voor €150.
Het maakt niet uit dat de gemiddelde prijs €100 is; jij betaalt wat er op dat moment beschikbaar is. Dit is het kernprobleem van onbeperkte orders. Bij algoritmische trading gaat dit nog een stap verder.
Je bent niet meer in controle; de markt is het.
Je bot draait automatisch, zonder menselijke tussenkomst. Als er een bug is of een onverwachte marktbeweging, kan je bot duizenden euro's verliezen in seconden.
Onbeperkte marktorders zijn als een auto zonder remmen: je kunt wel sturen, maar stoppen wordt een uitdaging.
Waarom dit je portfolio kan vernietigen
Stel je voor dat je bot een shortpositie opent op een aandeel dat €50 waard is. Je denkt dat het gaat dalen, maar er komt onverwacht nieuws en het aandeel schiet naar €80. Je bot probeert te sluiten met een onbeperkte marktorder, maar er is geen liquiditeit op dat niveau.
Je eindigt met een verlies van €30 per aandeel, in plaats van de €2 die je had ingecalculeerd.
Dit is geen zeldzaamheid. Tijdens de Flash Crash van 2010 zagen we aandelen met 9% dalen en binnen minuten weer herstellen.
Onbeperkte marktorders waren een van de grootste boosdoeners. Beleggers zagen hun portefeuilles met tienduizenden euro's kelderen, alleen omdat hun orders geen limiet hadden. Risicomanagement draait om controle.
Met een onbeperkte marktorder geef je die controle uit handen. Je weet nooit precies tegen welke prijs je order wordt uitgevoerd.
Dat maakt het onmogelijk om je risico's strak te managen. En als je je risico's niet kunt managen, ben je aan het gokken, niet aan het traden. Denk ook aan de kosten. Onbeperkte marktorders kunnen leiden tot hogere transactiekosten, vooral bij lage liquiditeit.
Je betaalt niet alleen de slechte prijs, maar ook nog eens extra aan je broker voor de uitvoering. Dit eet je winst op, vooral bij frequent traden.
Hoe het werkt in de praktijk: de gevaren van slippage
Slippage is het verschil tussen de verwachte prijs en de werkelijke uitvoeringsprijs. Bij onbeperkte marktorders is slippage niet een risico; het is een garantie.
Stel je voor dat je een order plaatst voor 1000 aandelen van een ETF met een spread van €0,10.
Zonder limiet kan die spread oplopen tot €0,50 of meer, afhankelijk van de marktomstandigheden. Laten we een concreet voorbeeld nemen. Je gebruikt een Python-bot die handelt op de Amsterdamse beurs.
Je bot koopt 500 aandelen van een fonds dat op €20 staat. Je verwacht een uitvoering op €20, maar door onbeperkte marktorders betaal je €20,50 per stuk.
Dat is €250 extra kosten, alleen al door slippage. Over 100 trades per maand loopt dat op tot €25.000 aan onnodige kosten. Bij backtesting zie je dit probleem vaak niet terug. Je historische data toont de gemiddelde prijs, maar in de echte wereld is de liquiditeit beperkt.
Je bot presteert fantastisch in de test, maar faalt in de live-omgeving.
Dit is een klassieke val voor algoritmische traders. Om dit te voorkomen, moet je altijd limieten instellen. Gebruik een limietorder of een stop-limitorder.
Deze orders geven je de controle over de maximale prijs die je betaalt of ontvangt. Het betekent dat je order misschien niet direct wordt uitgevoerd, maar dat is beter dan een uitvoering tegen een prijs die je portfolio schade berokkent.
Betere alternatieven: limieten en stops
De meest voor de hand liggende vervanger is een limietorder. Je geeft een maximale prijs voor een kooporder of een minimale prijs voor een verkooporder.
Stel je wilt kopen op €19,50, dan zet je die limiet in je code.
Als de markt daalt naar €19,50, wordt je order uitgevoerd. Als niet, blijft hij openstaan. Dit beschermt je tegen onverwachte prijsstijgingen.
Een andere optie is een stop-limitorder. Deze combineert een stopprice met een limiet.
Stel je hebt een shortpositie op een aandeel dat op €50 staat. Je zet een stop op €55 en een limiet op €56. Als de prijs €55 bereikt, activeert de order, maar alleen als hij onder €56 kan worden uitgevoerd. Dit voorkomt dat je betaalt voor een prijs die ver boven je limiet ligt.
Voor algoritmische trading bots is het essentieel om deze ordertypes te integreren in je Python-code, eventueel aangevuld met slimme hedging strategieën met opties.
Gebruik bibliotheken zoals CCXT of de API van je broker (bijvoorbeeld Interactive Brokers of DEGIRO) om limieten in te stellen. Test deze in je backtesting-omgeving met realistische slippage-modellen. Je wilt niet dat je bot in de live-omgeving verrast wordt.
Denk ook aan de grootte van je orders. Bij grote volumes kan een onbeperkte marktorder de markt bewegen, vooral bij minder liquide aandelen.
Gebruik order slicing: verdeel je order in kleinere delen en voer ze uit over tijd. Dit vermindert slippage en houdt je risico's beheersbaar.
Praktische tips voor je code en risicomanagement
Begin met je broker. Kies een broker die goede API-ondersteuning biedt en lage transactiekosten heeft, zoals Interactive Brokers of Saxo Bank.
Zorg dat je API-toegang hebt om limieten en stops automatisch in te stellen.
Test dit eerst met een demo-account voordat je live gaat. Implementeer risicobeheer in je Python-code, bijvoorbeeld door een ATR-gebaseerde stop-loss te programmeren. Gebruik bibliotheken zoals Pandas voor data-analyse en Backtrader voor backtesting.
Stel altijd een maximale slippage in, bijvoorbeeld 0,5% van de prijs. Als je bot een order plaatst, controleer dan of de uitvoeringsprijs binnen deze limiet valt. Monitor je trades actief. Stel alerts in voor grote slippage of onverwachte prijsbewegingen.
Als je bot een onbeperkte order probeert te plaatsen, moet dit automatisch worden geblokkeerd.
Gebruik een fallback-mechanisme: als de limiet niet wordt bereikt, annuleer de order en probeer opnieuw. Test, test, test.
Gebruik historische data van je broker om je strategie te backtesten met realistische slippage. Simuleer marktcrashes en lage liquiditeit om te zien hoe je bot reageert. Pas je code aan totdat je zeker bent dat je bot geen onbeperkte orders meer uitvoert.
Onthoud: trading draait om consistentie en controle. Voer een correlatie-analyse tussen strategieën uit, want onbeperkte marktorders nemen die controle weg.
Met limieten en stops bouw je een robuuste bot die je portfolio beschermt, zelfs in turbulentie. Neem de tijd om je code te verfijnen, en je zult merken dat je risico's afnemen en je winstgevendheid toeneemt.
