Skip to main content

백테스트의 함정

Views 95약 11분생성형 AI 활용
Summary

백테스트는 증거이지 보증서가 아니다

백테스트를 처음 해보면 쉽게 흥분한다. 몇 줄의 코드로 전략을 만들고, 과거 데이터를 넣었더니 시장보다 높은 수익률이 나온다. 누적 수익률 곡선은 우상향하고, MDD도 생각보다 낮다. "이 전략대로 투자하면 되겠다"는 생각이 든다.

하지만 여기서 멈추면 위험하다. 백테스트는 전략이 과거에 어떻게 작동했는지 보여주는 실험 결과다. 미래 수익을 보장하는 증명서가 아니다. 더 정확히 말하면 백테스트는 "이 가정이 모두 맞다면, 과거에는 이런 결과가 나왔다"는 보고서에 가깝다.

문제는 그 가정이 자주 틀린다는 데 있다. 데이터에 미래 정보가 섞였을 수 있다. 지금 살아남은 종목만 가지고 과거를 다시 계산했을 수 있다. 거래비용을 너무 낮게 잡았을 수 있다. 팔고 싶을 때 실제로는 팔 수 없는 종목을 종가에 전량 매도했다고 가정했을 수도 있다.

좋은 퀀트 투자자는 백테스트 결과를 보고 바로 믿지 않는다. 먼저 의심한다. "이 성과가 진짜 전략의 힘인가, 아니면 실험 설계의 착시인가?" 이 질문을 던지는 순간 백테스트는 훨씬 강해진다.

백테스트의 함정AI 생성 이미지

과최적화: 과거 시험지만 외운 전략

과최적화는 전략을 과거 데이터에 지나치게 맞추는 것이다. 쉽게 말해 과거 시험 문제의 답을 외운 학생과 비슷하다. 그 학생은 같은 시험지를 다시 풀면 만점을 받는다. 하지만 새 문제가 나오면 약하다.

예를 들어 이동평균선 전략을 만든다고 해보자. 처음에는 20일 이동평균선과 60일 이동평균선을 사용했다. 결과가 평범했다. 그래서 여러 조합을 시험한다.

  • 5일 / 20일

  • 10일 / 60일

  • 20일 / 120일

  • 30일 / 200일

  • 17일 / 83일

  • 23일 / 147일

여기에 손절 기준, 익절 기준, 리밸런싱 주기, 종목 수, 거래량 조건까지 추가하면 조합은 금방 수백 개가 된다. 그중 가장 성과가 좋은 조합을 고르면 당연히 멋진 결과가 나온다. 문제는 그 결과가 전략의 우수성 때문인지, 수많은 시도 중 우연히 잘 맞은 조합을 고른 것인지 알기 어렵다는 점이다.

이것이 과최적화다. 전략이 시장의 반복 가능한 패턴을 찾은 것이 아니라, 특정 기간의 우연한 흔적에 딱 맞춰진 것이다.

과최적화를 줄이려면 몇 가지 원칙이 필요하다.

첫째, 규칙은 가능한 단순해야 한다. "최근 6개월 수익률이 높은 종목을 산다"는 규칙은 이해하기 쉽다. 반면 "17일 이동평균선이 83일 이동평균선을 넘고, 최근 11일 거래량 증가율이 37% 이상이며, 변동성이 특정 구간일 때만 매수한다"는 규칙은 의심해봐야 한다. 복잡한 규칙이 항상 나쁜 것은 아니지만, 복잡할수록 우연에 맞춰졌을 가능성이 커진다.

둘째, 전략을 만든 기간과 검증하는 기간을 나눠야 한다. 예를 들어 2010년부터 2018년까지의 데이터로 전략을 설계했다면, 2019년 이후 데이터는 손대지 않고 마지막 검증에 사용한다. 앞의 기간을 학습 구간, 뒤의 기간을 테스트 구간이라고 생각하면 된다.

셋째, 작은 변화에도 성과가 무너지는지 확인해야 한다. 20일 이동평균선에서는 좋고 21일 이동평균선에서는 나쁘다면 그 전략은 튼튼하지 않을 가능성이 높다. 좋은 전략은 대체로 주변 조건에서도 비슷한 방향의 결과를 보여준다.

데이터 스누핑: 많이 뒤지면 무엇이든 나온다

데이터 스누핑은 같은 데이터를 계속 들여다보며 우연한 패턴을 찾아내는 문제다. 과최적화와 비슷하지만, 조금 더 넓은 개념이다. 전략 하나의 파라미터를 조정하는 것을 넘어, 수많은 아이디어를 같은 데이터에서 반복적으로 시험하는 상황을 포함한다.

예를 들어 이런 식이다.

"1월에는 소형주가 강한가?"

"월요일에 산 주식은 금요일에 팔면 좋은가?"

"PER이 낮은 종목이 좋은가?"

"PBR이 낮은 종목은 어떤가?"

"ROE와 모멘텀을 섞으면 더 좋은가?"

"거래량이 늘어난 종목은 다음 주에 오르는가?"

이런 실험 자체는 나쁘지 않다. 퀀트 투자는 원래 가설을 만들고 검증하는 과정이다. 문제는 수십, 수백 개의 가설을 시험한 뒤 성과가 좋았던 것만 기억하는 데 있다. 우연히 잘 나온 전략은 반드시 생긴다. 동전을 100번 던져서 앞면이 많이 나온 동전만 고른 뒤 "이 동전은 앞면이 잘 나온다"고 말하는 것과 비슷하다.

데이터 스누핑을 줄이려면 실험 기록을 남겨야 한다. 성공한 전략만 기록하지 말고 실패한 전략도 함께 적어야 한다. 그래야 내가 얼마나 많은 시도를 했는지 알 수 있다. 또한 전략을 보기 좋게 다듬기 전에 처음 세운 가설이 무엇이었는지 남겨야 한다.

좋은 질문은 이렇다.

  • 이 전략은 어떤 투자 논리에 기반하는가?

  • 비슷한 규칙을 몇 번이나 시험했는가?

  • 가장 좋은 결과만 고른 것은 아닌가?

  • 다른 기간, 다른 시장, 다른 종목군에서도 비슷한가?

백테스트에서 중요한 것은 "좋은 결과를 찾는 능력"만이 아니다. 우연히 좋은 결과를 걸러내는 능력이 더 중요하다.

생존자 편향: 살아남은 종목만 보는 착시

생존자 편향은 현재 살아남은 대상만 보고 과거를 판단할 때 생긴다. 주식 백테스트에서는 매우 흔하다.

예를 들어 현재 코스피200에 포함된 종목만 모아 10년 전부터 백테스트한다고 해보자. 얼핏 합리적으로 보인다. 대형 우량주를 대상으로 검증하는 것처럼 보인다. 하지만 여기에는 문제가 있다. 현재 코스피200에 들어 있는 기업들은 지난 10년 동안 어느 정도 살아남고 성장한 기업들이다. 과거에는 코스피200에 있었지만 지금은 빠진 기업, 실적이 악화된 기업, 상장폐지된 기업은 제외된다.

이렇게 되면 백테스트 성과는 실제보다 좋아질 수 있다. 실패한 종목이 사라지고, 살아남은 종목만 남기 때문이다. 마치 성공한 창업가만 인터뷰한 뒤 "창업하면 대부분 성공한다"고 결론 내리는 것과 같다.

생존자 편향을 줄이려면 해당 시점에 실제로 투자 가능했던 종목군을 사용해야 한다. 2015년에 백테스트를 한다면 2015년에 존재했고 거래 가능했던 종목들을 기준으로 해야 한다. 현재의 구성 종목을 과거에 그대로 적용하면 안 된다.

현실적으로 초보자가 완벽한 과거 종목 구성 데이터를 구하기는 어렵다. 그래서 처음에는 한계를 인정하는 것이 중요하다. 보고서에 이렇게 적어야 한다.

"이 백테스트는 현재 거래 가능한 종목만 사용했으므로 생존자 편향이 있을 수 있다."

이 한 줄은 사소해 보이지만 중요하다. 백테스트의 약점을 알고 있는 사람과 모르는 사람의 차이를 만든다.

룩어헤드 바이어스: 미래를 보고 과거에 투자하는 실수

룩어헤드 바이어스는 미래에 알 수 있는 정보를 과거 시점에서 사용했을 때 생긴다. 백테스트에서 가장 치명적인 오류 중 하나다. 성과를 극적으로 좋게 만들 수 있지만, 실제 투자에서는 절대 재현할 수 없다.

대표적인 예가 재무제표 데이터다. 어떤 기업의 2024년 말 실적은 2024년 12월 31일에 바로 알 수 있는 정보가 아니다. 보통 실적 발표와 사업보고서 공시까지 시간이 걸린다. 그런데 백테스트에서 2024년 말 재무 지표를 2025년 1월 초 종목 선정에 사용하면 미래 정보를 미리 사용한 셈이 된다.

가치 전략에서 이런 실수가 자주 나온다.

  • 3월 말에 공개된 재무제표를 1월 리밸런싱에 사용한다.

  • 연말 기준 PER, PBR, ROE를 그해 초부터 알고 있었다고 가정한다.

  • 수정된 데이터베이스의 최신 값을 과거 시점에도 그대로 적용한다.

가격 데이터에서도 룩어헤드 바이어스가 생긴다. 예를 들어 "오늘 종가가 20일 이동평균선 위에 있으면 오늘 종가에 매수한다"고 구현하면 문제가 될 수 있다. 오늘 종가를 확인하려면 장이 끝나야 한다. 그런데 같은 종가로 매수했다고 가정하면 실제보다 유리한 체결이 된다. 더 보수적으로 하려면 오늘 신호를 확인한 뒤 다음 거래일 시가나 종가에 매수한다고 가정하는 편이 낫다.

룩어헤드 바이어스를 피하는 핵심은 간단하다.

"그 시점의 투자자가 실제로 알 수 있었던 정보만 사용했는가?"

이 질문을 모든 데이터 열에 던져야 한다. 가격, 재무제표, 지수 편입 정보, 애널리스트 추정치, 뉴스 데이터 모두 마찬가지다.

거래비용과 세금: 작은 숫자가 성과를 갉아먹는다

백테스트에서 수수료와 세금을 빼지 않으면 성과가 과장된다. 특히 매매가 잦은 전략일수록 차이가 크다.

예를 들어 한 번 매수하고 오래 보유하는 전략은 거래비용의 영향이 상대적으로 작다. 반면 매주 종목을 갈아타는 모멘텀 전략은 다르다. 매수와 매도 때마다 수수료가 발생하고, 시장 가격보다 불리하게 체결되는 슬리피지도 생긴다. 세금까지 고려하면 누적 성과는 크게 달라질 수 있다.

슬리피지는 주문을 낸 가격과 실제 체결 가격의 차이다. 백테스트에서는 종가 10,000원에 매수했다고 나오지만, 실제로는 10,020원이나 10,050원에 체결될 수 있다. 유동성이 낮은 종목에서는 차이가 더 커진다.

그래서 백테스트에는 최소한 다음 가정을 넣어야 한다.

  • 매수·매도 수수료

  • 세금 또는 매도 비용

  • 슬리피지

  • 리밸런싱 빈도

  • 연간 회전율

회전율은 포트폴리오가 얼마나 자주 바뀌는지를 나타낸다. 회전율이 높으면 거래비용에 민감하다. 수익률이 좋아 보여도 대부분이 비용으로 사라질 수 있다.

좋은 습관은 비용을 보수적으로 잡는 것이다. 비용을 낮게 잡아야만 살아남는 전략이라면 실제 투자에서는 더 위험하다. 반대로 비용을 넉넉히 반영해도 성과가 유지되는 전략은 조금 더 신뢰할 수 있다.

유동성과 체결 가능성: 살 수 있어야 전략이다

백테스트는 종종 모든 거래가 원하는 가격에 즉시 체결된다고 가정한다. 하지만 현실 시장은 그렇지 않다. 특히 소형주, 거래량이 적은 종목, 급등락 종목에서는 백테스트와 실제 투자 사이의 차이가 커진다.

예를 들어 어떤 전략이 하루 거래대금 2억 원인 종목을 5억 원어치 사라고 한다면 어떻게 될까? 실제로는 원하는 가격에 모두 살 수 없다. 내가 사는 행위 자체가 가격을 밀어 올릴 수 있다. 팔 때도 마찬가지다. 백테스트에서는 종가에 깔끔하게 매도되지만, 실제 시장에서는 매도 물량 때문에 가격이 내려갈 수 있다.

그래서 전략에는 유동성 조건이 필요하다.

  • 최근 평균 거래대금이 일정 수준 이상인 종목만 거래한다.

  • 한 종목 매수 금액이 평균 거래대금의 일정 비율을 넘지 않게 한다.

  • 하한가, 거래정지, 관리종목 같은 특수 상황을 고려한다.

  • 너무 작은 종목에 과도하게 집중하지 않는다.

개인 투자자는 기관보다 자금 규모가 작기 때문에 유동성 문제가 덜할 수 있다. 하지만 완전히 무시해도 된다는 뜻은 아니다. 특히 백테스트 성과가 대부분 거래량이 적은 소형주에서 나왔다면 더 조심해야 한다.

투자 전략은 "계산상 수익이 나는 규칙"이 아니라 "현실에서 실행 가능한 규칙"이어야 한다.

벤치마크 없이 성과를 말할 수 없다

전략 수익률이 50%라고 해보자. 좋아 보인다. 그런데 같은 기간 시장이 80% 올랐다면 이야기가 달라진다. 전략은 돈을 벌었지만 시장보다 못했다. 반대로 전략 수익률이 5%에 불과해도 시장이 -20%였다면 방어력 있는 전략일 수 있다.

그래서 백테스트에는 반드시 벤치마크가 필요하다. 벤치마크는 비교 기준이다. 한국 대형주 전략이라면 코스피나 코스피200을 사용할 수 있다. 미국 대형주 전략이라면 S&P 500 ETF를 사용할 수 있다. 성장주 전략, 소형주 전략, 배당주 전략이라면 그 성격에 맞는 지수나 ETF를 비교 대상으로 삼는 것이 좋다.

벤치마크와 비교할 때는 단순 누적 수익률만 보면 부족하다. 같은 수익률이라도 위험이 다를 수 있기 때문이다. 전략이 시장보다 조금 더 벌었지만 MDD가 두 배라면 좋은 전략이라고 말하기 어렵다. 반대로 수익률은 비슷하지만 변동성과 MDD가 낮다면 투자자에게 더 적합할 수 있다.

좋은 비교는 이렇게 한다.

  • 전략과 벤치마크의 누적 수익률

  • 연평균 수익률

  • 변동성

  • 최대 낙폭

  • 샤프 비율

  • 하락장에서의 성과

  • 회복 기간

전략은 혼자 있을 때가 아니라 비교될 때 의미가 분명해진다.

좋은 백테스트 보고서에 들어가야 할 것

백테스트 결과를 다른 사람에게 보여주거나 스스로 판단하려면 보고서 형태로 정리해야 한다. 그래야 나중에 같은 전략을 다시 검토할 수 있고, 어디서 착시가 생겼는지도 찾기 쉽다.

좋은 백테스트 보고서에는 최소한 다음 내용이 들어가야 한다.

1. 전략 가설

이 전략이 어떤 생각에서 출발했는지 적는다. 예를 들어 "최근 6개월 수익률이 높은 종목은 다음 달에도 상대적으로 강할 것이다"처럼 검증 가능한 문장이어야 한다.

2. 투자 대상과 데이터 기간

어떤 시장, 어떤 종목군, 어떤 기간을 사용했는지 적는다. 현재 생존 종목만 사용했는지, 과거 구성 종목을 반영했는지도 함께 적는다.

3. 매수·매도 규칙

종목 선정 기준, 비중 배분, 리밸런싱 주기, 매수·매도 가격 가정을 명확히 쓴다. 다른 사람이 읽고 같은 결과를 재현할 수 있어야 한다.

4. 비용과 현실 가정

수수료, 세금, 슬리피지, 거래 가능 금액, 유동성 필터를 적는다. 비용이 빠진 백테스트라면 "비용 미반영"이라고 분명히 표시해야 한다.

5. 벤치마크

전략과 비교할 기준을 제시한다. 벤치마크가 없으면 전략이 정말 좋은지 판단하기 어렵다.

6. 성과 지표

누적 수익률, 연평균 수익률, 변동성, MDD, 샤프 비율, 승률, 손익비, 회전율 등을 함께 본다. 한 가지 숫자만으로 전략을 평가하지 않는다.

7. 구간별 성과

전체 기간 성과만 보지 말고 연도별, 상승장, 하락장, 횡보장 성과를 나눠본다. 특정 한두 해의 수익이 전체 결과를 만든 것이라면 주의해야 한다.

8. 한계와 의심 지점

생존자 편향 가능성, 룩어헤드 바이어스 점검 여부, 데이터 품질 문제, 실제 체결 가능성 등을 적는다. 좋은 보고서는 장점만 쓰지 않는다. 약점도 함께 보여준다.

AI에게 백테스트 검토를 맡길 때의 태도

앞으로 우리는 AI를 활용해 코드 작성, 오류 분석, 리포트 생성을 할 것이다. AI는 백테스트 검토에도 도움이 된다. 예를 들어 다음처럼 물어볼 수 있다.

이 백테스트 코드에서 룩어헤드 바이어스가 발생할 가능성이 있는 부분을 찾아줘.

이 전략 보고서에서 빠진 비용 가정과 리스크 지표를 지적해줘.

생존자 편향이 생길 수 있는 데이터 구성인지 점검해줘.

하지만 AI가 "문제없다"고 말해도 그대로 믿으면 안 된다. AI는 코드를 그럴듯하게 설명할 수 있지만, 실제 데이터의 기준일, 공시 시점, 거래 가능 여부까지 자동으로 보장하지는 않는다. AI는 검토자를 돕는 보조원이지 최종 책임자가 아니다.

백테스트의 책임은 투자자에게 있다. AI가 작성한 코드일수록 더 꼼꼼히 확인해야 한다.

과거에 잘 된 전략이 미래에 실패하는 이유

전략이 미래에 실패하는 이유는 다양하다. 과거에는 통했던 시장 구조가 바뀔 수 있다. 많은 사람이 같은 전략을 따라 하면서 수익 기회가 사라질 수 있다. 금리, 유동성, 규제, 산업 구조가 변할 수도 있다. 단순히 과거 결과가 우연이었을 수도 있다.

그래서 우리는 백테스트를 버려야 하는 것이 아니다. 더 겸손하게 사용해야 한다.

백테스트는 이런 질문에 답해준다.

  • 이 아이디어가 과거에 전혀 말이 안 되는 것은 아니었는가?

  • 어떤 시장 환경에서 강했고, 어떤 환경에서 약했는가?

  • 손실이 났을 때 얼마나 견뎌야 했는가?

  • 비용을 반영해도 남는 것이 있었는가?

  • 벤치마크와 비교했을 때 의미 있는 차이가 있었는가?

반대로 백테스트가 답해줄 수 없는 것도 있다.

  • 이 전략이 앞으로 반드시 돈을 벌 것인가?

  • 다음 달 수익률이 얼마인가?

  • 위기가 왔을 때 투자자가 끝까지 버틸 수 있는가?

  • 데이터에 잡히지 않은 사건이 발생하면 어떻게 될 것인가?

이 한계를 이해하면 백테스트는 훨씬 유용해진다. 백테스트는 미래를 맞히는 도구가 아니라, 투자 아이디어를 더 엄격하게 다루는 도구다.

체크리스트: 백테스트 결과를 보기 전에 물어볼 것

마지막으로 백테스트를 해석하기 전 반드시 확인할 질문을 정리하자.

  • 전략 규칙이 지나치게 복잡하지 않은가?

  • 너무 많은 조합을 시험한 뒤 가장 좋은 것만 고른 것은 아닌가?

  • 학습 기간과 테스트 기간을 나누었는가?

  • 현재 살아남은 종목만 사용하지 않았는가?

  • 해당 시점에 실제로 알 수 있었던 정보만 사용했는가?

  • 매수·매도 신호와 체결 시점이 현실적인가?

  • 수수료, 세금, 슬리피지를 반영했는가?

  • 유동성이 낮은 종목을 비현실적으로 거래하지 않았는가?

  • 벤치마크와 비교했는가?

  • 누적 수익률뿐 아니라 MDD, 변동성, 샤프 비율을 함께 보았는가?

  • 특정 기간의 운 좋은 성과에 지나치게 의존하지 않는가?

  • 전략이 왜 작동해야 하는지 투자 논리가 있는가?

이 질문에 모두 완벽히 답해야만 투자할 수 있다는 뜻은 아니다. 현실의 백테스트는 언제나 불완전하다. 중요한 것은 불완전함을 모른 채 확신하는 것이 아니라, 한계를 알고도 감당 가능한 크기로 실험하는 것이다.

주식은 예언하는 것이 아니라 가설을 세우고 검증하는 것이다. 그리고 좋은 검증은 좋은 의심에서 시작된다.

책 목록

처음 만나는 AI 퀀트 투자: 파이썬과 AI로 투자 아이디어를 검증하는 법

전체 목차 보기

이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.

틸노트는 사용자가 AI를 활용해 노트를 쉽게 작성하거나 편집할 수 있는 서비스입니다.

AI 스퀘어 단톡방에 함께해요

AI 활용과 틸노트 사용 팁을 나누는 오픈채팅방입니다. 입장 비밀번호는 tilnote입니다.

참여하기