← 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
    백테스트 엔진 속도 사다리: 노트북 CPU에서 298배, 마지막 트레이드까지 동일한 PnL
    Jun 26, 2026 #algotrading

    백테스트 엔진 속도 사다리: 노트북 CPU에서 298배, 마지막 트레이드까지 동일한 PnL

    동일한 80개 조합 파라미터 스윕을 다섯 가지 방식으로 구현하고 모두 동일한 PnL을 내는 것을 검증했습니다: pandas rolling.apply는 69.9초, numpy는 3.1초, numba는 2.0초, 병렬 numba는 0.23초 — Apple M2 Max에서 하드웨어 변경 없이 측정된 298배 속도 향상이며, 유능한 벡터화 기준선 대비로도 여전히 약 13배입니다. 각 단계에서 실제로 얻는 것이 무엇인지, GPU가 왜 빠진 조각이 아닌지, 그리고 대규모 파라미터 탐색의 진짜 병목이 어디에 있는지.

  2. 02
    프레임워크 세금: 백테스트 라이브러리가 순진한 pandas 루프보다 느릴 때
    Jul 2, 2026 #알고트레이딩

    프레임워크 세금: 백테스트 라이브러리가 순진한 pandas 루프보다 느릴 때

    8개의 백테스트 엔진을 완전히 동일한 파라미터 스위프로 벤치마크했다 — 150k 바, 80개의 HMA 크로스 조합, 거래 수 패리티를 2707로 고정. 가장 인기 있는 이벤트 기반 프레임워크 중 두 개가 손으로 짠 pandas 루프보다 느린 결과를 냈고, 벡터화/컴파일 엔진은 같은 작업을 약 13,000배 빠르게 실행했다. 인기 라이브러리가 애초에 분할 상각하도록 만들어지지 않은, 바당 오버헤드에 대한 연구.

  3. 03
    집계 Parquet 캐시: 멀티 타임프레임 백테스트를 수백 배 빠르게 하는 방법
    Mar 16, 2026 #algotrading

    집계 Parquet 캐시: 멀티 타임프레임 백테스트를 수백 배 빠르게 하는 방법

    분봉에서 타임프레임과 지표를 사전 계산하고 parquet에 저장하여 불필요한 재계산 없이 대량 전략 테스트에 활용하는 방법.

  4. 04
    이축 파라미터 공간: 왜 스윕의 대부분은 거의 공짜여야 하는가
    Jul 3, 2026 #알고리즘 트레이딩

    이축 파라미터 공간: 왜 스윕의 대부분은 거의 공짜여야 하는가

    모든 파라미터가 탐색 비용이 같은 것은 아니다. 전략의 파라미터는 비싼 축(지표 — 전체 시계열에 대해 재계산)과 싼 축(의사결정 임계값 — 미리 계산된 시그널에 대한 O(n) 패스)으로 나뉜다. 지표는 임계값에 대해 불변이므로 한 번만 계산한 뒤 초당 약 5,600개 설정 속도로 수천 개의 임계값 조합을 스윕할 수 있다 — 설정마다 재계산하는 것보다 약 1,600배 저렴하다. 차원의 저주를 다시 가격 매기다.

  5. 05
    어댑티브 드릴다운: 분봉에서 원시 틱까지 가변 해상도 백테스트
    Mar 17, 2026 #algotrading

    어댑티브 드릴다운: 분봉에서 원시 틱까지 가변 해상도 백테스트

    어댑티브 데이터 해상도가 백테스트를 가속화하고 스토리지를 절약하는 방법: 가격이 크게 움직이거나 거래량이 급증한 곳에서만 1m에서 1s, 100ms, 원시 틱으로 드릴다운하며, 전체 이력 시리즈를 고해상도로 만들 필요가 없습니다.

  6. 06
    충실도 게이트(Fidelity Gate): 저비용 프록시가 고비용 평가와 같은 순위를 매기지 않는 한, 성긴 것에서 정밀한 것으로(Coarse-to-Fine) 진행하는 백테스팅은 당신을 더 빨리 속인다
    Jul 5, 2026 #알고리즘 트레이딩

    충실도 게이트(Fidelity Gate): 저비용 프록시가 고비용 평가와 같은 순위를 매기지 않는 한, 성긴 것에서 정밀한 것으로(Coarse-to-Fine) 진행하는 백테스팅은 당신을 더 빨리 속인다

    드릴다운/다중 충실도 탐색(ASHA, successive halving, Hyperband)은 수천 개의 설정(config)을 저렴하게 걸러내고, 살아남은 것만 비용이 큰 전체 평가로 승격시킨다. 이는 실질적인 속도 향상이지만, 저충실도 순위가 고충실도 순위와 어긋나면 조용히 무너진다. 우리는 폴드 간 순위 상관관계를 측정했다. 폴드가 1개일 때 스피어만(Spearman) ρ는 0.03까지 낮아질 수 있으며(거의 무작위로 순위를 매기는 수준), 폴드가 누적됨에 따라 0.43, 0.67, 0.78, 0.91로 상승한다. 해결책은 하나의 필수 게이트다. 먼저 ρ(저렴한 것, 전체)를 측정하고, ρ ≥ 0.5가 되는 첫 번째 단계로 최소 충실도를 자동으로 높이는 것이다.

  7. 07
    무작위 탐색 vs 스마트 탐색: 교차점은 알고리즘이 아니라 평가 비용에 있다
    Jul 4, 2026 #알고리즘 트레이딩

    무작위 탐색 vs 스마트 탐색: 교차점은 알고리즘이 아니라 평가 비용에 있다

    백테스트 한 번이 저렴할 때는 단순히 뒤섞은 Sobol 시퀀스가 원시 처리량에서 모든 "스마트" 샘플러를 압도한다 — TPE, CMA-ES, ASHA는 파이썬 ask/tell 세금을 물어 속도가 20배 떨어지고, 동일한 실제 소요 시간에 훨씬 적은 지점을 평가하여 패배한다. 각 평가를 비싸게 만들면(다중 타임프레임 + walk-forward 폴드) 이 교차점은 뒤집힌다. 우리는 두 체제를 모두 측정했고, 폴드 순위 충실도(ρ@1이 0.03→0.43으로 상승)가 왜 가지치기가 효과를 보기 위한 전제 조건인지 살펴본다.

  8. 08
    GPU 정밀도 함정: Apple Metal에서 fp32 백테스트가 조용히 쓰레기 값을 반환하는 방법
    Jul 6, 2026 #알고리즘 트레이딩

    GPU 정밀도 함정: Apple Metal에서 fp32 백테스트가 조용히 쓰레기 값을 반환하는 방법

    Apple의 Metal GPU에는 float64가 없습니다. 벡터화된 백테스트를 순진하게 이식하면, 유혹적인 접두사 합(prefix-sum) WMA가 fp32에서 오버플로를 일으킵니다 — 최대 상대 오차 211배 — 그런데도 코드는 멈추지 않고 그럴듯한 숫자를 계속 반환합니다. 해법은 더 높은 정밀도가 아니라 다른 방식의 합산입니다: 직접 윈도우 컨볼루션은 fp32에서 8×10⁻⁷까지 안전하며 단일 스레드 numba보다 55.9배 빠릅니다. 이 함정의 정체, 그 산술적 원인, 그리고 여러분이 거기 빠지지 않았음을 증명하는 방법을 다룹니다.

  9. 09
    GPU가 값어치를 하는 순간: 파라미터 스윕의 루프라인, 헤드라인 167배는 사실 27배 알고리즘 곱하기 6.2배 하드웨어다
    Jul 7, 2026 #algotrading

    GPU가 값어치를 하는 순간: 파라미터 스윕의 루프라인, 헤드라인 167배는 사실 27배 알고리즘 곱하기 6.2배 하드웨어다

    GPU가 CPU에 대해 갖는 우위는 배치 크기와 함께 커집니다 — 우리의 멀티 타임프레임 지표 사전 계산에서 호출당 콤보 하나일 때 54.5배부터 예순한 개일 때 359.6배까지 — 작은 스윕은 커널 실행과 전송 오버헤드를 상각할 수 없기 때문입니다. 헤드라인 167배를 CPU에도 도움이 되는 27배의 알고리즘 승리와 6.2배의 하드웨어 승리로 분해하고, 진짜 GPU 대 최선의 CPU 우위는 단일 타임프레임에서 겨우 3.2배, 멀티에서 6.2배임을 보이며, GPU를 사들일 값어치가 생기려면 스윕이 얼마나 넓어야 하는지에 대한 결정 가이드를 제시합니다.

  10. 10
    IPC 세금: 백테스트 엔진을 소켓 뒤에 두면 13%를 잃는다 — 하지만 그중 거의 전부는 소켓 탓이 아니다
    Jun 30, 2026 #algotrading

    IPC 세금: 백테스트 엔진을 소켓 뒤에 두면 13%를 잃는다 — 하지만 그중 거의 전부는 소켓 탓이 아니다

    numba 백테스트 커널을 한 줄 한 줄 Rust로 이식하고, 프로세스 경계 너머로 네 가지 방식으로 호출했습니다. 동치성 게이트가 마지막 트레이드까지 동일한 PnL을 확인해 줍니다. 1.2 MB 가격 시리즈 전체를 Unix 소켓으로 보내는 데 드는 비용은 ~2 ms — 작업 전체의 약 0.1%입니다. 동일한 페이로드를 JSON으로 인코딩하면 raw bytes보다 1348배 더 비싸고, 콤보당 수다형(chatty) 호출은 데이터를 80번 다시 실어 보내며, 바(bar) 단위 호출 패턴은 2.0초짜리 작업에서 순수 IPC에만 2.1초를 지불하게 됩니다. 경계는 저렴합니다. 세금은 그것을 건너는 방식에 있습니다.