Time Weighted Average Price (TWAP): Hoe grote orders onzichtbaar blijven
Stel je voor: je wilt 500 aandelen van het populaire tech-fonds QQQ kopen, maar je wilt niet dat de hele markt je plannen ruikt. Als je een market order plaatst, duw je de prijs direct omhoog en betaal je een stuk meer. Je betaalt slippage en je order is een gids voor andere handelaren.
TWAP is je onzichtbare mantel. Het verspreidt je order over de tijd, zodat je vlot in de rij past zonder iemand omver te duwen.
Time Weighted Average Price (TWAP) is een algoritmische handelsstrategie die een grote order opbreekt in kleinere, gelijkmatige stukjes. In plaats van in één keer toeslaan, verdeel je de order over een bepaalde periode.
Je doel is simpel: de gemiddelde prijs over die periode matchen, met zo min mogelijk marktimpact en zo min mogelijk sporen. Dit is exact wat je nodig hebt als je met Python bots via een broker API zoals Interactive Brokers of Alpaca handelt en je risico’s binnen de perken wilt houden.
Wat je nodig hebt: je gereedschapskist
Voor een TWAP-strategie hoef je geen rocket science te bouwen, maar je basis moet strak zitten. Denk aan een stabiele internetverbinding, een broker met een betrouwbare API (zoals Interactive Brokers via ib_insync, Alpaca of een crypto-exchange als Binance), en een Python-omgeving met de juiste libraries.
Je hebt een backtesting-omgeving nodig, bijvoorbeeld Backtrader of VectorBT, om je logica te valideren voordat je echt geld inzet.
Denk aan de kosten. Een data-abonnement bij je broker kost vaak €20-€50 per maand, en transactiekosten lopen op. Bij IBKR betaal je soms €0,005 per aandeel met een minimum van €1 per trade.
Een VPS om je bot 24/7 te laten draaien kost €5-€20 per maand. Zorg dat je risicomanagement op orde hebt: een stop-loss, position sizing en eventueel een kill-switch die je bot uitzet bij extreme volatiliteit.
Checklist voor je start: een API-sleutel met de juiste rechten, een Python-omgeving (minimaal 3.9), een virtuele omgeving (venv), en een testaccount bij je broker. Zorg dat je weet wat de orderlimieten zijn: sommige brokers accepteren maximaal 200 orders per minuut. En vergeet niet: een TWAP-bot die te vaak orderaanpassingen stuurt, kan als spam worden gezien en geblokkeerd worden.
Stap 1: definieer je doel en parameters
Eerst bepaal je wat je wilt bereiken. Koop je 1.000 aandelen ASML tegen een gemiddelde prijs van €750,00?
Of verkoop je 5 BTC zonder de markt te laten crashen? Stel je totale ordergrootte in, de totale duur en het gewenste interval. Voor een daghandel-strategie kies je vaak 30-60 minuten, voor een swing-trade kan het 2-4 uur zijn. Formuleer je parameters concreet: totale volume (Q), totale tijd (T) en aantal slices (N).
De grootte per slice is Q/N. De tijd per slice is T/N.
Bij 500 aandelen over 50 minuten in 10 slices koop je elke 5 minuten 50 aandelen.
Wees specifiek: “Order: 500 QQQ, duur: 30 min, slices: 12, om de 2,5 minuut 41 aandelen.” Veelgemaakte fout: te agressieve slices kiezen waardoor je alsnog marktimpact creëert. Een slice van 20% van het gemiddelde volume per 5 minuten is vaak te veel.
Houd het bij 1-5% van het typische volume per slice. En bedenk: als de spread €0,02 is, is een limietorder vaak slimmer dan een market order. Zet je limietprijs slim: bij een kooporder soms net iets boven de bid, bij verkoop net onder de ask.
Stap 2: bouw de logica in Python
Begin met een simpele structuur: een klasse TWAPBot die je parameters opslaat en een scheduler gebruikt (bijvoorbeeld schedule of een event loop) om elke slice uit te voeren. Je haalt de huidige marktprijs op via de API, berekent je limietprijs (prijs + of - een kleine offset), en stuurt een limietorder.
Je bewaakt de uitvoering: als een slice niet binnen een timeout (bijv. 30 seconden) is gevuld, pas je de limietprijs licht aan of switch je naar een market order voor dat slice. Code-idee in heldere stappen: initialiseer de bot met symbool, volume, duur, slices; start een timer; bij elk interval: bereken slice_volume = total_volume / slices; haal bid/ask op; zet limietprijs = bid + €0,01 (bij koop); verstuur limietorder; log de fill.
Gebruik try/except om API-fouten te vangen en retry logic met backoff (bijv. 1s, 2s, 4s).
Veelgemaakte fout: geen rekening houden met rate limits. Bij Alpaca mag je soms 200 requests per minuut, bij Binance 1200. Als je te snel gaat, blokkeer je je eigen bot. Log elke call en tel ze.
Een andere fout is het vergeten van time-in-force: gebruik GTC (Good-Til-Canceled) niet bij TWAP, tenzij je wilt dat openstaande slices blijven liggen. Gebruik IOC (Immediate-Or-Cancel) of FOK (Fill-Or-Kill) voor strakke controle.
Stap 3: backtesten en fine-tunen
Backtesten is je proefrit. Gebruik historische tick- of 1-minuutdata om je slices na te bootsen.
In VectorBT of Backtrader simuleer je de orderuitvoering: je kijkt naar de beschikbare liquidity op elk moment en telt de slippage. Je doel: de Volume Weighted Average Price (VWAP) zo dicht mogelijk benaderen, met minimale kosten. Test met reële parameters: 1.000 aandelen, 60 minuten, 12 slices, limietorders met €0,01 offset.
Draai minimaal 20 runs op verschillende dagen en tijdstippen. Pas de slice-grootte aan als je ziet dat je te vaak ongevulde slices hebt.
Verlaag de offset als je te veel slippage hebt. Voeg een kill-switch toe: als de prijs in één slice met 0,5% beweegt, pauzeer dan en waarschuw. Veelgemaakte fout: backtesten met te weinig data. Gebruik ten minste 3-6 maanden data, inclusief rustige en volatiele dagen.
En let op: in de backtest tel je alleen fills die echt konden plaatsvinden. Simuleer geen 100% fill-rate als de liquidity laag is.
Een andere val: het vergeten van commissies. Een €0,005 per aandeel tarief telt op bij 1.000 aandelen: €5 extra kosten.
Stap 4: live monitoring en risicomanagement
Zodra je live gaat, monitor je elke slice. Stel een dashboard in met: prijs vs.
TWAP, resterende volume, slices verstuurd/filled, en slippage per slice. Gebruik een heartbeat: elke minuut een seintje dat de bot draait. Zet alerts bij fouten: “Order niet gevuld binnen 60 seconden” of “API rate limit bijna bereikt.” Risicomanagement is key.
Stop-loss op totale positie, bijvoorbeeld 2% onder de gemiddelde ingangsprijs. Gebruik een maximum slippage per slice: als je €0,05 per aandeel overschrijdt, stop je en schakel je over naar handmatige inspectie.
Beperk het aantal slices per minuut: max 3-5 om rate limits te respecteren.
En zorg voor een kill-switch die alle openstaande orders annuleert en de bot stilzet. Veelgemaakte fout: te veel vertrouwen in de eerste live-uren. De eerste 30 minuten zijn cruciaal: controleer of de slices op tijd komen en of de limietprijzen marktconform zijn.
Een andere fout is het negeren van externe events: earnings, FOMC, of grote news. Op die momenten is de spread groter en is TWAP riskant. Schakel de bot uit of verleng de duur.
Stap 5: optimalisatie en schaal
Als je bot stabiel loopt, kijk je naar optimalisatie. Voeg dynamische slice-grootte toe: baseer de grootte op het huidige volume.
Als de markt rustig is, maak je slices kleiner; bij hogere volume mag je iets groter. Pas de offset dynamisch aan: bij een spread van €0,02 kies je een offset van €0,01, bij €0,05 kies je €0,02. Gebruik de Z-score voor je spread-analyse, zodat je competitief blijft zonder te veel te betalen.
Denk aan schaalbaarheid. Meerdere bots voor verschillende assets?
Gebruik aparte API-keys en limieten per bot. Zet een VPS in met monitoring (bijv. Prometheus/Grafana) en een eenvoudige logdatabase. Test failover: wat gebeurt er als de API 2 minuten down is?
Je bot moet veilig pauzeren en hervatten zonder dubbele orders. Veelgemaakte fout: te veel optimaliseren op één dataset.
Dat leidt tot overfitting. Test op out-of-sample data en op verschillende markten. En onthoud: TWAP is een executie-strategie, geen alpha-generator.
Je wint niet met timing, je wint met minder impact en betere prijs.
Houd het simpel, robuust en transparant.
Verificatie-checklist
- API-toegang werkt: verbindingstest geslaagd, data opgehaald, order geplaatst in testomgeving.
- Parameters staan goed: totaal volume, duur, slices, limietoffset, time-in-force.
- Backtests tonen consistente slippage < 0,1% en fill-rate > 95%.
- Rate limits gerespecteerd: logging toont max 3-5 calls per minuut per bot.
- Risico’s afgedekt: stop-loss ingesteld, kill-switch getest, maximum slippage per slice gedefinieerd.
- Monitoring actief: dashboard draait, alerts staan, heartbeat is zichtbaar.
- Failover getest: API-down scenario resulteert in veilige pauze zonder dubbele orders.
- Logboek compleet: elke slice met prijs, volume, fill-tijd en slippage.
- Live run eerste 30 minuten: slices op tijd, limietprijzen marktconform, geen errors.
- Uitstapprocedure helder: wie annuleert openstaande orders, wie schakelt de bot uit bij nood.
Met TWAP neem je de markt mee in jouw tempo. Je verdeelt je grote order, houdt je sporen klein en krijgt een eerlijke prijs. Gebruik de bovenstaande stappen, bouw je Python-bot, backtest grondig, en optimaliseer je winst met een trailing take profit. Zo blijven grote orders onzichtbaar en blijf jij de regie houden.
