Q

PRIVATE NAVIGATION MODE

ML4T 탭 잠금 해제

패스워드를 확인하면 이 브라우저에서 ML4T 탭과 검색 결과를 표시합니다.

STUDY SEARCH

학습 자료 검색

제목과 설명, 키워드, 학습 본문에서 찾습니다.

검색 범위

검색어를 입력해 주세요.

SEARCH THE NOTEBOOK

찾고 싶은 금융·통계·전략 개념을 입력해 보세요.

CHAPTER 09.1 / BACKTESTING PRINCIPLES

9.1 과거 데이터로 전략을 검증하는 올바른 순서

A·B·C 가상 리밸런싱에서 데이터 공개, 신호, 다음 시가 체결과 수익 구간을 연결하고 회전율 90%와 거래비용 0.045%의 발생 시점을 점검합니다.

9장. 백테스트 원칙과 Long-Short 예제 점검초급 학습 노트

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(백테스트)가 된다.

A·B·C 가상 리밸런싱의 실행 계약
시각일어난 일그 시점에 가능한 행동
t일 16:00그날 데이터와 종가가 확정된다.데이터를 받을 수 있지만 아직 신호 계산은 끝나지 않았다.
t일 16:01A +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%
C0%-50%50%

세 절대 변화를 더하면 회전율은 90%다.

30%+10%+50%=90%30\% + 10\% + 50\% = 90\%

이 손계산을 모든 종목으로 넓히면 다음과 같다.

Tt=i=1Nwi,ttargetwi,tpreT_t = \sum_{i=1}^{N}\lvert w_{i,t}^{\mathrm{target}}-w_{i,t}^{\mathrm{pre}}\rvert
TtT_t
Turnover(회전율)
단위: tt시점 소수 비중
NN
포트폴리오에 포함되거나 청산되는 전체 종목 수
단위: 개
wi,ttargetw_{i,t}^{\mathrm{target}}
ii종목의 Target weight(목표 비중)
단위: 소수 비중
wi,tprew_{i,t}^{\mathrm{pre}}
ii종목의 Pre-trade weight(리밸런싱 직전 비중)
단위: 소수 비중

Commission(수수료) 2bp와 Slippage(슬리피지) 3bp를 회전율에 적용하면 Trading cost rate(거래비용률)는 다음과 같다. Basis point(베이시스 포인트)는 1bp=0.01%=0.00011\text{bp}=0.01\%=0.0001이다.

cttrade=Tt×bcommission+bslippage10,000c_t^{\mathrm{trade}} = T_t\times\frac{b_{\mathrm{commission}}+b_{\mathrm{slippage}}}{10{,}000}
cttradec_t^{\mathrm{trade}}
Trading cost rate(거래비용률)
단위: 체결 시점 소수 수익률
TtT_t
Turnover(회전율)
단위: 체결 시점 소수 비중
bcommissionb_{\mathrm{commission}}
Commission(수수료)
단위: Basis point(베이시스 포인트)
bslippageb_{\mathrm{slippage}}
Slippage(슬리피지)
단위: Basis point(베이시스 포인트)
0.9×2+310,000=0.00045=0.045%0.9\times\frac{2+3}{10{,}000} =0.00045 =0.045\%

0.045%는 t+1일 09:00 주문이 체결되며 발생한다. t+2일 09:00에 결과를 확인한 뒤 편리한 비용을 고르는 값이 아니다. 아직 보유하지 않은 미래 구간 수익률도 이 비용 계산에 들어가지 않는다.

INTERACTIVE STUDY TOOL신호에서 체결까지 시간축 점검가상 시각을 배치해 그때 알 수 있던 정보만으로 실제 실행 가능한 흐름인지 확인합니다.
실행 가능한 시간축

데이터 공개 뒤 신호와 주문이 만들어지고, 체결 이후의 구간만 성과로 측정합니다.

  1. 데이터 공개t일 16:00
  2. 신호 확정t일 16:01
  3. 주문 제출t+1일 09:00
  4. 체결t+1일 09:00
  5. 수익 구간 시작t+1일 09:00
  6. 수익 구간 종료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.9×5/10,000=0.000450.9\times5/10{,}000=0.00045, 즉 0.045%다. 목표 비중을 만드는 주문이 t+1일 09:00에 체결될 때 발생한다.

현재 신호 행과 다음 결과 행을 연결할 때 무엇을 확인해야 하는가?

다음 행의 수익률은 현재 신호를 계산하는 입력이 아니라 신호가 만들어진 뒤의 결과로만 사용해야 한다. 비교할 다음 결과가 없는 마지막 신호 행은 0%로 채우지 않고 결과 계산에서 제외한다.

완료 기준

다음을 직접 수행하면 9.1을 마친 것이다.

  1. 임의 전략의 데이터 공개, 신호 확정, 주문, 체결과 수익 구간 종료 시각을 한 줄에 적는다.
  2. 신호가 확정되기 전 가격으로 체결한 지점을 찾아 실행 가능한 다음 가격으로 고친다.
  3. A·B·C의 직전 비중과 목표 비중 차이로 회전율 90%를 다시 계산한다.
  4. 수수료 2bp와 슬리피지 3bp를 적용해 거래비용률 0.045%와 발생 시각을 기록한다.
  5. 시간축 점검이 전략 가설 판정, 관계 안정성 검정과 노출 계산을 대신하지 않는다고 설명한다.

이 페이지의 A·B·C 비중, 시각, 수수료와 슬리피지는 계산 절차를 익히기 위한 가상 자료다. 실제 체결 가능성, 비용, 수익 또는 투자 적합성을 나타내거나 예측하지 않는다. 다음 페이지에서는 같은 가상 거래를 signed weight(부호 있는 비중)로 읽어 노출과 기간수익률을 계산한다.