본문으로 건너뛰기
JSL107's Tech Note
돌아가기

백테스트에서 생존 편향 제거하기

4분 분량이 글 고치기
목차 · 3

백테스트는 과거 당시 알 수 있었던 정보만으로 투자 규칙을 다시 실행해 보는 시뮬레이션이에요. 기존 구현은 과거 시장을 재현하면서도 후보 종목은 현재 상태를 기준으로 골랐고, 그 결과 생존 편향이 생겼어요.

현재의 종목 명단으로 과거를 재생한 문제

문제는 백테스트 저장소의 유니버스 조회 메서드의 조회 조건이었어요. 유니버스를 현재 상장 상태 조건으로 제한해서 백테스트 기간과 관계없이 현재까지 상장 상태를 유지한 종목만 후보에 올랐어요.

이 방식에서는 백테스트 기간에 정상적으로 거래됐더라도 이후 상장폐지된 종목은 과거 후보에서 빠져요. 전략이 그 종목을 매수했을 가능성과 그로 인해 손실을 봤을 가능성까지 함께 사라져요.

결국 시뮬레이션은 살아남은 종목의 과거만 재생해요. 성공한 종목은 남고 실패한 종목은 표본에서 빠지니 성과가 실제보다 좋아질 수 있는데, 이것이 생존 편향이에요.

시작일의 유니버스와 종목의 생명주기

유니버스 조회 기준을 “현재 상장되어 있는가”에서 “백테스트 시작일에 살아 있었는가”로 바꾸는 것이 핵심이었어요. 종목의 생명주기를 단순하게 나타내면 다음과 같아요.

상장 ───────── 거래 가능 ───────── 상장폐지
↑
백테스트 시작일

백테스트 시작일이 거래 가능 구간에 포함된다면 그 종목을 초기 유니버스에 넣어야 해요. 현재는 이미 상장폐지됐더라도 시작일 당시 거래할 수 있었다면 과거 시뮬레이션의 후보가 돼요.

반대로 백테스트 시작일 이후에 상장된 종목을 처음부터 후보에 넣으면 당시에는 알 수 없었던 대상을 사용하는 셈이에요. 유니버스는 현재 데이터의 상태가 아니라 시뮬레이션 시점의 상태를 기준으로 구성해야 해요. 이번 변경으로 현재의 생존자 목록을 과거에 덮어쓰지 않고, 시작 시점에 실제로 존재했던 종목 집합에서 백테스트를 시작하게 됐어요.

다만 시작일을 기준으로 유니버스를 구성하는 것만으로는 충분하지 않았어요. 시작할 때 거래할 수 있던 종목도 재생 도중 상장폐지될 수 있기 때문이에요.

상장폐지된 뒤에는 시세 데이터가 더 이상 들어오지 않아요. 재생 루프는 이 특성을 이용해 시세가 끊긴 종목을 새로운 매수 후보에서 제외하도록 했어요. 과거에는 존재했지만 해당 시점에는 더 이상 거래할 수 없는 종목이 계속 후보에 남는 일을 막기 위해서예요.

보유 여부는 별도로 처리해야 해요. 시세가 없다는 이유로 후보에서만 빼면 이미 매수한 종목은 계좌에 그대로 남아요. 마지막 가격을 유지한 채 평가 자산에 계속 반영되면서 상장폐지로 발생한 손실이 결과에서 빠지는 더 큰 왜곡이 생겨요.

그래서 보유 중인 종목이 상장폐지되면 해당 포지션을 청산하도록 처리했어요.

시작일에 거래 가능
↓
초기 유니버스 포함
↓
재생 중 시세 존재 ──→ 매수 후보 유지
↓
시세 중단·상장폐지
├─ 신규 후보에서 제외
└─ 보유 포지션 청산

이 구조에서는 종목을 단순한 티커 목록이 아니라 상장, 거래, 상장폐지 상태를 지닌 객체로 다뤄요. 이제 백테스트는 가격 변화뿐 아니라 거래 대상의 생명주기까지 재생해요.

실패한 종목도 시뮬레이션에 남긴 결과

변경한 뒤에는 시작일 당시 거래할 수 있었던 종목이 백테스트에 포함돼요. 이후 상장폐지된 종목도 폐지 전까지는 정상적으로 전략의 평가 대상이 되고, 보유 중에 폐지되면 포지션을 정리해요.

이제 실패한 종목이 현재 존재하지 않는다는 이유만으로 과거 기록 전체에서 사라지지 않아요. 전략은 그 종목을 선택할 가능성과 선택에 따른 결과를 함께 감당해요.

이번 변경으로 모든 백테스트 오차가 사라지는 것은 아니에요. 거래 비용, 체결 조건, 데이터 품질처럼 현실성을 좌우하는 문제는 여전히 남아 있어요. 다만 현재 생존한 종목만 재생하던 구조적 오류를 없애 성과를 과대평가하는 중요한 원인 하나를 줄였어요.

Paper trading이 현재부터 미래의 데이터를 쌓아 가는 과정이라면, backtest는 저장된 과거를 다시 구성하는 simulation이에요. 이때 가격만 과거로 돌려서는 안 돼요. 당시 어떤 종목이 존재했고 언제부터 거래할 수 없었는지까지 함께 되돌려야 해요.

백테스트의 신뢰도는 복잡한 수익률 공식보다 먼저 평가 대상을 올바르게 구성했는지에서 시작해요.

근거: 관련 변경 검토 기록


이 글 고치기
이 글 공유하기:

이전 글
나처럼 말하는 AI를 위한 윤문화 실험