4 분 분량

지난 글에서 수익률 계산을 배웠으니 이제 백테스트를 만들 차례인데, 그 전에 백테스트가 정확히 무엇인지부터 제대로 짚고 갑니다. 이번 글은 코드가 없는 개념 편입니다. 다음 글들에서 코드를 쓸 때 “지금 뭘 하고 있는 건지” 헷갈리지 않기 위한 준비입니다.

백테스트란 무엇인가

백테스트(backtest)는 한 문장으로 이렇게 정의할 수 있습니다.

“이 규칙대로 과거에 투자했다면 어떻게 됐을까?”를 데이터로 재현해 보는 것.

예를 들어 “매달 말에 최근 6개월 수익률이 플러스면 주식을 사고, 마이너스면 현금으로 도망간다”는 규칙이 있다고 합시다. 이 규칙이 좋은지 나쁜지 어떻게 알 수 있을까요? 지금부터 실제 돈으로 10년 실험해 볼 수는 없습니다. 대신 과거 10년 치 주가 데이터에 이 규칙을 그대로 적용해서, 매달 규칙이 시키는 대로 사고팔았다고 가정하고 계좌 잔고를 계산해 보는 겁니다. 이것이 백테스트입니다.

새 비행기를 실제로 띄우기 전에 시뮬레이터로 검증하는 것과 비슷합니다. 시뮬레이션을 통과했다고 실전에서 무조건 안전한 것은 아니지만, 시뮬레이션에서 추락하는 설계를 실전에 내보내지 않을 수는 있습니다.

왜 백테스트가 필요한가

백테스트 없이 투자 아이디어를 평가하는 방법은 사실상 두 가지뿐입니다. 남의 말을 믿거나, 실제 돈으로 실험하거나. 둘 다 비쌉니다. 백테스트는 세 번째 길을 열어줍니다.

  1. 가설을 걸러내는 필터 — “골든크로스가 나면 사면 된다더라” 같은 속설을 몇 시간 만에 데이터로 확인할 수 있습니다. 과거 20년 동안도 통하지 않았던 규칙이라면 굳이 내 돈으로 다시 확인할 필요가 없습니다.
  2. 전략의 성격 파악 — 수익률만이 아니라 “이 전략은 최악의 순간에 얼마나 깨지는가(낙폭)”, “몇 년씩 부진한 구간이 있는가”를 미리 봅니다. 실전에서 규칙을 버리게 되는 것은 대부분 수익이 낮아서가 아니라, 부진한 구간을 견딜 마음의 준비가 없어서입니다.
  3. 비교의 기준 — 아이디어 A와 B 중 무엇이 나은지, 같은 데이터 위에서 공정하게 비교할 수 있습니다.

백테스트의 4단계

어떤 백테스트든 구조는 같습니다. 나중에 코드로 만들 때도 이 4단계를 그대로 따라갑니다.

1단계: 규칙 정하기

무엇을, 언제 사고, 언제 팔지를 사람의 판단이 끼어들 틈 없이 명확하게 적습니다. “좋아 보이면 산다”는 규칙이 아닙니다. “최근 6개월 수익률 > 0이면 산다”는 규칙입니다. 판별 기준은 간단합니다. 그 규칙을 프로그래밍을 모르는 사람에게 줘도, 엑셀만 가지고 똑같은 매매 목록을 만들어낼 수 있어야 합니다. 애매한 단어(“과열”, “저평가”, “추세가 살아 있으면”)가 하나라도 들어 있으면 아직 규칙이 아닙니다.

2단계: 과거 데이터 준비

주가 데이터를 구합니다(이전에 다룬 FinanceDataReader가 이 단계의 도구입니다). 여기서 데이터의 품질이 백테스트 전체의 품질을 결정합니다. 수정주가인지, 배당이 반영됐는지, 상장폐지 종목이 빠져 있지 않은지 — 그 글에서 언급한 함정들이 전부 이 단계에서 스며듭니다.

3단계: 규칙을 기계적으로 적용

데이터의 처음부터 끝까지 시간 순서대로 진행하면서, 각 시점에 규칙이 시키는 매매를 기록합니다. 여기서 백테스트의 제1원칙이 나옵니다.

각 시점의 판단에는 그 시점까지 알 수 있었던 정보만 사용한다.

1월 말의 매매 판단에 2월 데이터가 조금이라도 끼어들면 그 백테스트는 무효입니다. 당연한 말 같지만, 코드로 구현하다 보면 놀랄 만큼 자주 어기게 됩니다. shift() 한 줄을 빼먹어서 “오늘 종가를 보고 오늘 종가에 산다”는 불가능한 매매를 시뮬레이션한다든가, 3월 무렵에야 공시되는 작년 재무제표를 1월부터 알고 있었다고 가정한다든가. 이런 실수를 미래 참조 편향(look-ahead bias)이라고 부르고, 백테스트 성과를 가짜로 부풀리는 주범입니다.

4단계: 성과 평가

그 결과로 만들어진 수익률 흐름을 누적 수익률, CAGR 같은 지표로 평가합니다. 그리고 반드시 비교 대상(벤치마크)을 세웁니다. 보통은 “같은 자산을 그냥 사서 들고만 있기(buy & hold)”가 기준입니다. 어떤 전략이 10년간 연 7%를 냈다는 사실 자체는 아무 의미가 없습니다. 같은 기간 그냥 들고만 있어도 연 9%였다면 그 전략은 수고비만 든 실패작이고, 들고만 있었을 때 연 3%였는데 그 전략이 폭락장을 두 번 피했다면 이야기가 달라집니다.

좋은 백테스트를 가르는 질문들

같은 4단계를 밟아도 백테스트의 질은 천차만별입니다. 결과를 볼 때 스스로에게 던져야 할 질문들입니다.

  • 거래 비용을 뺐는가? — 수수료, 세금, 그리고 내 주문 자체가 가격을 밀어 올리는 슬리피지. 월 1회 리밸런싱 전략도 왕복 0.3~0.5%씩 10년이면 성과가 크게 달라집니다(거래 비용 글).
  • 충분히 긴 기간인가? — 상승장 3년만 잘라서 테스트한 전략은 아무것도 증명하지 못합니다. 최소한 큰 하락장(2008, 2020 같은)을 한 번 이상 포함해야 전략의 맷집을 볼 수 있습니다.
  • 규칙을 몇 번이나 고쳤는가? — 결과를 보고 규칙을 고치고, 다시 결과를 보고 또 고치고…를 반복하면 그 규칙은 미래에 통할 규칙이 아니라 그 과거 데이터에만 꼭 맞는 규칙이 됩니다. 이것이 과최적화(overfitting)이고, 백테스트의 가장 유혹적인 함정입니다.
  • 너무 좋지 않은가? — 연 30%씩 꾸준히 버는 백테스트가 나왔다면, 축하할 일이 아니라 버그를 찾아야 할 일입니다. 경험칙상 거의 항상 미래 참조나 데이터 오류가 숨어 있습니다.

이 시리즈에서 실제로 돌려 본 결과

위 질문들이 왜 중요한지는 숫자로 보면 분명해집니다. 아래는 이 시리즈 뒤쪽에서 코스피 지수에 “최근 12개월 수익률이 플러스면 보유, 아니면 현금”이라는 규칙을 실제로 적용한 결과입니다.

  • 벤치마크와 나란히 보기 — 첫 백테스트에서 2005년 1월~2026년 8월(거래 비용 반영 전) 이 규칙의 CAGR은 5.91%로, 그냥 들고 있기(9.66%)보다 낮았습니다. 대신 MDD는 -30.5%로 그냥 들고 있기(-48.5%)보다 얕았습니다. 수익률 하나만 보면 실패지만, 낙폭까지 보면 수익을 일부 내주고 큰 하락을 줄인 전략입니다.
  • 기간 바꿔 보기 — 과최적화 글에서 거래 비용 0.3%를 반영해 다시 계산하면, 같은 규칙의 CAGR이 전체 기간으로는 5.4%, 2016~2026년만 떼어 보면 9.46%입니다. 어느 기간을 고르느냐에 따라 숫자가 크게 달라지고, 그 기간에도 그냥 들고 있기(12.39%)는 이기지 못했습니다.
  • 파라미터 고르기 — 같은 글에서 12개월 대신 1~24개월을 모두 돌려 보면 3개월이 CAGR 9.5%로 가장 좋았지만, 바로 옆 2개월은 4.1%였습니다. 이런 최고점 하나를 보고 규칙을 정하는 순간 과최적화가 시작됩니다.

백테스트가 해줄 수 있는 것과 없는 것

분명히 해둡시다.

  • 해줄 수 있는 것: 과거에도 통하지 않았던 전략을 걸러내는 것. 그리고 전략의 성격 — 낙폭, 부진 구간, 벤치마크 대비 우열 — 을 미리 보여주는 것.
  • 해줄 수 없는 것: 미래 수익 보장. 시장의 구조는 변하고, 과거에 통했던 규칙이 미래에도 통한다는 보장은 어디에도 없습니다.

그래서 백테스트는 “돈 버는 기계를 찾는 도구”가 아니라 “틀린 아이디어를 빨리, 싸게 버리는 도구”라고 생각하는 쪽이 안전합니다. 이 관점의 차이가 과최적화의 유혹에서 스스로를 지켜줍니다.

정리

  • 백테스트는 “이 규칙대로 과거에 투자했다면?”을 데이터로 재현하는 시뮬레이션이다.
  • 규칙 정하기 → 데이터 준비 → 기계적 적용 → 성과 평가의 4단계이며, 각 시점에는 그 시점까지의 정보만 써야 한다(미래 참조 금지).
  • 성과는 반드시 벤치마크와 비교하고, 거래 비용·기간·과최적화 여부를 따져 물어야 한다.
  • 백테스트는 미래를 보장하는 도구가 아니라 틀린 아이디어를 싸게 버리는 도구다.

다음 글에서는 우리가 처음으로 백테스트할 아이디어인 모멘텀이 무엇인지 다룹니다. 왜 “오르던 주식이 더 오른다”는 직관에 반하는 현상이 수십 년째 관찰되는지, 그리고 모멘텀에도 종류가 있다는 것까지요.

2026-09-28 수정: 미래 참조 편향의 예에서 연간 재무제표가 공시되는 시점을 ‘그해 연말’에서 ‘이듬해 3월 무렵’으로 바로잡고, 4단계가 나중에 코드에서 ‘함수 네 개’가 된다고 쓴 문장을 실제 코드에 맞게 고쳤습니다.

2026-10-22 수정: 과최적화 글의 홀드아웃 경계를 바로잡은 데 맞춰, 12개월 규칙의 2016~2026년 CAGR을 2015년 12월이 섞여 있던 9.22%에서 9.46%로 고쳤습니다.


이 글은 학습과 정보 공유 목적으로 작성되었으며, 특정 종목이나 상품에 대한 투자 권유가 아닙니다. 투자의 판단과 책임은 투자자 본인에게 있습니다.

최종 수정: