High-Performance Backtest Engines
How to build a backtest engine that runs hundreds of times faster without changing a single PnL number — data layout, caching, adaptive resolution, and architecture, from first speedups to production internals.
- 01
Jun 26, 2026 #algotradingDe Backtest-snelheidsladder: 298x op een laptop-CPU, identieke PnL tot de laatste trade
Vijf implementaties van dezelfde sweep over 80 parametercombinaties, allemaal geverifieerd op identieke PnL: pandas rolling.apply doet er 69,9 seconden over, numpy 3,1, numba 2,0, parallelle numba 0,23 — een gemeten versnelling van 298x op een Apple M2 Max zonder enige hardwarewijziging, en nog altijd ~13x ten opzichte van een degelijke gevectoriseerde baseline. Wat elke trede oplevert, waarom een GPU niet het ontbrekende stukje is, en waar het echte knelpunt in massale parametersearch zich bevindt.
- 02
Jul 2, 2026 #algotradingDe framework-belasting: wanneer je backtestbibliotheek trager is dan een naïeve pandas-loop
We hebben acht backtest-engines gebenchmarkt op één identieke parameter-sweep — 150k bars, 80 HMA-cross-combinaties, trade-count-pariteit vastgezet op 2707. Twee van de populairste event-driven frameworks kwamen trager uit dan een met de hand geschreven pandas-loop, terwijl een gevectoriseerde/gecompileerde engine hetzelfde werk ~13,000× sneller draaide. Een studie van de per-bar overhead die populaire bibliotheken nooit gebouwd waren om te amortiseren.
- 03
Mar 16, 2026 #algotradingGeaggregeerde Parquet-cache: hoe je multi-timeframe backtests honderden keren sneller maakt
Hoe je timeframes en indicatoren vooraf berekent uit minutencandles, ze opslaat in parquet en gebruikt voor grootschalig testen van strategieën zonder overbodige herberekeningen.
- 04
Jul 3, 2026 #algotradingDe parameterruimte met twee assen: waarom het grootste deel van je sweep bijna gratis zou moeten zijn
Niet alle parameters kosten evenveel om te doorzoeken. De parameters van een strategie splitsen zich in een dure as (indicatoren — herberekend over de hele reeks) en een goedkope as (beslissingsdrempels — een O(n)-pass over vooraf berekende signalen). Omdat indicatoren invariant zijn ten opzichte van drempels, bereken je ze eenmalig en sweep je duizenden drempelconfiguraties met ~5.600 cfg/s — ruwweg 1.600x goedkoper dan per configuratie herberekenen. Een herprijzing van de vloek van de dimensionaliteit.
- 05
Mar 17, 2026 #algotradingAdaptieve Drill-Down: Backtesten met Variabele Granulariteit van Minuten tot Ruwe Trades
Hoe adaptieve datagranulariteit backtests versnelt en opslag bespaart: drill-down van 1m naar 1s, 100ms en ruwe trades alleen waar de prijs significant bewoog of het volume piekte, niet over de hele historische reeks.
- 06
Jul 5, 2026 #algotradingDe Fidelity Gate: Grof-naar-Fijn Backtesten Bedriegt Je Sneller Tenzij de Goedkope Proxy Net Zo Rangschikt als de Dure
Drill-down / multi-fidelity zoeken (ASHA, successive halving, Hyperband) screent duizenden configuraties goedkoop en promoveert alleen overlevenden naar de dure volledige evaluatie. Het is een echte snelheidswinst — maar hij stort stilletjes in als de low-fidelity-rangschikking niet overeenkomt met de high-fidelity-rangschikking. We maten de fold-rangcorrelatie: bij één fold kan Spearman ρ 0.03 zijn (rangschikt bijna willekeurig), oplopend naar 0.43, 0.67, 0.78, 0.91 naarmate folds zich opstapelen. De oplossing is één verplichte poort — meet eerst ρ(goedkoop, volledig), en verhoog automatisch de minimale fidelity naar de eerste trede waar ρ ≥ 0.5.
- 07
Jul 4, 2026 #algotradingRandom vs Smart Search: De Crossover Zit in de Eval-kosten, Niet in het Algoritme
Als één backtest goedkoop is, wint domme scrambled Sobol op pure doorvoersnelheid — slimme samplers (TPE, CMA-ES, ASHA) betalen een Python ask/tell-belasting die ze 20x vertraagt, waardoor ze bij gelijke wall-clock veel minder punten evalueren en verliezen. Maak elke eval duur (multi-TF + walk-forward-folds) en de crossover keert om. We hebben beide regimes gemeten, en waarom fold-rank-fidelity (ρ@1 stijgend van 0.03→0.43) de voorwaarde is waaraan voldaan moet zijn wil pruning zich uitbetalen.
- 08
Jul 6, 2026 #algotradingDe GPU-precisievalstrik: Hoe een fp32-backtest op Apple Metal stilletjes onzin teruggeeft
Apple's Metal-GPU heeft geen float64. Zet er naïef een gevectoriseerde backtest naartoe over en de verleidelijke prefixsom-WMA loopt over fp32 heen — maximale relatieve fout 211× — en toch draait hij nog steeds en geeft plausibel ogende getallen terug. De oplossing is niet meer precisie; het is een andere formulering: een directe gevensterde convolutie, fp32-veilig tot 8×10⁻⁷ en 55.9× sneller dan single-thread numba. De valstrik, de rekenkunde, en hoe je bewijst dat je er niet in getrapt bent.
- 09
Jul 7, 2026 #algotradingWanneer de GPU loont: de parameter-sweep-roofline, waar een headline van 167x in werkelijkheid 27x algoritme maal 6.2x hardware is
De voorsprong van de GPU op de CPU groeit met de batchgrootte — van 54.5x bij een combo per call tot 359.6x bij 61 op onze multi-timeframe indicator-precompute — omdat een kleine sweep de kernel-launch- en transfer-overhead niet kan amortiseren. We ontleden een headline van 167x in een algoritmische winst van 27x die ook de CPU helpt en een hardwarewinst van 6.2x, laten zien dat de echte voorsprong van de GPU op de beste CPU slechts 3.2x is bij single-timeframe en 6.2x bij multi, en geven een beslisgids voor hoe breed een sweep moet zijn voordat een GPU de aanschaf waard is.
- 10
Jun 30, 2026 #algotradingDe IPC-belasting: zet de backtest-engine achter een socket en verlies 13% — bijna niets daarvan komt door de socket
We hebben een numba-backtestkernel regel voor regel naar Rust geport en op vier manieren over een procesgrens aangeroepen, met een equivalentiepoort die identieke PnL tot de laatste trade bevestigt. Het versturen van de volledige 1,2 MB prijsserie via een Unix-socket kost ~2 ms — ongeveer 0,1% van de taak. JSON-codering van dezelfde payload kost 1348x meer dan ruwe bytes, chatty aanroepen per combinatie versturen de data 80 keer opnieuw, en een aanroeppatroon per bar zou 2,1 s pure IPC kosten op een taak van 2,0 s. De grens is goedkoop; de belasting zit in hoe je hem oversteekt.