Een dataset voorbereiden voor machine learning met Pandas
Stel je voor: je hebt een briljant idee voor een algoritmische handelsbot.
Je Python-script staat klaar, je broker-API is ingesteld op bijvoorbeeld Interactive Brokers of Binance, en je bent klaar om te handelen. Maar dan? Waar haal je de data vandaan om je idee te testen zonder meteen €5000 te verliezen? Hier komt Pandas om de hoek kijken, de onmisbare tool voor elke quant. Deze gids leert je hoe je een dataset voorbereidt, zodat je bot niet blind de markt in sprint.
Wat is een dataset eigenlijk?
Een dataset is simpelweg een verzameling informatie die je aan je machine learning-model voedt. In de wereld van algoritmische trading gaat het meestal om tijdreeksdata: de prijs van een aandeel of crypto over tijd.
Je wilt niet zomaar een CSV-tje laden; je wilt weten wat er speelt. Stel je voor dat je €10.000 inzet op de S&P 500, dan moet je weten hoe die prijs zich de afgelopen jaren heeft gedragen. Zonder goede data is je bot net als een auto zonder benzine: hij beweegt geen meter.
Met Pandas maak je deze data begrijpelijk en klaar voor gebruik. Waarom is dit zo cruciaal?
Omdat elke fout in je dataset direct terugkomt in je backtesting-resultaten. Je bot kan in theorie €2000 winst per maand beloven, maar als je data vol gaten zit, misleid je jezelf. Denk aan een API-call naar je broker die maar elke 5 minuten data ophaalt in plaats van elke seconde; je mist pieken en dalen. Goede voorbereiding voorkomt dat je meteen €500 verliest zodra de live-markt anders reageert. Het is de basis voor elk risicomanagementplan.
De kern: data laden en schoonmaken met Pandas
Laten we beginnen met de praktijk. Je downloadt meestal data via een broker-API, zoals die van Plus500 of eToro, of haalt het uit een CSV van Yahoo Finance. Stel je hebt een bestand met de openings-, sluitings-, hoogste- en laagste prijzen (OHLC) voor Bitcoin over 30 dagen.
Met Pandas laad je dit in één regel code: df = pd.read_csv('btc_data.csv').
Meteen zie je de eerste rijen, de kolomnamen en of er missende waarden zijn. Dit is je startpunt.
De volgende stap is schoonmaken. Controleer op null-waarden; die ontstaan vaak als de API tijdelijk down is. Gebruik df.dropna() om rijen met gaten te verwijderen, of vul ze met de vorige waarde via df.fillna(method='ffill').
Voor een bot die elke seconde handelt, is precisie key: een enkele null-waarde kan je stop-loss trigger verstoren.
Check ook de datums; zorg dat ze als datetime-objecten staan, niet als strings, voor tijdreeksanalyse. Verwijder outliers, zoals een prijspiek door een bug in de API, om je model niet te misleiden. Een concrete tip: voor risicomanagement voeg je een kolom toe voor het volume. Stel je bot handelt in aandelen van Apple met €100 per trade; laag volume betekent hoger risico op slip-ups.
Met Pandas bereken je dit eenvoudig: df['volume_ma'] = df['volume'].rolling(window=20).mean(). Zo krijg je een 20-dagen gemiddelde, wat helpt bij het filteren van onbetrouwbare data. Dit maakt je dataset robuust voor backtesting op platforms als Backtrader of QuantConnect.
Feature engineering: maak je data slimmer
Nu de data schoon is, bouw je features—extra variabelen die je model helpen voorspellen. In trading draait alles om indicatoren die patronen ontdekken via Machine Learning voor Trading.
Voeg bijvoorbeeld een simple moving average (SMA) toe voor de prijs: df['SMA_50'] = df['close'].rolling(window=50).mean(). Dit helpt je bot te zien of de trend opwaarts is, vooral voor daghandel in crypto zoals Ethereum, waar prijzen snel schommelen tussen €2000 en €3000. Voor een backtest op 1 jaar data kost dit weinig rekenkracht, maar je wint inzicht.
Een andere essentiële feature is de RSI (Relative Strength Index), die overbought- of oversold-situaties aangeeft.
Gebruik een library als TA-Lib (€0, open-source) om dit te berekenen: from talib import RSI; df['RSI'] = RSI(df['close'], timeperiod=14). Stel je bot handelt op de DAX-index; een RSI boven 70 betekent verkoopdruk, wat je risico op verlies verkleint. Varieer de parameters: voor scalping (snelle trades) gebruik je een kortere window, voor swing trading een langere. Experimenteer met prijsindicaties zoals een 50-dagen SMA die boven de 200-dagen uitkomt—een klassiek koopsignaal voor aandelen.
Denk aan varianten: voor momentum-trading voeg je de MACD toe, die snelle en langzame bewegingen combineert. In Python: from talib import MACD; df['MACD'], df['signal'], _ = MACD(df['close']).
Dit model werkt goed voor brokers zoals IG Markets, waar je met hefboom tot 1:30 handelt—maar pas op, hefboom verhoogt het risico. Test verschillende modellen: een eenvoudig SMA-crossover versus een ML-model met LSTM (lange korte-termijngeheugen) voor diepgaande patronen. Voor een dataset van 10.000 rijen (bijv. 1 jaar uurlijkse data) betaal je niets extra, maar voor premium data van Refinitiv (€100-€500 per maand) krijg je fijnere granulariteit.
Split je data voor trainen en testen
Zodra je features klaar zijn voor machine learning, deel je de dataset op in trainings- en testsets. Dit voorkomt dat je bot 'vals speelt' door toekomstige data te gebruiken.
Gebruik Pandas voor een tijdgestuurde split: train_size = int(len(df) * 0.8); train = df[:train_size]; test = df[train_size:]. Voor een dataset van 5000 trades (bijv. 2 jaar EUR/USD data) neemt dit maar een seconde tijd.
Je traint je model op de trainset, test op de testset, en als de resultaten goed zijn, kun je je getrainde model opslaan voor live trading zonder overfitting.
Voeg een extra laag toe voor risicomanagement: normaliseer je features met MinMaxScaler van Scikit-learn (€0, gratis). Dit zet prijzen tussen 0 en 1, zodat je bot niet wordt beïnvloed door de enorme schaalverschillen tussen een aandeel van €50 en crypto van €30.000. Voor backtesting op platforms als Quantopian (nu gratis alternatieven), test je op out-of-sample data: gebruik de laatste 20% van je dataset voor echte validatie. Zo voorkom je dat je bot faalt zodra de markt draait.
Praktisch voorbeeld: voor een bot die handelt op de NASDAQ via Interactive Brokers API (€0 per transactie voor data), laad je 5 jaar data (ongeveer 1 miljoen rijen). Met Pandas filter je op handelsuren, want na-uren geven rare spikes.
Splits 70/30, en je hebt een stevige basis voor machine learning. Vergeet niet de seed voor reproduceerbaarheid: np.random.seed(42) zodat je results consistent zijn.
Praktische tips voor dagelijks gebruik
Eerste tip: begin klein. Download gratis data van Yahoo Finance via Pandas Datareader—geen kosten, ideaal voor beginners.
Test je pipeline op een enkele asset, zoals Bitcoin, voordat je uitbreidt naar een portfolio van 10 aandelen.
Dit bespaart tijd en voorkomt frustratie; je ziet snel of je dataset klopt. Tweede tip: documenteer elke stap. Schrijf in een Jupyter Notebook wat je doet, zodat je later terug kunt kijken.
Gebruik comments in je code voor de API-keys van je broker—nooit delen! Voor risicomanagement, voeg altijd een stop-loss kolom toe: df['stop_loss'] = df['close'] * 0.95 (5% onder de instapprijs).
Dit helpt bij het beheren van je €10.000 kapitaal. Derde tip: monitor je data-kwaliteit. Controleer wekelijks op nieuwe API-updates van je broker, zoals Binance die hun endpoints wijzigt. Voor premium datasets, budget €50-€200 per maand voor toegang tot historische tick-data.
Tot slot, experimenteer altijd: pas je features aan voor specifieke strategieën, zoals mean-reversion voor rustige markten.
Zo bouw je een bot die echt werkt, niet alleen op papier.
