CHAPTER 12 / SECTION 03
12.3 벡터화와 이벤트 구동 백테스트 비교하기
거래 순서와 현금이 결과를 바꾸는 조건을 두 시뮬레이션 방식으로 비교합니다.
매도 대금이 들어와야 매수할 수 있는 계좌
계좌에 A 자산 100만 원과 현금 0원이 있고 목표는 B 자산 100만 원이라고 하자. 매도를 먼저 체결하고 대금을 즉시 쓸 수 있으면 B를 살 수 있다. 매수부터 처리하면 현금 부족으로 주문이 거절된다. 매도 대금을 결제일까지 쓸 수 없는 계좌라면 매도를 먼저 처리해도 B의 매수는 미뤄진다. 목표 비중은 같지만 거래 순서와 계좌 상태가 결과를 바꾼다.
날짜별 배열로 보유 수익 계산하기
Vectorized Backtesting(벡터화 백테스트)은 날짜와 자산이 정렬된 표를 사용한다. 가격 또는 수익률, 당시 거래 가능 여부, 점수, 리밸런싱 날짜, 목표 비중, 비중 변화에 적용할 비용을 준비한다. 월말 점수로 상·하위 종목을 고르고 같은 비중 또는 변동성을 반영한 비중을 준다. 신호를 실제 체결 시점에 맞춰 이동시킨 뒤 보유 비중으로 각 기간의 수익률을 가중 평균한다. 거래일에는 가격 변동을 반영한 기존 비중과 목표 비중의 차이로 비용을 계산하고, 순수익을 복리로 잇는다.
이 방식은 후보가 많은 탐색에서 효율적이다. 조회 기간이나 리밸런싱 주기를 바꿔도 결과가 유지되는지, 특정 자산과 날짜가 전체 성과를 좌우하는지 한 번에 비교하기 쉽다. 다만 결측 가격을 전날 값으로 채운 행은 평가에 쓸 수 있어도 해당 가격에 거래가 가능했다는 뜻은 아니다. 체결 지연, 정수 주 반올림이나 대차 제한이 결과를 좌우하면 배열이 표현한 규칙부터 다시 확인한다.
이벤트마다 계좌 갱신하기
Event-driven Backtesting(이벤트 구동 백테스트)은 그 시점의 현금, 보유 수량, 미체결 주문, 평가·실현 손익, 증거금과 위험 상태를 기록한다. 앞선 주문의 결과가 다음 행동의 입력이 된다.
- 시장 데이터 수신
거래 시계를 옮기고 보유 자산을 새 가격으로 평가한다. - 기존 주문 처리
체결 조건을 확인한 뒤 수량·현금·수수료를 장부에 반영한다. - 전략 판단
갱신된 현금과 위험 상태로 주문을 내거나 수정·취소한다. - 다음 이벤트
남은 주문과 보유 상태를 다음 시점으로 전달한다.
A 매도가 체결됐는지에 따라 B 매수 주문이 달라지는 과정을 장부로 추적할 수 있다.
이 구조는 최대 낙폭에서 노출을 줄이는 규칙, 실현 손익에 따라 위험 예산을 조절하는 Kelly-style Sizing(켈리식 비중 조절), 보유 중 고점을 따라가는 손절, 첫 번째 주문이 체결돼야 두 번째 주문을 내는 거래, 증거금과 선물 만기 교체가 맞물리는 거래에 적합하다. 다만 일봉의 고가와 저가만으로는 장중 어느 가격이 먼저 왔는지 알기 어렵다. 주문 대기 순서, 장중 경로와 시장 충격은 별도 가정이나 더 세밀한 데이터가 필요하다.
엔진이 달라도 같은 거래를 뜻하게 하기
| 확인할 항목 | 성과가 갈리는 이유 |
|---|---|
| 신호와 체결 시각 | 종가 신호를 다음 시가와 다음 종가 중 어디에 체결하는지에 따라 보유 구간이 달라진다. |
| 체결가 | 공식 시가, 중간 호가, 지정가와 비용 반영 가격이 손익과 거래 가능성을 바꾼다. |
| 주문 순서 | 매도 후 매수를 하면 확보한 현금을 쓸 수 있다. |
| 비중을 수량으로 변환 | 리밸런싱 시작의 계좌 가치로 주문을 모두 정할지 체결마다 다시 평가할지 명시한다. |
| 현금 장부 | 결제 대기금, 비용, 공매도 대금과 증거금의 사용 가능 여부를 정한다. |
| 거래 단위 | 정수 수량으로 내리면 잔여 현금과 목표 비중 편차가 생긴다. |
| 현금 부족 | 거절, 축소, 일부 체결, 증거금 사용의 선택이 다음 보유 상태를 바꾼다. |
| 공매도 | 대차 가능 여부, 대금 사용 조건과 조달비용을 반영한다. |
| 손절과 지정가 | 주문 발동 시각과 실제 체결가를 분리한다. |
| 결측과 거래일 | 신규 상장, 상장폐지, 휴장, 결측이 있는 날의 거래 가능성을 따로 기록한다. |
| 비용 | 비용은 순수익뿐 아니라 매수할 수 있는 수량도 바꾼다. |
vectorBT 계열은 배열로 조건을 넓게 비교하는 데 편리하며 내부적으로 주문 시뮬레이션도 지원할 수 있다. Zipline, backtrader, Lean, ml4t-backtest처럼 주문·체결·장부가 직접 드러나는 도구는 상태가 중요한 전략을 추적하기 편하다. 엔진의 기본 체결가와 매도·매수 순서는 모두 거래 가정으로 기록한다.
Engine Parity(엔진 간 결과 일치)를 확인할 때는 자산 한 개와 주문 한 번부터 두 구현에 넣는다. 신호 시각, 체결가와 수량, 수수료, 현금, 최종 보유를 순서대로 비교한다. 그다음 현금 부족, 매도 후 매수, 결측이나 손절을 하나씩 추가한다. 최종 수익률이 다르면 최초로 어긋난 날짜의 주문과 장부부터 비교하면 원인을 좁힐 수 있다.