De 'Gaps Fill' strategie: Automatisch traden op markt-openingen
Je weet hoe de markt soms voelt als een film die onderbroken wordt. De beurs sluit, de wereld draait door, en als we terugkomen is er een sprong: een gat.
Die sprong, die 'gap', is niet zomaar ruis. Het is een verhaal. Een verhaal van angst of hebzucht dat zich in één keer oplost.
De 'Gaps Fill' strategie draait om dat oplossen. Wij bouwen bots die precies dat moment afwachten: de return to sender.
Handelen op de opening is chaotisch voor een mens, maar voor een Python-script is het een droomscenario. Geen emotie, alleen prijsactie en executie.
Wat is een 'gap' en waarom vul je 'm?
Een gap ontstaat als de openingsprijs van een dag of candle ver buiten de vorige slotingsprijs ligt. Er is letterlijk een leegte in de koers.
Die leegte trekt als een magneet. Grote institutionele orders, een persbericht na sluitingstijd, of een macro-cijfer om 08:00 uur; het maakt de markt onzeker. Handelers en algoritmes zoeken naar stabiliteit.
De markt keert vaak terug naar het niveau waar de vorige candle is gesloten.
Dat is de 'fill'. Simpel gezegd: de markt haalt graag zijn eigen 'vergeten' prijzen in. Als algoritmische handelaar zie je dit niet als bijgeloof, maar als een statistisch voordeel.
De kans dat een gap wordt gevuld verschilt per markt en tijdsframe, maar het is een herkenbaar patroon. Ons doel is niet om te raden of het vandaag gebeurt.
Ons doel is om een bot te bouwen die herkent wat een gap is, risico beheert, en automatisch instapt zodra de markt het gat begint te dichten.
We ruilen de adrenaline van de opening voor de rust van code.
De kern: herkennen, bevestigen en instappen
De basis van de strategie is banaal eenvoudig. We vergelijken de openingsprijs van vandaag met de slotingsprijs van gisteren.
Stel: de S&P 500 futures (ES) sloten gisteren op 5.120. De markt opent vanmorgen om 09:30 uur EST op 5.135.
Dat is een gap-up van 15 punten. Ons script ziet direct: er is een leegte tussen 5.120 en 5.135. De bot wacht niet blindelings.
We voegen een bevestigingsconditie toe. De markt moet beweging tonen. Een populaire regel is: zodra de tweede 5-minuut candle sluit en de koers beweegt richting het gat, geven we een seintje. We shorten de markt boven de gap (boven 5.135) of kopen onder de gap. De stop-loss?
De markt is een dronken familielid die zijn sleutels kwijt is. De 'gap' is waar hij ze verloor. Wij helpen hem zoeken.
Aan de andere kant van de gap. De take-profit? Vaak het midden van de gap of de volgende weerstand.
We bouwen een machine die geen moment twijfelt. In Python draait dit om data.
We halen tickdata via een broker API zoals Interactive Brokers of LMAX. We gebruiken libraries als Pandas en NumPy om de gaps te berekenen. Ons script kijkt naar de 'previous_close' en de 'current_open'.
- Bereken verschil: (Open - Previous_Close) / Previous_Close * 100
- Check volume: is het volume bij opening hoger dan gemiddeld?
- Actie: Plaats een stop-order aan de rand van het gat.
Is het verschil groter dan een drempelwaarde, bijvoorbeeld 0.3%? Dan is het een trade-able gap. Voor een vergelijkbare aanpak bij statistische arbitrage met de Z-score, is de logica als volgt:
De magie zit in de eenvoud. We jagen niet op de volledige fill. We jagen op een deel.
De markt moet alleen maar een teen in het gat steken en onze order triggeren. Dat is een veel hogere waarschijnlijkheid dan wachten tot het gat helemaal dicht is.
Modellen en prijsindicaties: van agressief tot defensief
Niet elke gap is gelijk. We onderscheiden drie modellen, elk met een eigen risico-profiel en doelwit.
- De 'Common Gap' (Conservatief): Dit is de gap zonder groot nieuws. Vaak in rustige markten of indices als de AEX. De bot handelt hier defensief. We mikken op 25% van de gap. Als de gap 10 punten is, nemen we 2,5 punt winst. De stop-loss ligt op 1,5x de gap (dus 15 punte verlies maximaal). Dit model draait op volume en frequentie. Veel kleine winstjes.
- De 'Breakaway Gap' (Agressief): Dit is een gap met kracht. Een sterke candle die door een weerstand breekt. Hier verwachten we dat de gap niet snel wordt gevuld. Ons model short hier juist niet direct. We wachten tot de markt in de middag terugvalt naar de rand van de gap en gebruiken die als instap voor een trend-continuatie. Prijsindicatie: instap op 50% van de gap, stop-loss op de high van de opening candle.
- De 'Exhaustion Gap' (Gevaarlijk maar lucratief): Dit is een gap die aan het einde van een lange trend komt. De markt is moe. De bot herkent dit door afnemend momentum op de 1-uur candle. We proberen de 'fake-out' te vangen. De markt opent, maakt een beweging, en keert dan hard om. Ons script plaatst een order net buiten de gap om de omkeer te vangen. Dit vereist strakke risicomanagement: een stop-loss van maximaal 0,5% van je account per trade.
We bouwen deze modellen als parameters in onze bot, zodat we live kunnen schakelen. Prijsniveaus zijn cruciaal. Onze bot tekent automatisch lijnen op de grafiek: de 'Gap High' en 'Gap Low'. De logica is:
- Gap Up: Short bij aanraking van de Gap Low (de vorige close). Target: Gap High - 1 tick.
- Gap Down: Long bij aanraking van de Gap High (de vorige close). Target: Gap Low + 1 tick.
Waarom werkt dit? Omdat grote partijen (institutions) vaak orders hebben klaarstaan net buiten logische niveaus.
Zij weten dat particulieren jagen op de fill. Onze bot is die institutionele partij. We bieden liquiditeit op de juiste plek.
Backtesting: de waarheid voor je live gaat
Zonder backtest is gokken. We bouwen een pipeline in Python.
Gebruik 'Backtrader' of 'Zipline' voor de engine. De data moet kloppen. Wij gebruiken tickdata van brokers als AMP Futures of data-vendors als TickData.
Geen 1-minuut candles, want die missen de openingsprijs. We hebben tick- of seconden-data nodig om de exacte open te zien.
Je test op minimaal 2 jaar data. Je kijkt naar: Een valkuil is 'overfitting'. Je past de parameters zo aan dat het verleden perfect is, maar de toekomst faalt. Test dus op out-of-sample data.
- Winrate: Is die boven de 50% bij een 1:1.5 risk-reward?
- Max Drawdown: Kan je account een verliesreeks van 8 trades aan?
- Sharpe Ratio: Is de winst stabiel of een rollercoaster?
Neem de data van 2022 en 2023 voor de test. Gebruik 2024 als onzichtbare test.
Als je bot in 2024 nog steeds werkt, pas dan live. Wij draaien vaak eerst 'paper trading' via de API van Interactive Brokers of MetaTrader 5 om de executie te testen, bijvoorbeeld bij een grid trading bot. Slaat de order aan?
Is de slippage acceptabel? Vergeet de transactiekosten niet.
Een gap-strategie op een 5-minuut timeframe kan veel trades genereren. Bij $2 per contract (roundtrip) telt dat op. Onze backtest moet dit meenemen. Alleen als de bruto-winst minimaal 3x de kosten is, is het een valide strategie.
Live: risicomanagement en executie
Als de bot live gaat, ben je de piloot, niet de passagier. De API is je stuur. We zorgen dat de bot nooit meer riskeert dan hij mag.
De gouden regel: risk management zit in de code, niet in je hoofd.
- Position Sizing: De bot berekent de grootte. Stel je account is €10.000. Je wilt max €100 verlies per trade (1%). De stop-loss staat 10 punten verderop. De bot koopt of short precies 10 contracts (10 punten x 10 contracts = €100). Automatisch.
- Cooldowns: Na 3 verliesgevende trades in een rij? De bot schakelt zichzelf uit voor 2 uur. Dit voorkomt 'tilting'.
- Slippage & Spread: Tijdens de opening is de spread vaak breed. Onze bot checkt de spread. Is die meer dan 2 ticks? Dan wachten we. We jagen geen slechte fills na.
De techniek moet stabiel zijn. Gebruik een VPS (Virtual Private Server) dicht bij de exchange (bijvoorbeeld in Londen of New York voor US-markten).
We draaien de bot op een Raspberry Pi of een cloud instance. We loggen alles: elke order, elke error, elke API-call. Als de verbinding wegvalt, moet de bot de openstaande orders direct annuleren.
We gebruiken 'OCA' orders (One Cancels All) om te voorkomen dat we long en short tegelijk zitten bij een glitch.
Een laatste tip: de markt verandert. De 'gap fill' werkte geweldig in 2020 en 2021, maar in een zijwaartse markt in 2023 deden breakaway gaps het beter. Wij monitoren de prestaties wekelijks. Als de winst per trade onder de €50 zakt (bij een account van €20k), schakelen we het model uit of passen we de parameters aan.
Trading is geen set-and-forget. Het is een machine die je onderhoudt.
Begin klein. Bouw de bot voor één markt, bijvoorbeeld de DAX (FDAX) of de S&P 500 (ES). Leer hem kennen.
Zie hoe hij reageert op een gap van 30 punten. Pas als je vertrouwen hebt en de code stabiel is, breid je uit. De markt wacht niet, maar met de juiste code loop je altijd voorop.
