퀀트 투자 입문 ③ — 백테스트란 무엇인가
지난 글에서 수익률 계산을 배웠으니 이제 백테스트를 만들 차례인데, 그 전에 백테스트가 정확히 무엇인지부터 제대로 짚고 갑니다. 이번 글은 코드가 없는 개념 편입니다. 다음 글들에서 코드를 쓸 때 “지금 뭘 하고 있는 건지” 헷갈리지 않기 위한 준비입니다.
백테스트란 무엇인가
백테스트(backtest)는 한 문장으로 이렇게 정의할 수 있습니다.
“이 규칙대로 과거에 투자했다면 어떻게 됐을까?”를 데이터로 재현해 보는 것.
예를 들어 “매달 말에 최근 6개월 수익률이 플러스면 주식을 사고, 마이너스면 현금으로 도망간다”는 규칙이 있다고 합시다. 이 규칙이 좋은지 나쁜지 어떻게 알 수 있을까요? 지금부터 실제 돈으로 10년 실험해 볼 수는 없습니다. 대신 과거 10년 치 주가 데이터에 이 규칙을 그대로 적용해서, 매달 규칙이 시키는 대로 사고팔았다고 가정하고 계좌 잔고를 계산해 보는 겁니다. 이것이 백테스트입니다.
새 비행기를 실제로 띄우기 전에 시뮬레이터로 검증하는 것과 비슷합니다. 시뮬레이션을 통과했다고 실전에서 무조건 안전한 것은 아니지만, 시뮬레이션에서 추락하는 설계를 실전에 내보내지 않을 수는 있습니다.
왜 백테스트가 필요한가
백테스트 없이 투자 아이디어를 평가하는 방법은 사실상 두 가지뿐입니다. 남의 말을 믿거나, 실제 돈으로 실험하거나. 둘 다 비쌉니다. 백테스트는 세 번째 길을 열어줍니다.
- 가설을 걸러내는 필터 — “골든크로스가 나면 사면 된다더라” 같은 속설을 몇 시간 만에 데이터로 확인할 수 있습니다. 과거 20년 동안도 통하지 않았던 규칙이라면 굳이 내 돈으로 다시 확인할 필요가 없습니다.
- 전략의 성격 파악 — 수익률만이 아니라 “이 전략은 최악의 순간에 얼마나 깨지는가(낙폭)”, “몇 년씩 부진한 구간이 있는가”를 미리 봅니다. 실전에서 규칙을 버리게 되는 것은 대부분 수익이 낮아서가 아니라, 부진한 구간을 견딜 마음의 준비가 없어서입니다.
- 비교의 기준 — 아이디어 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단계이며, 각 시점에는 그 시점까지의 정보만 써야 한다(미래 참조 금지).
- 성과는 반드시 벤치마크와 비교하고, 거래 비용·기간·과최적화 여부를 따져 물어야 한다.
- 백테스트는 미래를 보장하는 도구가 아니라 틀린 아이디어를 싸게 버리는 도구다.
다음 글에서는 우리가 처음으로 백테스트할 아이디어인 모멘텀이 무엇인지 다룹니다. 왜 “오르던 주식이 더 오른다”는 직관에 반하는 현상이 수십 년째 관찰되는지, 그리고 모멘텀에도 종류가 있다는 것까지요.
이 글은 학습과 정보 공유 목적으로 작성되었으며, 특정 종목이나 상품에 대한 투자 권유가 아닙니다. 투자의 판단과 책임은 투자자 본인에게 있습니다.