2026-10-12 · Kverse
죽은 종목은 말이 없다 — 백테스트의 생존편향과 데이터 결측
백테스트 수익률이 실제보다 좋아 보이는 흔한 이유는 전략이 뛰어나서가 아니라, 데이터가 살아남은 종목만 기억하기 때문입니다. 이 이야기를 원론으로 풀기 전에, 저희 엔진이 실제로 당한 사고부터 공개하겠습니다.
2026년 9월 2일 나이틀리 산출에서 미국 주간 시세를 받아오는 일괄 조회의 일부 배치가 빈 채로 돌아왔습니다. 오류도 경고도 없었습니다. 시세가 필요한 티커 697개 중 466개만 채워졌고 231개가 비었습니다. 결측은 알파벳 C부터 F 구간에 몰려 있었는데, 정렬한 티커를 120개씩 끊어 요청하는 구조에서 배치 한두 개가 통째로 실패했다는 흔적입니다. 문제는 그다음입니다. 결과 파일은 정상처럼 저장됐고, 캐시와 게시본까지 조용히 덮어썼습니다.
성적표는 즉시 뒤틀렸습니다. 시뮬레이터에는 가격이 없는 종목을 목표에서 떨어뜨리고 남은 종목으로 비중을 재배분하는 로직이 있습니다. 원래 상장폐지 대응으로 넣은 장치인데, 대량 결측이 들어오자 그 문으로 멀쩡히 살아 있는 종목들이 함께 빠져나갔습니다. 목표 8종목으로 굴러야 할 전략의 실제 보유가 3~5종목으로 쪼그라들었습니다. 52주 신고가 근접도를 실측 시세로 계산하는 ST-18은 후보의 3분의 1이 자격 자체를 잃어 열등한 대안을 담았고, 연평균 수익률이 36%대에서 18.7%로 반토막 났습니다. 사고를 처음 알린 신호는 수익률이 아니라 ST-18이 ST-16보다 낮게 나온다는 순위의 어색함이었습니다.
여기서 생존편향과 만납니다. 결측을 상장폐지처럼 다루는 그 로직 자체가 원래는 생존편향에 대한 대응이었습니다. 구루의 보유 내역은 상장폐지된 종목까지 공시 원문에 남지만, 공개된 시세는 현재 상장 종목 중심이라 죽은 종목의 가격 이력은 아예 없거나 중간에 끊깁니다. 시그널은 있는데 가격이 없는 종목이 생기고, 이들을 조용히 빼면 백테스트는 결국 살아남을 종목만 골라 담은 포트폴리오가 됩니다. 엔진은 2012년 12월 31일부터 2026년 8월 31일까지 714주의 주간 격자를 깔고 2013년 6월 말 분기부터 시뮬레이션하는데, 구간이 길수록 그사이 사라진 종목도 많아지므로 장기 백테스트일수록 이 편향은 커집니다. 그런데 같은 문으로 수집 실패라는 전혀 다른 원인이 들어오자, 편향을 막으려던 장치가 반대로 성적을 통째로 왜곡했습니다.
지금은 시세 적재 단계에 세 겹의 가드를 넣었습니다. 첫째, 빠진 티커를 25개와 8개짜리 작은 배치로 다시 요청합니다. 큰 배치는 통째로 실패하기 쉽기 때문입니다. 둘째, 재시도로도 못 받은 티커는 직전 캐시에서 주간 격자에 맞춰 이어 붙입니다. 부분 실패가 과거 구간까지 함께 지우지 않게 하기 위해서입니다. 셋째, 그러고도 커버리지가 85% 미만이면 예외를 던져 캐시와 게시본을 갱신하지 않습니다. 어설픈 숫자를 올리느니 이전 정상본을 그대로 두는 편이 낫다는 판단입니다. 여기에 주간 격자가 이중화되지 않았는지, 지수 시세가 제대로 왔는지를 따로 확인하는 가드도 함께 걸어 두었습니다.
재수집 후 현재 공개된 값은 이렇습니다. 시세가 필요한 티커 697개 중 691개를 확보해 커버리지 99.1%, 소실은 6개입니다. 소실된 티커는 CMA, CTRA, CYBR, FATLF, HES, WBA 여섯 개입니다. ST-18의 연평균 수익률은 36.6%로, ST-16은 35.3%로 돌아와 순위도 제자리를 찾았습니다. 다만 한 가지는 낙관적으로 읽지 마시기 바랍니다. 마지막 유효 가격으로 청산 처리한 상장폐지 건수는 현재 0건인데, 이는 죽은 종목이 없었다는 뜻이 아닙니다. 가격 이력이 중간에 끊긴 종목만 청산으로 잡히고, 아예 한 줄도 오지 않는 종목은 청산이 아니라 소실로 분류되기 때문입니다. 청산 0건과 소실 6개는 같은 현상의 두 얼굴일 수 있습니다.
그래서 백테스트를 읽는 순서를 제안합니다. 수익률 곡선보다 커버리지 숫자를 먼저 보십시오. 확인할 것은 세 가지입니다. 후보 중 몇 퍼센트의 가격 이력을 확보했는지, 죽은 종목을 어떤 규칙으로 처리했는지, 그리고 남은 오차가 성과에 유리한 방향인지 불리한 방향인지. 이 셋을 밝히지 않은 백테스트는 얼마나 부풀려졌는지 가늠할 방법 자체가 없습니다. 저희가 /13f/backtest 화면의 '계산 방법과 한계'에 필요 티커 수와 가격 확보 수, 소실 개수, 상장폐지 청산 건수를 그대로 적어 두는 이유가 이것입니다.
없는 데이터는 오류를 내지 않습니다. 조용히 성적표만 바꿉니다. 화려한 곡선을 만나면 먼저 물어보시기 바랍니다. 죽은 종목은 어디에 있습니까.
이 글은 정보 제공 목적이며 투자 조언이 아닙니다. 각 도구의 계산 방법과 한계는 이용 가이드에서 확인하세요.