DATA CHECKS · POINT-IN-TIME · SYNTHETIC
백테스트에 들어간 미래 데이터: 발생 시각과 수신 시각은 다릅니다
과거에 발생했다는 이유만으로, 그때 알고 있던 데이터가 되지는 않습니다. 수신 시각까지 확인해야 합니다.
12:00:00.500에 무엇을 알 수 있었을까?
아래 모든 숫자는 임의로 만든 교육용 호가입니다. 결정 시점은 12:00:00.500입니다. 데이터가 기록한 발생 시각(event time)과 실제 수신 시각(receipt/availability time)은 서로 다를 수 있습니다.
| 데이터 | 발생 시각 | 수신 시각 | 합성 값 | 결정 시점 상태 |
|---|---|---|---|---|
| A | 12:00:00.350 | 12:00:00.400 | 100 | 사용 가능 |
| B | 12:00:00.450 | 12:00:00.800 | 101 | 늦게 수신 |
| C | 12:00:00.580 | 12:00:00.650 | 102 | 미래 발생 |
실제 pandas 계산 결과
| 결합 방식 | 선택 결과 | 문제 또는 해석 |
|---|---|---|
| backward | B · 101 | 이벤트는 이전이지만 당시 수신 전 |
| nearest | B · 101 | 가장 가까운 이벤트지만 수신 전 |
| forward | C · 102 | 의사결정 이후 발생 |
| 발생+수신 이중 조건 | A · 100 | 12:00:00.500 전에 이용 가능 |
발생·수신 시간 이중 검사: A 선택
실무에서는 무엇을 검사해야 할까?
연구 시점보다 이벤트 발생 시각과 실제 입수 가능 시각이 모두 이른지 확인한 뒤, 종목·시장·버전·허용 최대 지연을 검사합니다. 누락되거나 너무 오래된 데이터는 임의로 미래값으로 채우지 않습니다.
pandas의 기본 backward 매칭만 사용하거나 DuckDB ASOF 결과의 오른쪽 시간 컬럼을 생략하면, 이력상 그럴듯해 보이는 값을 실제로 알 수 있었던 시각과 혼동할 수 있습니다. 공개 예제는 설명 목적이며 우리 거래 엔진의 오류·수익·전략을 입증하지 않습니다.
공식 문서·재현성
pandas merge_asof · DuckDB ASOF JOIN
pandas 2.2.3로 합성 세 행을 계산했습니다. 실제 시장·백테스트 성과가 아닙니다.