백테스트 오류 체크리스트 7가지 | 미래 정보 누수·생존 편향



안녕하세요, 육성라이프입니다 😊

주식 스크리너를 만들며 백테스트를 수십 번 돌렸습니다. 돌아보면 결론을 뒤집은 건 대부분 전략이 아니라 검증 과정의 실수였습니다. 4편에서는 정정 공시 하나를 걸러내자 1순위 신호가 ‘효과 없음’으로 떨어지기도 했죠.

유튜브나 커뮤니티에서 “백테스트 수익률 ○○%” 같은 숫자를 자주 봅니다. 그 숫자가 믿을 만한지는 어떻게 검증했는지에 달려 있습니다. 이번 글은 제가 직접 저질렀거나 직전에 잡아낸 실수를 모아 만든 백테스트 오류 체크리스트 7가지입니다. 직접 백테스트를 하시는 분은 물론, 남이 보여 주는 수익률을 판단할 때도 쓸 수 있습니다.

✅ 체크리스트 한눈에 보기
① 미래 정보 누수 ② 잘못된 비교 대상 ③ 늦게 알려진 정보(정정·지연 공시) ④ 생존 편향과 가격 왜곡 ⑤ 다중 검정 ⑥ 평균의 함정 ⑦ 진입 시점

① 미래 정보 누수 — 그날 알 수 없던 정보를 썼나

가장 흔하고 가장 치명적인 실수입니다. 예를 들어 “오늘 거래량이 3배”라는 신호는 장이 끝나야 알 수 있습니다. 그런데 그날 시가에 샀다고 계산하면, 미래를 보고 매매한 셈이 됩니다.

  • 신호는 종가 기준으로 확정하고, 매수는 다음 거래일 시가로 가정했습니다.
  • 장중 고가와 저가 중 무엇이 먼저였는지 모를 때는 불리한 쪽(손절)이 먼저라고 가정했습니다.
  • 주말에 나온 공시는 다음 거래일로 밀어 처리했습니다.
  • 공매도 잔고처럼 2거래일 늦게 공개되는 데이터는 공개 시점 기준으로만 썼습니다.

검증 방법은 간단합니다. 계산 코드에 일부러 ‘미래 데이터’를 넣어 보고, 결과가 바뀌지 않아야 정상입니다.

모니터에 표시된 프로그램 코드
미래 정보 누수는 코드 한 줄에서 생깁니다. 날짜를 하루 밀어 계산하는 것만으로 결과가 크게 달라질 수 있습니다.
사진: Godfrey Atima · Pexels (Pexels 라이선스)

② 잘못된 비교 대상 — 무엇보다 나았나

“이 전략은 연 15% 수익”이라는 말만으로는 아무것도 알 수 없습니다. 같은 기간 시장이 20% 올랐다면 오히려 진 겁니다.

저도 처음엔 전체 종목 평균과 비교했다가 착시에 빠졌습니다. 실적을 공시하는 회사엔 대형주가 많은데, 그 기간 대형주가 강했던 덕에 신호가 ‘유효’처럼 보였던 겁니다. 시가총액이 비슷한 종목(시총 5분위)과 비교하자 효과가 크게 줄었습니다.

💡 좋은 비교 대상은 ‘그 전략을 쓰지 않았다면 대신 샀을 것’입니다. 개인투자자라면 지수 ETF, 같은 규모의 무작위 종목이 현실적인 기준입니다.

③ 늦게 알려진 정보 — 정정·지연 공시

공시 데이터를 쓸 때 특히 조심해야 합니다. 분기·반기보고서는 분기가 끝난 뒤 45일 안에, 사업보고서는 90일 안에 내야 합니다. 그런데 제출 기한이 한참 지난 날짜로 잡힌 공시가 있었습니다. 정정 공시나 지연 제출이었죠. 이미 알려진 정보를 새 신호로 착각한 겁니다.

처리결과
정정·지연 공시 포함영업이익 개선 t 2.32 / 실적 호재+내부자 매수 t 1.82
법정 기한 7일 초과 공시 제외영업이익 개선 t 2.78 / 실적 호재+내부자 매수 t 0.17
펜으로 달력에 날짜를 표시하는 손
공시는 ‘언제 알려졌는가’가 핵심입니다. 법정 제출 기한을 기준으로 늦은 공시를 걸러냈습니다.
사진: Towfiqu barbhuiya · Pexels (Pexels 라이선스)

④ 생존 편향과 가격 왜곡

지금 상장된 종목만으로 과거를 시험하면, 그 사이 상장폐지된 종목이 빠집니다. 망한 회사를 뺀 성적표는 실제보다 좋게 나올 수밖에 없습니다. 그래서 종목별로 데이터를 받지 않고 날짜별로 그날 거래된 전 종목을 받는 방식을 고집했습니다.

또 액면분할·병합·감자로 가격이 끊긴 종목은 하루에 수십 % 오르내린 것처럼 보입니다. 하루 ±31%를 넘는 변동이 보유 기간에 끼어 있으면 그 사례는 계산에서 뺐습니다. 공매도가 전면 금지됐던 기간(2023년 11월~2025년 3월)의 공매도 잔고 데이터도 빈칸으로 처리했습니다.

⑤ 다중 검정 — 많이 시험하면 우연도 통과한다

신호 19개를 시험하면, 효과가 하나도 없어도 t값 2 근처가 한두 개는 우연으로 나옵니다. 20개 중 1개는 우연히 ‘유효’가 나오는 게 정상이라는 뜻입니다.

  • 시험한 신호 개수를 기록해 두고, 결과를 볼 때 그 숫자를 함께 봅니다.
  • t값 2를 겨우 넘은 신호보다 여러 해에 걸쳐 일관된 신호를 믿습니다.
  • 판정에는 최소 5년 이상 데이터를 요구했습니다.
흰 눈이 그려진 파란 주사위 두 개
주사위를 스무 번 던지면 운 좋은 숫자가 나오기 마련입니다. 신호를 많이 시험할수록 기준을 높여야 합니다.
사진: Max Bonda · Pexels (Pexels 라이선스)

⑥ 평균의 함정 — ‘보통의 한 종목’은 이겼나

평균 초과수익이 +2%p라도, 소수의 큰 상승이 평균을 끌어올렸을 수 있습니다. 제 검증에서 가장 튼튼했던 영업이익 개선 신호도 시장을 이긴 종목 비율은 약 44%였습니다. 내부자 매수는 약 42%였고요.

그래서 결과표에는 평균과 함께 이긴 비율, 연도별 플러스 비율을 꼭 넣습니다. 이긴 비율이 50%가 안 되는 전략이라면 한두 종목에 몰아서 투자하면 안 되고, 여러 종목에 나눠야 평균에 가까운 결과를 기대할 수 있습니다.

⑦ 진입 시점 — 신호가 나온 지 얼마나 지났나

백테스트는 “공시 다음 날 매수”를 기준으로 계산했는데, 실제 추천 목록에는 몇 주 지난 신호까지 섞여 있었습니다. 이미 지나간 구간의 수익은 지금 사서는 얻을 수 없습니다.

그래서 신호 후 5·20·40거래일째에 샀을 때 남은 기대 초과수익을 따로 검증하게 했습니다. 그 결과 흥미로운 일이 벌어졌습니다.

기준일추천 가능 종목이유
10월 2일0개모든 신호가 검증된 진입 기간을 지남
8월 19일 (반기보고서 마감 직후)156개같은 시기에 나온 실적 신호가 한꺼번에 유효

실적 신호는 분기 보고서 마감 직후 며칠에만 의미가 있다는 뜻입니다. 매일 새 종목이 나오는 전략이 아니었던 거죠.

책상 위에 놓인 분석 데이터 시트
결과표에는 평균뿐 아니라 이긴 비율, 연도별 결과, 진입 시점별 남은 수익을 함께 넣었습니다.
사진: Tima Miroshnichenko · Pexels (Pexels 라이선스)

보너스 — 계산 엔진부터 검증하기

실제 데이터를 넣기 전에 계산 엔진 자체를 시험했습니다.

  1. 효과를 심은 가짜 데이터: “기관이 사면 오른다”는 효과를 일부러 넣은 데이터에서 그 효과를 찾아내는지 확인
  2. 완전 무작위 데이터: 20가지 정도의 무작위 데이터에서 ‘효과 없음’이 나오는지 확인
  3. 손계산 대조: 몇 개 사례를 직접 계산해 원 단위까지 맞는지 확인

이 세 가지를 통과하지 못한 엔진의 결과는 실제 데이터에서 아무리 좋아도 믿지 않았습니다.

정리 — 백테스트 오류 체크리스트

체크질문
① 미래 정보그날 알 수 없던 정보로 매매하지 않았나?
② 비교 대상시장이나 같은 규모 종목보다 나았나?
③ 정보 시점정정·지연 공시를 새 정보로 착각하지 않았나?
④ 생존 편향상장폐지 종목과 가격 왜곡을 처리했나?
⑤ 다중 검정몇 개를 시험해서 고른 결과인가?
⑥ 평균의 함정이긴 비율과 연도별 결과는 어떤가?
⑦ 진입 시점지금 사도 그 수익이 남아 있나?
⚠️ 투자 유의 — 이 글은 개인적으로 진행한 프로그램 개발·검증 기록이며 특정 종목의 매수·매도 권유가 아닙니다. 과거 백테스트 결과는 미래 수익을 보장하지 않으며, 투자 판단과 그 결과의 책임은 투자자 본인에게 있습니다.

“백테스트 오류 체크리스트 7가지 | 미래 정보 누수·생존 편향”에 대한 4개의 생각

댓글 남기기