Moving Average Crossover: De klassieke strategie geprogrammeerd in Python
Je kent het wel: die eindeloze grafieken en de hoop dat je het juiste moment vindt om in te stappen. De Moving Average Crossover is een van de oudste en meest vertrouwde methodes om orde te scheppen in die chaos.
Het is de strategie die elke beginner tegenkomt en elke professional respecteert. In deze gids bouwen we die klassieker op vanuit het niets met Python, zodat je hem zelf kunt testen, verfijnen en inzetten.
Wat is een Moving Average Crossover?
Een Moving Average Crossover draait om twee lijnen op je grafiek: een snelle en een langzame. De snelle lijn (bijvoorbeeld over 50 dagen) reageert snel op prijsveranderingen.
De langzame lijn (bijvoorbeeld over 200 dagen) volgt de algemene trend op een rustiger tempo. Het moment dat de snelle lijn de langzame lijn kruist, is je signaal. Kruist de snelle lijn van onder naar boven?
Dat is een koopsignaal (een 'gouden kruis'). Kruist hij van boven naar onder?
Dan is het tijd om te verkopen of short te gaan (een 'dood kruis'). Het doel is simpel: je wilt meer winnen in een opwaartse trend dan dat je verliest in een neerwaartse trend. Je probeert de grootste bewegingen te pakken en de ergste crashes te vermijden. Het klinkt simpel, maar de uitvoering is alles.
De kern van de strategie: ramen en regels
De keuze van je ramen (windows) bepaalt het karakter van je strategie.
Ga je voor kort (10/30 dagen) of lang (100/400 dagen)? Kort reageert snel, maar geeft meer vals signalen. Lang is traag, maar vangt de grote trends. Voor een robuuste test kijken we vaak naar de klassieke combinatie van 100 en 400 dagen.
De regels zijn helder. Als de 100-daagse Moving Average de 400-daagse kruist naar boven, open je een long positie.
Als hij de 400-daagse kruist naar beneden, sluit je je positie of ga je short.
Je volgt blind de kruising, zonder emotie. Dat is de basis van algoritmisch traden. Om dit te testen, heb je data nodig.
Denk aan een broker zoals Interactive Brokers of een data-provider als Polygon. Je wilt 'historische prijsdata' op 'close-to-close' basis. Dit betekent dat je trade op basis van de slotkoers van de dag, wat de meest betrouwbare methode is voor een eerste backtest.
De code: van idee naar Python-bot
Laten we aan de slag gaan. We gaan een script schrijven dat een backtest uitvoert.
We gebruiken de data van Apple (AAPL) uit de QuantStart-studie, die liep van 1990 tot 2002.
Je start met een kapitaal van €100.000. We berekenen de gemiddelde lijnen en bepalen wanneer we in en uit stappen. Als je zelf een Bollinger Bands Mean Reversion bot wilt bouwen, ziet een simpele implementatie in Python met Pandas er ongeveer zo uit:
import pandas as pd
import numpy as np
# Stel de data in (bijv. vanuit een CSV van je broker)
data['SMA_100'] = data['Close'].rolling(window=100).mean()
data['SMA_400'] = data['Close'].rolling(window=400).mean()
# Genereer signalen
data['Signal'] = 0
data['Signal'][100:] = np.where(data['SMA_100'][100:] > data['SMA_400'][100:], 1, 0)
data['Position'] = data['Signal'].diff()
Dit stukje code berekent de kruising. De 'Position' vertelt je of je moet kopen (1) of verkopen (-1).
Dit is de basis voor je 'execution engine'. De volgende stap is dit koppelen aan een API van een broker, zodat je bijvoorbeeld de carry trade strategie kunt automatiseren. Voor nu is het essentieel om de logica eerst perfect te krijgen.
Backtesting en validatie
Hier gaat het vaak mis. Je bouwt een strategie, test hem en denkt: "Ik ben rijk!".
Maar heb je de resultaten gevalideerd? Een veelgemaakte fout is het niet vergelijken met bekende implementaties. Gebruik tools zoals Zipline om je eigen code te controleren.
Zipline is een open-source backtest-framework dat gebruikt wordt door professionals. De QuantStart-studie toonde aan dat een 100/400 SMA crossover op AAPL (1990-2002) winstgevend was, maar ook flink schommelde. Wil je weten hoe je statistische arbitrage toepast met de Z-score?
De 'drawdown' (het maximale verlies vanaf een piek) kan oplopen tot 40% of meer.
Dit betekent dat je risicomanagement cruciaal is. Je moet weten dat je op een gegeven moment 40% van je inleg kunt verliezen voordat de trend herstelt. Een praktische tip: begin met een 'paper trading' account bij je broker. Dit is een oefenaccount met nepgeld, maar echte marktprijzen.
Zo test je je Python-script en je API-connectie zonder echt geld te riskeren. Pas als je consistent winstgevend bent op papier, stap je over naar een live account.
Variëren op het thema
De SMA (Simple Moving Average) is traag. Hij geeft elk punt in het verleden even veel gewicht.
De EMA (Exponential Moving Average) is slimmer: hij geeft recente prijzen meer gewicht. Een EMA crossover-systeem reageert sneller op marktveranderingen. Dit kan je winst verhogen in snelle markten, maar het zorgt ook voor meer 'whipsaws' (vals signalen).
Een andere variatie is de 'Golden Cross' combinatie. Dit is vaak de 50-daagse SMA die de 200-daagse SMA kruist.
Dit is een standaard signaal voor institutionele beleggers. Als je deze trade, zit je vaak in dezelfde richting als de grote fondsen.
Je kunt ook filters toevoegen. Handel alleen als het volume boven een bepaalde grens zit (bijvoorbeeld 1.5x het gemiddelde volume). Of voeg een derde moving average toe als bevestiging. Zo bouw je je eigen 'stack' van regels, waardoor je bot minder fouten maakt.
Praktische tips voor je Python-bot
Als je je bot live zet, zorg dan dat je 'error handling' op orde is.
Wat doet je bot als de internetverbinding wegvalt tijdens een order? Of als de broker-API even down is? Je moet 'fail-safes' inbouwen, zoals een maximum bedrag per trade en een stop-loss die lokaal op je server draait, niet alleen bij de broker.
Hou rekening met kosten. Een broker als Interactive Brokers rekent ongeveer $0,005 per aandeel, met een minimum van $1 per transactie.
Als je vaak kleine bedragen trade, vreten deze kosten je winst op.
Zorg dat je backtest deze kosten meeneemt, anders klopt je werkelijke resultaat niet. Start klein. Programmeer eerst een bot die alleen AAPL trade met de 100/400 SMA crossover. Laat hem een week draaien op een virtuele rekening.
Kijk wat er gebeurt. Schrijf logboeken. Pas daarna breid je uit naar andere aandelen of andere strategieen. De markt is er altijd, je hoeft niet vandaag alles te winnen.
