CHAPTER 09.1 / BACKTESTING PRINCIPLES
9.1 과거 데이터로 전략을 검증하는 올바른 순서
A·B·C 가상 리밸런싱에서 데이터 공개, 신호, 다음 시가 체결과 수익 구간을 연결하고 회전율 90%와 거래비용 0.045%의 발생 시점을 점검합니다.
9.1 과거 데이터로 전략을 검증하는 올바른 순서
A·B·C 세 종목을 바꾸는 가상 리밸런싱 한 번을 끝까지 추적한다. 핵심 질문은 하나다.
t일 16:00에 받은 데이터로16:01에 Signal(신호)을 만들었다면 어느 가격부터 실제로 체결할 수 있고, Turnover(회전율)와 Trading cost(거래비용)는 언제 발생하는가?
먼저 한 거래를 멈춰 세운다
리밸런싱 직전에는 A를 +20%, B를 -10% 보유하고 C는 보유하지 않는다. 새 목표는 A +50%, B 0%, C -50%다. 아래 네 시각을 먼저 고정하지 않으면 같은 가격열도 전혀 다른 Backtest(백테스트)가 된다.
| 시각 | 일어난 일 | 그 시점에 가능한 행동 |
|---|---|---|
t일 16:00 | 그날 데이터와 종가가 확정된다. | 데이터를 받을 수 있지만 아직 신호 계산은 끝나지 않았다. |
t일 16:01 | A +50%, B 0%, C -50% 목표 비중이 확정된다. | 이미 지나간 t일 16:00 종가에 새 주문을 체결할 수 없다. |
t+1일 09:00 | 주문을 제출하고 다음 시가에 체결한다. | 주문 직전에 실제로 보유한 비중과 목표 비중을 비교해, 부족한 만큼 사고 넘치는 만큼 판다. |
t+2일 09:00 | 한 기간의 성과 측정을 끝낸다. | t+1일 09:00 이후 보유한 포지션의 결과만 센다. |
네 시각을 손으로 연결한다
t일 16:01에야 목표 비중을 알았으므로 t일 16:00 종가는 실행 가능한 가격이 아니다. 장 마감 전에 신호가 완성되고 Market-on-close order(종가 주문)를 미리 제출한다는 별도 계약도 없다. 따라서 이 사례에서 처음 사용할 수 있는 체결 가격은 t+1일 09:00 시가다.
t일 16:00 데이터 공개 → t일 16:01 신호 확정 → t+1일 09:00 주문·체결 → t+2일 09:00 수익 구간 종료
행으로 정리하면 현재 신호와 그 뒤에 확인할 결과의 관계가 더 분명해진다.
| 표에서의 위치 | 기록된 내용과 처리 |
|---|---|
| 현재 신호 행 | t일 16:01에 목표 A +50%·C -50%를 확정한다. 그 시점까지 알 수 있었던 정보로 만든 신호다. |
| 다음 결과 행 | t+1일 09:00 체결부터 t+2일 09:00까지 비용 전 수익률은 1.5%다. 현재 신호가 이후에 낸 결과로만 사용한다. |
| 마지막 신호 행 | 비교할 다음 결과가 없다. 수익률을 0%로 채우지 않고 결과 계산에서 제외한다. |
현재 행에서 만든 신호와 다음 행에서 발생한 결과를 시간순으로 연결해 비교한다. 다음 행의 수익률은 신호를 계산할 때 사용하지 않고, 신호가 만들어진 뒤의 결과를 평가할 때만 사용한다. 다음 결과가 없는 마지막 행은 결과 계산에서 제외한다.
수익 구간은 체결과 같은 t+1일 09:00에 시작한다. 특정 함수 이름보다 데이터 공개, 신호 확정, 주문, 체결과 수익 구간의 실제 시각이 올바른 순서인지 확인하는 것이 중요하다.
거래량을 손으로 센 뒤 일반식으로 옮긴다
Pre-trade weight(리밸런싱 직전 비중)는 t+1일 09:00 체결 직전에 가격 변화로 표류한 비중이고, Target weight(목표 비중)는 체결 뒤 만들려는 비중이다.
| 종목 | 리밸런싱 직전 | 목표 | 절대 변화 |
|---|---|---|---|
| A | +20% | +50% | 30% |
| B | -10% | 0% | 10% |
| C | 0% | -50% | 50% |
세 절대 변화를 더하면 회전율은 90%다.
이 손계산을 모든 종목으로 넓히면 다음과 같다.
- Turnover(회전율)
- 단위: 시점 소수 비중
- 포트폴리오에 포함되거나 청산되는 전체 종목 수
- 단위: 개
- 종목의 Target weight(목표 비중)
- 단위: 소수 비중
- 종목의 Pre-trade weight(리밸런싱 직전 비중)
- 단위: 소수 비중
Commission(수수료) 2bp와 Slippage(슬리피지) 3bp를 회전율에 적용하면 Trading cost rate(거래비용률)는 다음과 같다. Basis point(베이시스 포인트)는 이다.
- Trading cost rate(거래비용률)
- 단위: 체결 시점 소수 수익률
- Turnover(회전율)
- 단위: 체결 시점 소수 비중
- Commission(수수료)
- 단위: Basis point(베이시스 포인트)
- Slippage(슬리피지)
- 단위: Basis point(베이시스 포인트)
0.045%는 t+1일 09:00 주문이 체결되며 발생한다. t+2일 09:00에 결과를 확인한 뒤 편리한 비용을 고르는 값이 아니다. 아직 보유하지 않은 미래 구간 수익률도 이 비용 계산에 들어가지 않는다.
데이터 공개 뒤 신호와 주문이 만들어지고, 체결 이후의 구간만 성과로 측정합니다.
- 데이터 공개t일 16:00
- 신호 확정t일 16:01
- 주문 제출t+1일 09:00
- 체결t+1일 09:00
- 수익 구간 시작t+1일 09:00
- 수익 구간 종료t+2일 09:00
실행 가능한 시간축에서 무엇을 해석할 수 있는가
도구의 기본값은 데이터 공개 뒤 신호가 확정되고, 다음 시가 주문·체결 뒤 수익 구간이 시작되는 사례다. “잘못된 같은 종가 예시”에서는 신호가 확정되기 전에 체결이 기록되므로 Look-ahead bias(미래정보 편향) 가능성을 즉시 표시한다. 같은 시각 주문·체결은 주문 종류와 시장 규칙으로 실제 가능하다고 명시한 경우에만 허용한다.
시간축이 유효하다는 판정은 높은 수익이나 전략의 타당성을 뜻하지 않는다. 오직 각 정보와 행동이 가능한 순서로 배치됐다는 뜻이다. 결과를 읽기 전에는 다음 기록도 함께 고정한다.
| 확인 항목 | 남길 기록 | 막으려는 오류 |
|---|---|---|
| 자료 시점 | 제공자, 공개 시각, 시간대, 수정 이력과 기업행동 조정 | 아직 몰랐던 값을 사용한 Look-ahead bias(미래정보 편향) |
| 종목군 | 각 날짜에 상장·거래 가능했던 종목과 제외 이유 | 살아남은 종목만 남긴 Survivorship bias(생존 편향) |
| 체결 규칙 | 신호 시각, 주문 종류, 체결 지연과 가격 | 지나간 가격에 체결했다고 가정한 실행 오류 |
| 거래비용 | 비중 변화, 수수료, 슬리피지와 비용 발생 시각 | 비용 전 결과를 실제 결과로 읽는 오류 |
| 실험 이력 | 시험한 규칙과 매개변수, 실패 결과 | 승자만 남기는 Data snooping(데이터 탐색 편향) |
이 페이지가 보장하지 않는 것
- 실행 가능한 시간축은 전략 가설이 통과됐거나 미래에도 수익을 낸다는 증거가 아니다. 가설 판정과 실패 기준은 7.4의 범위다.
- Point-in-time universe(시점 일치 종목군)는 각 날짜에 실제 선택 가능했던 종목을 복원한다. 현재 종목 목록을 과거 전체에 적용하지 않는다.
- 시간축 점검은 두 가격 관계가 안정적인지 검사하지 않는다. 관계의 안정성과 붕괴는 8.11의 범위다.
- 이 페이지는 Beta(베타) 노출이나 기간수익률을 아직 계산하지 않는다. signed weight(부호 있는 비중)의 해석은 9.2에서 이어 간다.
- 거래비용 0은 중립적인 기본값이 아니다. 비용을 모르겠다면 0으로 숨기지 말고 미확정 가정으로 표시한다.
이해 점검
t일 16:00 데이터를 받아 16:01에 신호를 확정했다면 왜 같은 날 16:00 종가에 체결할 수 없는가?
신호가 완성될 때 그 종가는 이미 지나갔기 때문이다. 장 마감 전에 계산 가능한 신호와 종가 주문을 미리 제출한다는 별도 계약이 없다면 이 사례의 첫 실행 가격은 t+1일 09:00 시가다.
A +20%, B -10%, C 0%에서 A +50%, B 0%, C -50%로 바꾸면 회전율은 얼마인가?
절대 변화는 각각 30%, 10%, 50%이므로 합계 90%다. 숏을 청산하는 B의 10%와 새 숏을 만드는 C의 50%를 모두 센다.
회전율 90%에 수수료 2bp와 슬리피지 3bp를 적용한 거래비용률은 얼마이며 언제 발생하는가?
, 즉 0.045%다. 목표 비중을 만드는 주문이 t+1일 09:00에 체결될 때 발생한다.
현재 신호 행과 다음 결과 행을 연결할 때 무엇을 확인해야 하는가?
다음 행의 수익률은 현재 신호를 계산하는 입력이 아니라 신호가 만들어진 뒤의 결과로만 사용해야 한다. 비교할 다음 결과가 없는 마지막 신호 행은 0%로 채우지 않고 결과 계산에서 제외한다.
완료 기준
다음을 직접 수행하면 9.1을 마친 것이다.
- 임의 전략의 데이터 공개, 신호 확정, 주문, 체결과 수익 구간 종료 시각을 한 줄에 적는다.
- 신호가 확정되기 전 가격으로 체결한 지점을 찾아 실행 가능한 다음 가격으로 고친다.
- A·B·C의 직전 비중과 목표 비중 차이로 회전율 90%를 다시 계산한다.
- 수수료 2bp와 슬리피지 3bp를 적용해 거래비용률 0.045%와 발생 시각을 기록한다.
- 시간축 점검이 전략 가설 판정, 관계 안정성 검정과 노출 계산을 대신하지 않는다고 설명한다.
이 페이지의 A·B·C 비중, 시각, 수수료와 슬리피지는 계산 절차를 익히기 위한 가상 자료다. 실제 체결 가능성, 비용, 수익 또는 투자 적합성을 나타내거나 예측하지 않는다. 다음 페이지에서는 같은 가상 거래를 signed weight(부호 있는 비중)로 읽어 노출과 기간수익률을 계산한다.