Hoe automatiseer je een handelsstrategie: de lessen van twintig jaar backtest

Een trader vertrouwde ons zijn methode toe. Dit zijn de correcties die twintig jaar simulaties aan de eerste resultaten hebben opgelegd, en de varianten die ze hebben afgewezen, voordat we uitkwamen bij de versie die vandaag draait

Gepubliceerd: 12 min read

Lees de casestudy ↗

Een trader vertrouwde ons zijn methode toe zodat wij ze aan een programma konden overdragen. Het resultaat is openbaar: een casestudy beschrijft de gekozen regels, de cijfers van twintig jaar simulatie en het bericht dat elke avond na de sluiting van New York vertrekt. Dit artikel vertelt de andere helft van het werk, de helft die niet wordt getoond. Tussen het eerste resultaat, dat er in een paar dagen was, en het resultaat dat we hebben willen publiceren, hebben we bijna niets toegevoegd: we hebben vooral weggehaald.

Wat hapert, is niet de methode maar de toepassing ervan

De klant is ervan overtuigd dat zijn methode werkt wanneer hij ze consequent volgt. Ons werk bestond er niet in die overtuiging voor waar aan te nemen, maar ze om te zetten in regels en die regels op de proef te stellen. Het probleem waarmee hij bij ons kwam, ligt elders. Op een avond waarop de koersen dalen, na een slechte week, past niemand een regel toe zoals op een rustige avond. Men wacht een dag langer, men stapt wat te vroeg uit, men slaat een handelsdag over omdat men op verplaatsing is. Daar gaat het rendement verloren.

Een programma kent geen vermoeidheid en geen herinnering aan slechte transacties. Bij dezelfde koersen plaatst het dezelfde order, of de week nu goed of slecht was. Voor dit project was dat het voordeel dat het zwaarst woog.

Wel moet het te horen krijgen wat het moet doen in de situaties die de trader op zijn gevoel afhandelt, zonder ze zelfs op te merken: twee voorwaarden die elkaar op dezelfde avond tegenspreken, een aandeel dat hij al bezit en dat uit de selectie valt, een openingskoers die ver af ligt van de slotkoers waarop de beslissing is genomen. Het gaat er niet om de methode aan te vullen, maar om op te schrijven wat de bedenker ervan al doet.

Illustratief scenario. Dinsdag, 22 uur. De Amerikaanse markt is net lager gesloten. De regel zegt verkopen. De trader bekijkt de grafiek, herinnert zich dat dezelfde configuratie afgelopen voorjaar in drie handelsdagen keerde, en besluit tot donderdag te wachten. Misschien heeft hij die avond gelijk. Of hij heeft ongelijk.

De afbakening bestond er dus in de methode op te schrijven zoals ze wordt toegepast, en ze daarna regel voor regel te laten valideren door wie ze heeft bedacht. Dat is meer optimalisatiewerk dan ontwikkelingswerk, en het lijkt sterk op wat we doen wanneer we een proces meten voordat we het becijferen in een praktijk of een kmo.

Survivorship bias: het eerste cijfer is altijd te mooi

Toen de regels eenmaal op papier stonden, hebben we ze toegepast op de laatste twintig jaar koersen, van december 2005 tot november 2025, met 100.000 dollar bij de start. Die oefening heeft een naam, de backtest: een simulatie van de methode op de koersen van het verleden, alsof ze destijds al had gedraaid.

Het eerste resultaat was uitstekend. Het was ook fout, om een reden die niets op het scherm aangeeft.

De methode kiest haar aandelen uit de honderd waarden van de Nasdaq-100-index en die van de energiesector van de S&P 500, samen ongeveer 120 kandidaten. Die lijst wordt echter voortdurend herzien, en onze eerste versie nam die van 2026 voor alle datums. Ze moet integendeel voor elke gesimuleerde periode worden bijgewerkt, met de samenstelling die de index op dat moment werkelijk had. Zonder dat kiest het programma zijn aandelen alleen uit de bedrijven die lang genoeg succesvol zijn geweest om vandaag nog in de index te staan, wat men de survivorship bias noemt.

We hebben dus de exacte samenstelling van de index op elke datum gereconstrueerd, door de 211 sinds februari 2007 gepubliceerde wijzigingen in omgekeerde volgorde terug te draaien, en daarna de hele simulatie met die lijsten opnieuw uitgevoerd. Figuur 1 toont wat die ene correctie van het resultaat afhaalt.

Twee paren staven die het eindkapitaal na twintig jaar vergelijken, met 100.000 dollar bij de start. De aandelen, gewoon aangehouden: 1,17 miljoen met de lijst van vandaag, oftewel +13,1 % per jaar, tegenover 0,63 miljoen met de per periode bijgewerkte lijsten, oftewel +9,6 % per jaar. De gekozen regel: 1,42 miljoen en +14,2 % per jaar tegenover 0,73 miljoen en +10,5 % per jaar
Figuur 1. Dezelfde methode, dezelfde twintig jaar, dezelfde kosten. Alleen de lijst met waarden waaruit het programma zijn gegevens haalt verandert: eerst vastgezet op die van vandaag, daarna per periode bijgewerkt. Gemeten op de versie van de simulatie die toen in gebruik was en die de mand één keer per jaar vernieuwde; de gekozen versie eindigt hoger, zoals verderop wordt uitgelegd.

Het eindkapitaal wordt aan beide kanten bijna gehalveerd. Het jaarlijkse groeitempo verliest drieënhalf punt, zowel voor de methode als voor de eenvoudigst denkbare vergelijking: dezelfde aandelen, gekocht wanneer de methode ze selecteert en daarna aangehouden, zonder enige uitstapregel.

Die correctie blijft onvolledig, en dat zeggen we tegen de klant op het moment dat we hem de curve laten zien. De koersenleverancier verspreidt de historiek van geschrapte bedrijven niet meer, zodat 57 van de 123 aandelen uit het universum van november 2005 onvindbaar blijven. De gedateerde lijsten kloppen dus voor de bedrijven die laat zijn ingestapt, en missen altijd de bedrijven die eruit zijn gegaan. Daaronder zitten faillissementen en overnames met premie, waarvan het netto-effect onbekend blijft. Dat is een beperking van de simulatie, en ze blijft aanwezig in de cijfers die hier zijn gepubliceerd.

De lijst van de energiesector is daarentegen helemaal niet gereconstrueerd: de simulatie gebruikt haar samenstelling van 2022 voor de hele periode. Dat is een tweede, kleinere bron van dezelfde bias, en ook zij blijft aanwezig in de cijfers die hier zijn gepubliceerd.

Look-ahead bias: hoe voorkomen dat een simulatie de toekomst leest

Er bestaat een nog onopvallender manier om zichzelf te vleien: een berekening ongewild een gegeven laten raadplegen dat op de dag van de beslissing nog niet bestond. Dat sluipt er makkelijk in en is met het blote oog bijna niet te zien, omdat de grafiek geloofwaardig blijft en de curve gewoon iets beter stijgt.

We beschermen ons daartegen met een geautomatiseerde test die bij elke wijziging van de code opnieuw draait en die in twee stappen werkt. Eerst nemen we een koershistoriek en knippen we die in tweeën op een datum in het midden. Vervolgens maken we daarvan een tweede versie, tot die datum volstrekt identiek en erna bewust vervalst: alle latere koersen worden vermenigvuldigd, met tien, met vijfentwintig, met vijftig. Dan laten we het programma zijn indicatoren en zijn beslissingen op beide versies berekenen, en vergelijken we alleen het deel vóór de knip, het deel dat we niet hebben aangeraakt.

Een berekening die alleen het verleden raadpleegt, moet in beide gevallen exact dezelfde waarden opleveren, want het verleden is in beide hetzelfde. Het kleinste verschil betekent dus, zonder andere mogelijke verklaring, dat ze een koers van ná de beslissingsdatum heeft gelezen. De vervalste koersen worden met zulke grote factoren vermenigvuldigd opdat dat verschil, als het bestaat, meteen zichtbaar is in plaats van in de afrondingen te verdwijnen. De test faalt dan, en de wijziging gaat niet in productie. Het project telt 174 tests, die voor elke publicatie van een resultaat opnieuw worden uitgevoerd.

Daar komen twee uitvoeringsregels bij, die de casestudy uitwerkt en die we hier alleen in herinnering brengen: de beslissing wordt op de slotkoers afgelezen maar de order vertrekt bij de opening van de volgende dag, en elke uitvoering betaalt een tiende procent kosten, half commissie, half slippage. Zo houdt de simulatie rekening met de transactiekosten en geeft ze de werkelijke kosten weer.

Een hypothese wordt pas na een simulatie aangehouden

Toen de backtest eenmaal betrouwbaar werd bevonden, hebben we geprobeerd wat vanzelfsprekend leek. De selectie om de drie maanden vernieuwen in plaats van om de zes, om dichter bij de markt te blijven. Twee slotkoersen eisen in plaats van één voordat een positie wordt aangehouden, om valse starts te vermijden. De vijver uitbreiden naar de zorgsector, om niet van technologie alleen af te hangen. Elk aandeel beoordelen ten opzichte van zijn eigen sector, of juist ten opzichte van de hele markt.

Geen van die hypothesen is absurd. Ze kosten allemaal geld, en figuur 2 zegt hoeveel.

Vijf horizontale staven met het verschil in eindkapitaal over twintig jaar tegenover de gekozen versie: behoud dat twee slotkoersen vereist −14,4 %, universum uitgebreid naar de zorgsector −17,9 %, driemaandelijkse rotatie −20,5 %, filter op de sector van elk aandeel −34,1 %, één filter via de S&P 500 −36,4 %
Figuur 2. Vijf varianten gemeten over dezelfde twintig jaar, met dezelfde kosten en dezelfde koop- en verkoopregel. Alleen het genoemde element verandert telkens.

De uitbreiding naar de zorgsector verdient een woord, want ze illustreert de verrassing goed. Spreiden geldt als een voorzorgsmaatregel; hier haalt het 17,9 % van het eindkapitaal af. En hetzelfde experiment, overgedaan op de variant die een hefboomproduct gebruikt, haalt er 66,4 % af en diept de zwaarste terugval uit tot −89 %.

De twee zwaarste verschillen, −34,1 % en −36,4 %, komen van de twee varianten die een filter toevoegen aan de selectie van de aandelen. Het is dus de selectieregel, meer dan de rotatiekalender of de voorwaarden om een positie aan te houden, die het resultaat over deze twintig jaar bepaalt.

Wat er overblijft als alles is weggehaald

Na die opruiming eindigt de gekozen regel de twintig jaar op 1.312.607 dollar, oftewel een tempo van +13,7 % per jaar. Dat cijfer is niet dat van figuur 1: de correctie van de survivorship bias is gemeten op de versie van de simulatie die toen in gebruik was, die de mand één keer per jaar vernieuwde en elk jaar opnieuw vanuit cash begon. De gekozen versie, die waarmee de varianten van figuur 2 worden vergeleken, vernieuwt de mand om de zes maanden en houdt de posities aan waarvan de trend nog standhoudt, en het is dat aanhouden dat het eindkapitaal optilt. Diezelfde aandelen aanhouden zonder enige uitstapregel zou +12,4 % per jaar hebben opgeleverd over dezelfde periode en met dezelfde kosten. Het verschil bedraagt dus ongeveer een kwart kapitaal na twintig jaar. Dat is weinig, en het volstaat niet om het schrijven van een programma te rechtvaardigen. De portefeuille bevat maar vijf aandelen tegelijk: één ander aandeel in één enkele mand kan het eindkapitaal in dezelfde orde van grootte verschuiven. Dat verschil kan dus even goed van de methode als van het toeval komen, en dat zeggen we tegen de klant.

De echte winst van de methode ligt elders: ze vermindert het risico. Door posities te verlaten wanneer de markt keert, bespaart ze de portefeuille de hevigste dalingen. De zwaarste terugval tussen een top en het dal dat erop volgt — vakmensen spreken van drawdown — gaat van −72 % voor diezelfde aandelen zonder uitstapregel naar −40 % voor de gekozen regel. Het kapitaal legt dus een merkelijk vlakker parcours af, bij een bijna identiek rendement. Dat is wat de sharperatio samenvat, die het rendement afzet tegen de schokken die nodig waren om het te behalen: hij stijgt van 0,55 naar 0,67.

Die afvlakking heeft een rechtstreeks gevolg voor de hefboom. Hefboomproducten, zoals turbo’s en certificaten, verliezen hun volledige waarde zodra de koers een bij de uitgifte vastgelegde drempel raakt. Hoe groter de schommelingen van de portefeuille, hoe meer kans dat die drempel wordt bereikt, en hoe sneller. Een strategie die de dalingen beperkt, maakt het dus mogelijk om deze producten te overwegen zonder dat ze bij de eerste schok worden uitgeschakeld.

We hebben die variant gemeten. Ze zet de volledige portefeuille op een certificaat met hefboom drie, uitgegeven door een bank, dat zowel de stijging als de daling met drie vermenigvuldigt. Ze eindigt op 5,7 miljoen dollar, oftewel +22,4 % per jaar, vier keer beter dan de regel zonder hefboom. Maar haar zwaarste terugval bereikt −79 % en haar sharperatio zakt terug naar 0,64: de hefboom versterkt de gevolgen van de signalen, hij verbetert de kwaliteit ervan niet. Een curve die hoger eindigt nadat ze door −79 % is gegaan, houdt geen stand, omdat niemand ze tot het einde volgt.

Wat de klant uiteindelijk krijgt

De ingebruikname is het eenvoudigste deel, zodra de rest achter de rug is. Een server voert elke avond een geplande taak uit die de koersen na de sluiting van New York downloadt, alle berekeningen vanaf de eerste dag opnieuw uitvoert, een reeks controles doorloopt en een bericht verstuurt met een verdict: kopen, verkopen of niets doen. De klant programmeert zijn orders de volgende ochtend, voor de opening.

Daarbij krijgt hij de code, de resultaatbestanden en wat nodig is om elke berekening op zijn eigen machine over te doen, zonder ons, en dat deel telt evenveel als de rest. De exacte waarden die zijn strategie instellen, zijn van hem, en ze worden nergens gepubliceerd: de gepubliceerde casestudy beschrijft de aanpak en geeft de rendementscijfers.

Het doorgeven van de orders is in zijn handen gebleven omdat hij daaraan hecht. Ook dat kan worden geautomatiseerd en rechtstreeks naar de makelaar vertrekken, zodra die een interface aanbiedt om ze te ontvangen.

Dezelfde aanpak buiten de beurs

Niets van wat voorafgaat, is eigen aan de beurs. Drie fases keren terug zodra een beslissing regelmatig terugkomt en steunt op regels die iemand kent zonder ze altijd toe te passen: de regel volledig uitschrijven, eerlijk meten wat ze oplevert, en de uitvoering ervan daarna aan een programma toevertrouwen. De beslissing blijft die van de klant: het is zijn regel, hij wijzigt ze wanneer hij wil, en hij ziet elke dag wat het programma heeft gedaan. Wat de automatisering toevoegt, is een betrouwbare toepassing, een permanente opvolging en, op de beurs, minder onvoorspelbaarheid. Wij volgen precies dat verloop om een bedrijfsproces te automatiseren, en dat is ook wat onze methodepagina beschrijft.

Het eerste cijfer van een project is bijna altijd vleiend, omdat het is behaald in de gunstigste omstandigheden, die waarin men het antwoord al kent. Het werk begint wanneer men het probeert onderuit te halen.

Als u een methode met de hand toepast en ze aan een programma zou willen toevertrouwen, op de beurs of elders, volstaat een gesprek van 30 minuten meestal om te weten of ze codeerbaar is en wat er gemeten zou moeten worden voordat u zich engageert. Schrijf ons onderaan deze pagina of boek meteen een moment in onze agenda.

Alle cijfers in dit artikel komen uit simulaties op koersen uit het verleden en niet uit een historiek van werkelijk uitgevoerde orders. Wij sturen geen enkele order door naar een makelaar, en niets van wat voorafgaat, vormt beleggingsadvies.

Veelgestelde vragen

Welke voorzorgen maken een handelssimulatie betrouwbaar?

Vier voorzorgen, en ze zijn stuk voor stuk te controleren. Het programma leest zijn regel af op de slotkoers en koopt pas bij de opening van de volgende dag, nooit tegen de koers die het signaal heeft voortgebracht. Elke uitvoering betaalt haar kosten, een tiende procent bij aankoop zoals bij verkoop. Het geteste universum is de lijst die de Nasdaq-100 op de testdatum had, en niet die van vandaag; alleen de lijst van de energiesector blijft vastgezet op haar samenstelling van 2022. Ten slotte wijzigt een automatische test alle koersen na een bepaalde datum en eist hij dat de eerdere beslissingen geen jota veranderen, wat bewijst dat geen enkele berekening vooruitkijkt.

Wat moet u ons geven om te beginnen?

Uw methode zoals u ze toepast, zonder ze eerst in het net te moeten schrijven. Een deel ervan regelt u op uw gevoel, zoals iedereen, en u hebt geen enkele reden om die gevallen al te hebben geformuleerd. Ons afbakeningswerk bestaat er juist in de vragen te stellen waarvan het antwoord vandaag impliciet is: op welke koers het signaal wordt afgelezen, op welk moment van de handelsdag, welk deel van het kapitaal naar elke positie gaat, en wat te doen wanneer twee voorwaarden elkaar tegenspreken. Eén vergadering volstaat doorgaans om te weten of de methode codeerbaar is.

Van wie zijn de code, de gegevens en de resultaten?

Van de klant. Hij krijgt het programma, de resultaatbestanden en wat nodig is om elke berekening op zijn eigen machine over te doen, zonder ons. De exacte drempels van zijn methode zijn eveneens van hem: de gepubliceerde casestudy beschrijft de aanpak en de rendementscijfers, nooit de waarden waarmee de motor te reconstrueren zou zijn.

Kunnen de orders rechtstreeks naar de makelaar vertrekken?

Ja, zodra de makelaar een interface aanbiedt om ze te ontvangen. In dit project is het doorgeven van de orders in handen van de klant gebleven: dat is zijn keuze, hij houdt eraan die laatste handeling zelf te stellen. Het programma stuurt hem elke avond een bericht met de orders die hij moet programmeren, en hij voert ze de volgende ochtend in, voor de opening.

Werken jullie alleen met Amerikaanse aandelen?

Nee. De motor is niet aan één markt gebonden: hij past regels toe op reeksen koersen. De echte beperking is de beschikbaarheid van de historiek, want een methode valt niet te beoordelen zonder een verleden dat lang genoeg en zuiver genoeg is om ze op de proef te stellen. Het is die beschikbaarheid die moet worden nagegaan voordat men zich op een bepaalde markt vastlegt, niet het vermogen van het programma om die markt te verwerken.

Is dit beleggingsadvies?

Nee, ondubbelzinnig niet. Wij zijn een softwareontwikkelingsbedrijf: wij coderen de methode die de klant ons toevertrouwt, wij meten ze en wij voeren ze uit. Wij bevelen geen enkele strategie, geen enkel aandeel en geen enkel product aan, en de gepubliceerde cijfers komen uit simulaties, niet uit een historiek van werkelijk uitgevoerde orders.

Wat is survivorship bias in een backtest van een handelsstrategie?

Survivorship bias ontstaat wanneer een simulatie haar aandelen kiest uit de lijst die een index vandaag heeft, en niet uit de lijst die hij op elke datum in het verleden had. De bedrijven die onderweg failliet gingen of uit de index werden gehaald, ontbreken, zodat het programma alleen kiest uit de bedrijven die lang genoeg succesvol waren om er vandaag nog in te staan, en het resultaat wordt gevleid. De remedie bestaat erin de samenstelling van de index op elke datum te reconstrueren en de simulatie opnieuw uit te voeren met die gedateerde lijsten. In deze studie haalde die ene correctie drieënhalf punt van het jaarrendement af, zowel voor de methode als voor dezelfde aandelen zonder uitstapregel.

Wat is look-ahead bias in algoritmisch handelen?

Look-ahead bias is een berekening die ongewild een koers leest van ná de datum van de beslissing die ze hoort te nemen. Ze is met het blote oog niet te zien: de grafiek blijft geloofwaardig en de curve stijgt gewoon iets beter. We vangen ze op met een geautomatiseerde test die een koershistoriek op een datum in het midden doorknipt, alle latere koersen met een grote factor vermenigvuldigt en eist dat de beslissingen van vóór de knip in beide versies strikt identiek zijn. Een berekening die alleen het verleden raadpleegt, geeft in beide gevallen dezelfde waarden, zodat het kleinste verschil bewijst dat ze vooruit heeft gekeken, en de wijziging gaat niet in productie.

Klaar om uw processen te automatiseren?

Laten we uw behoeften bespreken en kijken hoe transtorm.ai kan helpen