3 minute read

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

백테스트란 무엇인가

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

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

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

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

왜 백테스트가 필요한가

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

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

백테스트의 4단계

어떤 백테스트든 구조는 같습니다. 나중에 코드로 만들 때도 이 4단계가 그대로 함수 네 개가 됩니다.

1단계: 규칙 정하기

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

2단계: 과거 데이터 준비

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

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

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

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

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

4단계: 성과 평가

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

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

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

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

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

분명히 해둡시다.

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

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

정리

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

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


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

Updated: