Te veel features gebruiken (The Curse of Dimensionality)
Je zit laatst te pielen met een trading bot in Python. Je hebt een gave strategie gebouwd, je API van Interactive Brokers of Alpaca staat klaar, en je backtests op Historical Data van de afgelopen 3 jaar draaien als een zonnetje.
Je gooit er 50, misschien wel 100 verschillende features tegelijk in: RSI, MACD, Bollinger Bands, ADX, VIX, moving averages van elke denkbare lengte, volume profiles, en weet ik het wat allemaal. Het resultaat? Je backtest schiet door het dak met een return van 300% en een Sharpe ratio die je zelden ziet. Maar zodra je live gaat met een bedrag van €5.000, stort je bot ineen en verliest hij klauwen met geld.
Wat is er misgegaan? Welkom bij de vloek van de dimensionaliteit, oftewel: te veel features gebruiken.
Wat is de vloek van de dimensionaliteit eigenlijk?
Stel je voor dat je op een verlaten parkeerplaats staat en je moet een auto vinden. Als je weet dat ie rood is, hoef je alleen maar de rode auto’s te zoeken. Makkelijk.
Als je ook weet dat het een sedan is, sluit je meteen de rode cabrio’s en SUV’s uit. Nog makkelijker.
Elke extra eigenschap – de kleur, het model, het merk, het bouwjaar – helpt je om de zoekopdracht te verfijnen en de auto sneller te vinden. Dit werkt perfect tot op een bepaald punt. Maar stel je nu voor dat je 150 eigenschappen van de auto probeert te gebruiken.
Je wilt niet alleen de kleur en het model weten, maar ook de exacte afmeting van de wieldoppen, het aantal krassen op de linkerachterbumper, de spanning van de ruitenwisserrubbers, en de geur van de matten. Je hebt nu zoveel dat punten (features) dat elke auto in de parkeerplaats plotseling uniek is. De auto die je zoekt, staat op exact één specifieke plek met exact die 150 eigenschappen. Je hebt geen ‘categorie auto’ meer; je hebt gewoon één specifieke auto.
Je model kan niet meer leren wat ‘een auto’ is, want elke auto is anders.
Dat is de curse of dimensionality: door te veel features toe te voegen, wordt je data extreem verspreid en leert je model niets nuttigs meer. Het leert gewoon je ruis en toeval uit het verleden kennen.
Waarom dit jouw bot fataal wordt
In de wereld van algorithmic trading is deze vloek dodelijk. Je bot probeert patronen te vinden in de chaos van de markt.
Met weinig goede features (zoals prijsactie, volume, en een paar technische indicatoren) kan je model de ‘echte’ patronen onderscheiden van de ruis. Maar als je 50 of 100 features toevoegt, gebeurt er iets geks. Je backtest – de test op oude data – gaat het fantastisch doen. Waarom?
Omdat het model nu precies de uitschieters van het verleden gaat herkennen. Het leert niet de algemene regel ‘als de RSI laag is en de prijs stijgt, koop dan’, maar eerder ‘als de RSI 28.4 is, de MACD op -1.2 staat, de VIX 19.2 is, en de zonnewindsterkte laag is (oke, beetje overdreven), koop dan’.
Je model is nu een papegaai die exact napraat wat er in het verleden is gezegd, in plaats van een leerling die de taal begrijpt.
Het gevaar van ‘Data Snooping’
Zodra je live gaat, verandert de markt. Die exacte combinatie van 50 parameters die in 2021 werkte, zal in 2024 nooit meer voorkomen. Je bot zit vast in het verleden en kan geen beslissingen nemen over de toekomst. Bovendien vertraagt het je systeem enorm.
Een API call naar je broker (bijvoorbeeld Interactive Brokers of Degiro) met 100 features per seconde verwerken kost rekenkracht, tijd en geld. Je wilt een snelle, wendbare jager zijn, geen log beest dat struikelt over zijn eigen voeten.
Een specifieke variant van dit probleem heet data snooping. Dit is wat er gebeurt als je te veel features gebruikt en je backtests blijft aanpassen tot je een perfecte equity curve hebt. Je bent dan niet meer aan het testen; je bent aan het passen.
Je feature set is nu zo complex geworden dat hij specifiek is ontworpen om de ruis van de afgelopen 5 jaar te voorspellen.
In de trading-wereld noemen we dat ‘overfitting’. Stel je voor dat je een model bouwt met 100 features en je test het op 10 jaar data. De kans dat er toevallig een paar perfecte correlaties zijn ontstaan is bijna 100%.
De impact op je data infrastructuur
Zelfs als je willekeurige data gebruikt (zoals de koers van Bitcoin en de temperatuur in Amsterdam), zal je model op een gegeven moment ‘winnen’ in de backtest.
Dit is vals succes. Je betaalt hiermee een prijs: je vertrouwen is vals, en je verliest je inleg zodra de markt een beetje ademt. Laten we even pragmatisch kijken naar de kosten.
Als je handelt via een broker als Interactive Brokers (IBKR), betaal je voor data. Het downloaden en opslaan van 100 features per tick voor een paar honderd aandelen is duur.
Je database groeit exponentieel. Je Python-script voor backtesting (misschien gebruik je libraries als Backtrader of een eigen vectorized setup) moet al die data laden.
Zonder voldoende RAM (denk aan 32GB of 64GB) crasht je systeem. En tijd is geld. Een simpele backtest met 5 features duurt 10 seconden. Dezelfde test met 100 features duurt misschien 10 minuten of langer, afhankelijk van je complexiteit.
Als je wilt itereren en je strategie wilt fine-tunen, zit je al snel uren te wachten. Dat is demotiverend en inefficiënt. Je bot moet sneller zijn dan de markt, en dat begint bij een snelle analyse.
Hoe herken je het en wat werkt wel?
Hoe weet je of je in de val trapt? Simpel. Kijk naar je resultaten.
Als je backtest er geweldig uitziet (Sharpe ratio > 3, drawdown < 5%), maar je paper trading (nep-handelen) of live trading direct slecht presteert, ben je waarschijnlijk aan het overfitten. Je gebruikt te veel parameters. Je model is als een student die de antwoorden op de oefentoets heeft geleerd, maar bij het echte examen de vragen niet begrijpt.
Een betere aanpak is ‘feature selectie’ of ‘dimensionaliteitsreductie’. Voordat je daarmee begint, is het essentieel om te begrijpen wat feature engineering voor financiële data inhoudt. Dit klinkt ingewikkeld, maar het is gewoon selectief zijn.
- Prijsactie: Open, High, Low, Close (OHLC). De basis. Altijd relevant.
- Volume: Hoe actief is de markt?
- Een paar krachtige indicatoren: Bijvoorbeeld een RSI van 14 perioden of een simpele Moving Average crossover. Niet 10 verschillende RSI’s.
- Volatiliteit: De ATR (Average True Range) om te weten hoe ver de prijs gemiddeld beweegt.
Je begint met een beperkte set logische features. Denk aan: Dat zijn er misschien maar 6 of 7. En dat is vaak genoeg. De kunst is om features te kiezen die onafhankelijk van elkaar informatie geven.
Als je de RSI gebruikt én de Stochastic Oscillator, gebruik je vaak vrijwel hetzelfde soort informatie (momentum). Kies er één, niet allebei.
Praktische methoden om te filteren
Er zijn technieken om te meten welke features echt werken. Eén van de makkelijkste is Correlatie-analyse. Kijk, nadat je technische indicatoren omzet naar features, welke van jouw variabelen sterk op elkaar lijken.
Als Feature A en Feature B een correlatie van 0.95 hebben, gooi er dan eentje weg.
Ze doen hetzelfde werk. Je bespaart ruimte en vermindert ruis. Een andere sterke methode is Recursive Feature Elimination (RFE) of het gebruiken van Lasso regressie.
Dit zijn technieken die je in Python (via libraries als Scikit-learn) kunt gebruiken. Ze bouwen een model en helpen je om het feature belang inzichtelijk te maken, zodat je ziet welke variabelen eigenlijk geen klap bijdragen.
Ze zetten die op ‘nul’ of gooien ze eruit. Je laat de machine zelf bepalen wat nuttig is, in plaats van blind te vertrouwen op je eigen intuïtie.
Je kunt ook je backtest opdelen. Neem een stukje data (bijvoorbeeld 2020-2022) om te trainen en een ander stukje (2023) om te valideren. Als je resultaten op de trainingsdata perfect zijn, maar op de validatiedata (die de bot nog nooit heeft gezien) dramatisch, dan weet je genoeg: je model is te complex.
De juiste balans: Simpliciteit is het nieuwe luxe
De beste traders ter wereld gebruiken vaak maar een handvol indicators. Ze snappen dat de markt chaotisch is en dat je een eenvoudige, robuuste regel nodig hebt die onder veel omstandigheden werkt, niet een super ingewikkelde die alleen werkt onder zeldzame condities.
- Goede data: €50 - €200 per maand (bijv. via Polygon.io of je broker).
- Backtesting software of Python omgeving: €0 (open source) tot €500 voor geavanceerde packages.
- Een VPS om je bot 24/7 te draaien: €10 - €30 per maand.
Denk aan de prijs. Wat kost een goede trading setup? Je investeert geld in data en infrastructuur.
Zorg dan dat je bot niet crasht door overbodige ballast. Een simpele strategie met 5 goede features draait soepel op een goedkope VPS.
Een strategie met 100 features heeft een krachtige server nodig en is gevoeliger voor bugs.
Focus op kwaliteit, niet kwantiteit. Gebruik je domain knowledge. Weet je veel van de oliemarkt? Gebruik dan olie-gerelateerde features (bijvoorbeeld de USD index, olievoorraden) in plaats van willekeurige technische indicatoren te stapelen.
Checklist voor je volgende bot
Jouw voorsprong zit in je begrip van de markt, niet in het aantal rekenregels dat je in Python giet. Voordat je je volgende script draait, loop deze lijst even na.
Ben je te ver gegaan? Als je een van deze vragen met ‘ja’ beantwoordt, stop dan even. Verwijder de helft van je features. Test opnieuw.
- Heb ik meer dan 15 features? Zo ja, waarom? Leg uit welke unieke informatie elke feature toevoegt.
- Zijn mijn features sterk gecorreleerd? (Check dit met Python).
- Is de prestatie van mijn backtest drastisch anders dan mijn live resultaten?
- Kan ik mijn strategie uitleggen aan een vriend zonder een wiskundig proefschrift nodig te hebben?
Je zult verrast zijn hoe vaak de prestatie beter wordt. Minder ruis, meer signaal.
Dat is de weg naar een winstgevende bot.
Conclusie: Houd het simpel, win consistent
De vloek van de dimensionaliteit is een val die bijna elke beginnende quant in trapt. De verleiding is groot: meer data, meer berekeningen, meer ‘intelligentie’ moet toch beter zijn? Helaas. In de tradingwereld werkt dat anders.
Te veel features leiden tot overfitting, trage systemen en teleurstellende live resultaten.
Je leert je eigen ruis uit het verleden in plaats van de toekomst te voorspellen. De oplossing is respect voor de eenvoud.
Kies je features met zorg. Zorg dat ze onafhankelijk zijn en logisch. Test streng op data die je bot nog nooit heeft gezien.
Onthoud dat een bot die met 6 goede parameters draait en €500 per maand kost vaak meer oplevert dan een monster-bot met 100 parameters die een server van €200 per maand nodig heeft en alsnog faalt.
Bouw slanker, test scherper, en trade beter.
