SQL query's schrijven voor het filteren van historische koersdata

Portret van Alex de Vries, Quantitatief Analist & Algo-Trading Expert
Alex de Vries
Quantitatief Analist & Algo-Trading Expert
Python Libraries voor Algoritmische Trading · 2026-02-15 · 8 min leestijd

Stel je voor: je hebt een prachtige trading bot geschreven in Python, je backtesten zien er veelbelovend uit, maar je historische data is een chaos.

Duizenden rijen, onnodige kolommen, data van een broker die je niet gebruikt. Je bot loopt vast of, erger, neemt verkeerde beslissingen omdat de data niet klopt.

Dit is het moment waarop SQL je redder wordt. Je hoeft niet alles in Python te verwerken; je kunt slim filteren voordat de data je script überhaupt binnenkomt. Het voelt als een opgeruimd kantoor: alles staat op de juiste plek, en je bot kan direct aan de slag.

Waarom SQL onmisbaar is voor je trading setup

SQL (Structured Query Language) is de taal die je gebruikt om met databases te praten. In de wereld van algoritmische trading draait het om snelheid en precisie.

Je broker, zoals Interactive Brokers of Alpaca, levert gigabytes aan historische data via hun API. Maar je bot heeft niet alles nodig. Misschien zoek je alleen de koersdata van het aandeel Apple (AAPL) van de afgelopen 30 dagen, of wil je weten welke trades een winst van meer dan 2% hebben opgeleverd.

Zonder SQL zou je al die data in Python laden en dan met loops en filters aan de slag gaan.

Dat werkt, maar het is traag en geheugenintensief. SQL filtert de data direct in de database, wat veel efficiënter is. Stel je voor: je hebt een dataset van 10 GB aan tick-data.

In Python duurt het laden en filteren misschien 10 minuten. Met een simpele SQL-query ben je binnen seconden klaar.

Dat scheelt tijd, geld (geen dure cloud-rekenuren) en frustratie. Bovendien houdt SQL je code schoon.

In plaats van 50 regels Python-code om data te selecteren, schrijf je één query. Dit maakt je backtesting en risicomanagement overzichtelijker. Je kunt query's opslaan en hergebruiken voor verschillende strategieën, of je nu werkt met een eenvoudige moving average crossover of een complexe machine learning bot.

De basis: hoe schrijf je een filterende SQL-query?

Laten we beginnen met een concreet voorbeeld. Stel, je hebt een database met historische koersdata van je broker, opgeslagen in een tabel genaamd historical_prices.

De tabel heeft kolommen zoals symbol (bijv. 'AAPL'), date, open, high, low, close, en volume. Je wilt de koersdata van AAPL voor de afgelopen 30 dagen, gesorteerd op datum.

De query ziet er zo uit: Leg dit even uit.

De SELECT-regel haalt de kolommen op die je nodig hebt: datum en prijsinformatie. De FROM-regel wijst naar je tabel. De WHERE-regel is de filter: alleen rijen waar het symbool 'AAPL' is én de datum van de afgelopen 30 dagen. De ORDER BY-regel sorteert de resultaten oplopend op datum, zodat je tijdreeks netjes op volgorde staat.

SELECT date, open, high, low, close, volume
FROM historical_prices
WHERE symbol = 'AAPL' AND date >= DATE_SUB(CURDATE(), INTERVAL 30 DAY)
ORDER BY date ASC;

Dit werkt met MySQL, PostgreSQL, of SQLite – allemaal databases die je lokaal kunt draaien voor je backtesting. Waarom is dit handig?

Je bot krijgt alleen de data die het echt gebruikt. Geen rommel, geen overbodige rijen. Als je een backtest draait met een broker zoals Degiro of eToro (via hun API's), kun je deze query aanpassen om alleen de data te selecteren die je broker levert.

Test het eerst met een kleine dataset, bijvoorbeeld 100 rijen, om te zien of de output klopt.

Gebruik een tool zoals DBeaver of SQLiteStudio om je queries te testen zonder code te schrijven.

Geavanceerde filters: tijdreeksen, volumes en technische indicatoren

Nu je de basis kent, laten we het interessanter maken. Je bot heeft waarschijnlijk meer nodig dan alleen koersdata.

Misschien wil je filteren op volume (om illiquide aandelen te vermijden) of een specifieke tijdreeks voor een intraday-strategie. SQL maakt dit eenvoudig. Stel je wilt AAPL-data van de afgelopen week, maar alleen tijdens handelsuren (bijv.

SELECT date, open, high, low, close, volume
FROM historical_prices
WHERE symbol = 'AAPL'
AND date >= DATE_SUB(CURDATE(), INTERVAL 7 DAY)
AND HOUR(date) BETWEEN 9 AND 16
ORDER BY date ASC;

9:30 tot 16:00 EST). Een query hiervoor zou zo kunnen uitzien:

Hier voegen we een tijdfilter toe met HOUR(), wat in MySQL werkt. Voor andere databases pas je dit aan (bijv. met EXTRACT in PostgreSQL). Dit filtert automatisch de nachtelijke uren eruit, ideaal voor daghandel-bots die alleen markturen bekijken.

SELECT date, open, high, low, close, volume
FROM historical_prices
WHERE symbol = 'AAPL' AND volume > 1000000
ORDER BY date ASC;

Je bespaart tijd en voorkomt ruis in je data. Een andere variant: filteren op volume.

SELECT date, close,
AVG(close) OVER (ORDER BY date ROWS BETWEEN 19 PRECEDING AND CURRENT ROW) AS sma20
FROM historical_prices
WHERE symbol = 'AAPL' AND date >= '2023-01-01'
ORDER BY date ASC;

Stel, je wilt alleen dagen waarop het volume boven een drempel zit, bijvoorbeeld meer dan 1 miljoen aandelen, om te zorgen dat je bot niet in illiquide aandelen handelt. De query wordt:

Voor technische indicaties, zoals een simple moving average (SMA), kun je SQL gebruiken om de data voor te bereiden voordat je Python in duikt. Bijvoorbeeld, een 20-daagse SMA berekenen in SQL (als je database die functie ondersteunt, zoals PostgreSQL met window-functions): Dit geeft je direct een dataset met de SMA, klaar voor je bot. Prijzen voor data-opslag? Een lokaal SQLite-bestand is gratis, maar voor grotere datasets kijk je naar cloud-databases zoals AWS RDS (vanaf €50/maand) of Google Cloud SQL (vanaf €30/maand). Benieuwd naar wat een professionele Python data-feed kost? Kies wat bij je budget past – voor kleine bots volstaat lokaal opslaan.

Varianten voor verschillende trading strategieën

Niet elke strategie heeft dezelfde data nodig. Voor een momentum-bot die inspeelt op prijsstijgingen, filter je op dagen met een positieve return.

SELECT date, open, close,
((close - open) / open) * 100 AS return_pct
FROM historical_prices
WHERE symbol = 'AAPL'
AND ((close - open) / open) * 100 > 2
ORDER BY date ASC;

Voor een mean-reversion-bot kijk je naar uitschieters. SQL helpt je deze varianten snel te bouwen. Neem een momentum-strategie: je wilt dagen waarop de close-prijs meer dan 2% hoger is dan de open-prijs.

SELECT date, open, low, close
FROM historical_prices
WHERE symbol = 'AAPL'
AND ((low - open) / open) * 100 > -5
ORDER BY date ASC;

Deze query berekent direct de return en filtert op >2%. Je bot kan hiermee direct backtesten op momentum-signalen.

Voor een risicomanagement-focus, voeg je filters toe voor stop-loss niveaus. Stel, je wilt alleen dagen waarop de low-prijs niet meer dan 5% onder de open ligt (om extreme verliezen te vermijden):

Dit helpt bij het bouwen van bots die risico's beperken, zoals die van brokers als Plus500 of TradeStation, waar je API-toegang hebt voor real-time data. Voor prijsindicaties: als je een bot bouwt die inspeelt op support/resistance, filter je data op basis van historische highs en lows. Bijvoorbeeld, dagen waarop de high boven een voorgaande weerstandslijn ligt. Pas de query aan met subqueries of joins voor complexere patronen.

SELECT symbol, date, close
FROM historical_prices
WHERE symbol IN ('AAPL', 'TSLA', 'MSFT') AND date >= '2024-01-01'
ORDER BY symbol, date ASC;

Experimenteer met prijzen: een backtest op 1 jaar data kost je niets extra, maar een live API-call bij je broker kan €0,01 per transactie zijn – houd dat in de gaten. Een andere variant voor portefeuillebeheer: als je meerdere aandelen in je bot verwerkt, gebruik je een IN-clausule.

Bijvoorbeeld, data voor AAPL, TSLA en MSFT: Dit is perfect voor diversificatie in je algoritmische setup. Je kunt deze query's opslaan in een script en aanroepen vanuit Python met libraries zoals sqlite3 of SQLAlchemy. Zo blijft je workflow soepel.

Praktische tips voor SQL in je trading workflow

Begin klein: installeer een lichte database zoals SQLite (gratis) en een SQLite database koppelen aan je Python trading bot is de volgende logische stap. Laad er een CSV met koersdata in via een tool als DB Browser for SQLite, schrijf je eerste query en kijk hoe snel die loopt.

Gebruik geen generieke voorbeelden; pas elke query toe op je eigen data van je broker. Bijvoorbeeld, als je bij Interactive Brokers API haalt, exporteer dan eerst een CSV en laad die in. Test altijd met een subset van data.

Voeg een LIMIT 100 toe aan je query om te zien of de output klopt, voordat je de volledige dataset draait.

Voor performance: gebruik indexes op kolommen zoals symbol en date. In SQLite voeg je een index toe met: CREATE INDEX idx_symbol_date ON historical_prices(symbol, date); Dit versnelt queries met 80-90% bij grote datasets. Combineer SQL met Python: gebruik onze gids voor SQLAlchemy om koersdata op te slaan en laad de resultaten direct in een DataFrame voor je bot.

Voor risicomanagement, sla je query-resultaten op in aparte tabellen, zoals 'filtered_data', om ze te vergelijken met ruwe data. Budgettip: voor lokaal gebruik kost een Raspberry Pi als server €50-100, genoeg voor een kleine backtesting-omgeving.

Als je schaalt, kijk naar cloud-databases vanaf €20/maand. Voorkom fouten: dubbele data door onjuiste joins, of verkeerde datums door tijdzones.

Test altijd met echte data van je broker, en houd rekening met kosten voor API-calls (bijv. €0,005 per stuk bij sommige brokers). Tot slot, documenteer je query's in een notitieboek of Git-repo – je toekomstige zelf zal je dankbaar zijn. Zo blijft je trading bot scherp en je data op orde.

Portret van Alex de Vries, Quantitatief Analist & Algo-Trading Expert
Over Alex de Vries

Alex is een ervaren quantitatief analist en Python-ontwikkelaar die complexe trading concepten vertaalt naar begrijpelijke, praktische handleidingen voor zowel beginners als gevorderden.

Volgende stap
Bekijk alle artikelen over Python Libraries voor Algoritmische Trading
Ga naar overzicht →