← All Collections
10 parts

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.

  1. 01
    De Backtest-snelheidsladder: 298x op een laptop-CPU, identieke PnL tot de laatste trade
    Jun 26, 2026 #algotrading

    De 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.

  2. 02
    De framework-belasting: wanneer je backtestbibliotheek trager is dan een naïeve pandas-loop
    Jul 2, 2026 #algotrading

    De 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.

  3. 03
    Geaggregeerde Parquet-cache: hoe je multi-timeframe backtests honderden keren sneller maakt
    Mar 16, 2026 #algotrading

    Geaggregeerde 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.

  4. 04
    De parameterruimte met twee assen: waarom het grootste deel van je sweep bijna gratis zou moeten zijn
    Jul 3, 2026 #algotrading

    De 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.

  5. 05
    Adaptieve Drill-Down: Backtesten met Variabele Granulariteit van Minuten tot Ruwe Trades
    Mar 17, 2026 #algotrading

    Adaptieve 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.

  6. 06
    De Fidelity Gate: Grof-naar-Fijn Backtesten Bedriegt Je Sneller Tenzij de Goedkope Proxy Net Zo Rangschikt als de Dure
    Jul 5, 2026 #algotrading

    De 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.

  7. 07
    Random vs Smart Search: De Crossover Zit in de Eval-kosten, Niet in het Algoritme
    Jul 4, 2026 #algotrading

    Random 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.

  8. 08
    De GPU-precisievalstrik: Hoe een fp32-backtest op Apple Metal stilletjes onzin teruggeeft
    Jul 6, 2026 #algotrading

    De 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.

  9. 09
    Wanneer de GPU loont: de parameter-sweep-roofline, waar een headline van 167x in werkelijkheid 27x algoritme maal 6.2x hardware is
    Jul 7, 2026 #algotrading

    Wanneer 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. 10
    De IPC-belasting: zet de backtest-engine achter een socket en verlies 13% — bijna niets daarvan komt door de socket
    Jun 30, 2026 #algotrading

    De 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.