백테스트를 볼 때 던지는 질문 열 가지
지금까지 여러 규칙을 백테스트해 보면서, 결과 숫자 자체보다 그 숫자가 어떤 조건에서 나왔는지가 더 중요하다는 것을 거듭 확인했습니다. 남이 보여 준 결과든 직접 돌린 결과든, 숫자를 믿기 전에 확인하는 질문 열 가지를 정리했습니다. 질문마다 이 블로그의 지난 글에서 그 질문 하나로 결과가 달라졌던 사례를 골라 붙였습니다. 백테스트란 무엇인가에서 질문 네 개로 짧게 다룬 내용을, 그 뒤의 글들에서 나온 숫자로 넓힌 것입니다. 이번 글에는 코드가 없습니다. 각 숫자의 계산은 링크한 글에 있습니다.
1. 데이터는 언제 시작해서 언제 끝나는가
“1995년 5월부터 코스피를 들고 있었다면 연복리는 얼마였나”라는 같은 질문에 이 블로그의 세 글이 처음에 6.60%, 6.20%, 6.06%로 답했습니다. 코드와 데이터 출처는 같았고, 다른 것은 데이터가 끝나는 날짜뿐이었습니다. 세 글의 데이터가 끝나는 날은 9월 17일부터 10월 19일까지 흩어져 있었고, 그 한 달 남짓 동안 지수가 14.1% 떨어지면서 31년짜리 연복리가 0.5%p 넘게 낮아졌습니다(같은 코드가 다른 숫자를 낸 날). 같은 종료일로 다시 돌렸는데 6.60%가 6.59%로 나온 일도 있었습니다. 처음 받은 데이터를 저장해 두지 않아서 원인은 끝내 확인하지 못했습니다. 기간이 적혀 있지 않은 숫자는 다른 숫자와 비교할 수 없습니다.
시작점도 마찬가지입니다. 첫 백테스트에서 절대 모멘텀이 그냥 들고 있기보다 연 3.7%p 뒤졌는데, 그 절반가량은 신호를 계산할 수 없던 첫 12개월을 현금으로 보낸 출발 조건에서 생겼습니다. 그사이 코스피가 약 50% 올랐기 때문입니다. 적힌 기간이 같아도, 전략이 실제로 투자를 시작한 날이 비교 대상과 같은지는 따로 확인해야 합니다.
2. 그날 알 수 없던 정보를 쓰지 않았는가
백테스트란 무엇인가에서 “이번 달 말의 신호를 다음 달에 적용한다”는 한 줄만 빼 봤습니다. 이번 달 수익률을 이미 본 상태에서 이번 달에 들고 있을지를 정하게 되자, 들고 있기(9.66%)에 지던 규칙의 연복리가 5.91%에서 12.42%로 올라갔습니다.
미래 참조는 신호를 적용하는 시점에만 숨어 있지 않습니다. 미래 참조 편향의 여러 얼굴에서 액면분할을 반영한 수정주가로 “10만 원 이하만 산다”는 규칙을 돌리면, 분할 전 삼성전자가 2,057거래일 동안 매일 규칙을 통과했습니다. 실제 종가로는 하루도 통과하지 못했습니다. 수정주가는 나중에 일어난 분할을 반영해 과거 가격을 고친 값이라 그때는 볼 수 없던 가격입니다. 수익률은 수정주가로 계산하되, 가격 수준으로 종목을 거르는 규칙이라면 그날 실제로 거래된 가격을 썼는지 확인해야 합니다.
3. 사라진 종목은 어떻게 다뤘는가
지금 상장된 종목만으로 과거를 돌리면 그사이 폐지된 종목이 빠집니다. 생존 편향 글에서 최근 21개월의 한국 주식으로 재 보니, 지금 상장된 종목만으로 계산한 수익률이 실제보다 부풀려졌습니다. 기간 시작 전부터 거래정지돼 있던 종목까지 처음부터 들고 있었다고 보면 그 폭이 연 0.69~1.80%p였고, 그 기간에 새로 살 수 있던 종목만 보면 연 0.13%p 이하였습니다. 같은 편향이라도 폐지 종목을 어떻게 처리하느냐에 따라 그 폭이 몇 배씩 달라집니다. 데이터에 폐지 종목이 들어 있는지, 들어 있다면 어떻게 처리했는지를 봅니다.
4. 비용과 세금을 넣었는가
거래 비용 글에서 편도 0.3%를 넣자 코스피 절대 모멘텀의 연복리가 5.91%에서 5.37%로 내려갔습니다. 21년 반 동안 37번, 1년에 1.71번 매매하는 느린 규칙이라 이 정도로 그쳤습니다. 매매가 잦은 규칙은 결과가 아예 뒤집히기도 합니다. 요일 효과 글에서 밤사이만 들고 있는 규칙은 비용 전 연복리가 20.55%였지만 왕복 0.1%를 넣자 -5.80%가 됐습니다.
세금은 순위를 바꾸기도 합니다. 세금 글에서 미국 주식 20년 구간 29개의 중앙값으로 보면, 세전에는 10개월 이동평균이 보유보다 0.5%p 앞섰습니다. 그런데 미국 상장 ETF를 일반 계좌에서 사고판다고 보고 세금을 떼면 이동평균 10.00%, 보유 10.27%로 순서가 뒤집혔습니다. 다만 그 글의 자료는 월말 종가가 아니라 그달 일별 종가의 평균이라, 세전 차이 0.5%p는 이 점을 감안해 읽어야 합니다.
5. 몇 개를 돌려 보고 고른 결과인가
과최적화 글에서 모멘텀 기간을 1개월부터 24개월까지 하나씩 바꿔 돌려 보니 3개월이 연복리 9.5%로 가장 좋았지만, 바로 옆 2개월은 4.0%, 4개월은 6.5%였습니다. 이렇게 양옆이 낮은 뾰족한 봉우리는 규칙의 성질보다 그 기간의 우연을 반영했을 가능성이 큽니다.
몬테카를로 검증 글에서는 여러 개 중 1등을 고르는 것만으로 결과가 얼마나 좋아 보이는지 직접 재 봤습니다. 실력이 전혀 없는 무작위 포트폴리오 32개 중 1등을 고르는 일을 3,000번 되풀이하니, 그 1등의 21개월 누적 수익률 중앙값이 +76.3%였습니다. 무작위 포트폴리오 하나의 중앙값은 +21.5%였으니, 그 차이 55%p는 고르는 행위에서 생긴 것입니다. 결과 옆에 몇 가지를 시도했는지가 함께 적혀 있어야 합니다.
6. 고른 뒤의 기간에도 통했는가
고르는 데 쓴 기간과 확인하는 기간을 나누면 고르는 행위의 효과를 어느 정도 걸러낼 수 있습니다. 과최적화 글에서 전반부(2005~2015년) 성적으로 고른 3개월은 후반부(2016~2026년)에 11.94%를 내서 12개월(9.46%)보다는 나았지만, 같은 기간 들고 있기(12.39%)는 넘지 못했습니다. 후반부에 들고 있기를 넘은 것은 전반부 6위였던 10개월 하나뿐이었습니다.
워크포워드 검증 글에서는 매달 그때까지 성적이 가장 좋던 설정을 골랐습니다. 고를 때 그 설정의 과거 월평균은 3.33%였지만 다음 달 실제 수익은 월 1.33%였습니다. 15개월 누적 +13.4%도 32개 설정을 그냥 전부 평균한 +12.8%와 거의 같았습니다.
7. 시기를 나눠도 같은 이야기인가
긴 기간의 평균 하나가 특정 시기의 성과를 감출 수 있습니다. 시계열 모멘텀 논문을 따라 한 글에서 미국 주식·10년 국채·금에 시계열 모멘텀을 적용해 합친 샤프 비율은 0.80으로 늘 매수(0.61)보다 높았지만, 차이는 1973~1989년에 몰려 있었고 1990년 이후만 묶으면 늘 매수가 앞섰습니다. 모멘텀 논문 글의 미국 모멘텀 팩터도 1990~2008년에는 연복리 10.21%였지만, 바로 뒤 2009~2023년 15년만 떼어 보면 -3.69%였습니다.
전략의 성과뿐 아니라 자산 사이의 관계도 시기에 따라 바뀝니다. 주식·채권 상관관계 글에서 미국 주식과 채권의 월 수익률 상관계수는 1966~1981년 +0.22, 2000~2020년 -0.33, 2021년~2023년 6월 +0.43으로 시기에 따라 부호까지 바뀌었습니다. 직전 12개월 물가 상승률로 나눠 봐도 2% 미만인 달들은 -0.22, 5% 이상인 달들은 +0.33이었습니다. 분산 효과를 전제로 한 백테스트라면 그 전제가 어느 시기에서 나왔는지도 봐야 합니다.
8. 운만으로도 그만큼 나올 수 있는가
몬테카를로 검증 글에서 밸류 스크리닝이 21개월 동안 낸 +53.6%를, 같은 유니버스에서 무작위로 20종목을 뽑는 일을 3,000번 되풀이한 결과와 비교했습니다. 무작위 포트폴리오의 10.2%가 이 성적을 넘었고, 시장을 뺀 초과수익의 t값은 0.63이었습니다. 보통 2를 넘어야 우연으로 보기 어렵다고 말합니다.
t값이 2를 넘어도 몇 번 중에서 나온 값인지는 따로 봐야 합니다. 요일 효과 글에서 2013년 이후 화요일의 t값은 2.61이었지만, 요일 다섯 개를 구간 두 개로 나눠 열 번 비교한 가운데 가장 큰 값이었습니다. 열 번 중 하나쯤 2를 넘는 것은 운으로도 충분히 일어납니다. 게다가 이 값은 화요일 평균이 0과 다른지를 본 것입니다. 1999~2026년 전체로 보면 같은 t값이 2.7이지만, 화요일과 나머지 요일의 차이를 직접 비교하면 1.58로 2에 못 미쳤습니다.
9. 결과가 수익률이 온 순서에 얼마나 달려 있는가
몬테카를로 검증 글에서 월별 수익률 21개의 순서만 섞어 봤습니다. 누적 수익은 그대로인데 최대 낙폭은 -12.8%에서 -26.4%까지 나왔고, 실제 순서의 최대 낙폭은 -13.5%였습니다. 백테스트의 최대 낙폭은 앞으로 겪을 낙폭의 상한이 아니라, 한 번 지나간 순서에서 나온 값입니다.
순서에 달린 것은 낙폭만이 아닙니다. 돈을 넣는 방식의 결과도 순서에 달려 있었습니다. 일시 투자와 분할 투자 글에서 코스피 10년 구간 256개를 비교하니, 첫해에 지수가 떨어진 구간에서는 12개월 분할 투자가 89.3%의 구간에서 이겼고, 첫해에 지수가 오른 구간에서는 이긴 비율이 14.4%에 그쳤습니다. 승부가 대부분 첫해 시장 방향에서 갈린 것입니다.
10. 무엇과 비교했고, 위험은 같았는가
비교 대상이 없는 숫자는 좋은지 나쁜지 판단할 수 없습니다. 첫 백테스트의 절대 모멘텀은 연복리 5.91%로 들고 있기(9.66%)에 졌지만 최대 낙폭은 -30.5%로 들고 있기(-48.5%)보다 얕았습니다. 수익률만 보면 실패지만, 낙폭까지 보면 평가가 달라집니다. 위험이 다른 두 결과를 수익률 하나로 비교하면 이런 차이가 가려집니다.
변동성 타기팅 글에서는 목표 변동성을 20%로 둔 규칙과 200일 이동평균을 나란히 놓았습니다. 실제 변동성은 각각 17.8%와 17.6%로 거의 같았습니다. 31년 전체로는 200일선이 연복리와 낙폭 모두에서 앞섰습니다. 그런데 연복리의 우위는 1995~2008년(9.8% 대 1.3%)에서 나온 것이고, 2009~2026년에는 변동성 타기팅이 7.4% 대 3.7%로 앞섰습니다. 같은 위험에서 비교해도 어느 기간을 보느냐에 따라 승자가 바뀌었습니다.
정리
- 데이터의 시작일과 종료일이 적혀 있는가
- 그날 실제로 알 수 있던 정보만 썼는가
- 폐지되거나 거래정지된 종목을 어떻게 다뤘는가
- 거래 비용과 세금을 넣었는가, 얼마나 자주 사고파는가
- 몇 가지를 시도한 뒤 고른 결과인가
- 고르는 데 쓰지 않은 기간에서도 통했는가
- 시기를 나눠도 같은 결론인가
- 무작위로도 그만큼 나올 확률은 얼마인가
- 최대 낙폭과 투자 결과가 수익률이 온 순서에 얼마나 민감한가
- 비교 대상은 무엇이고, 위험 수준은 같았는가
열 가지에 모두 답할 수 있다고 해서 앞으로의 성과가 보장되지는 않습니다. 다만 이 블로그의 결과들도 질문 하나를 더 던질 때마다 결론이 바뀌거나 약해진 경우가 많았습니다. 답이 비어 있는 질문이 있다면, 그 숫자는 아직 믿을 단계가 아니라고 보는 편이 안전합니다.
이 글은 학습과 정보 공유 목적으로 작성되었으며, 특정 종목이나 상품에 대한 투자 권유가 아닙니다. 과거 데이터로 계산한 결과는 미래 성과를 보장하지 않습니다. 투자의 판단과 책임은 투자자 본인에게 있습니다.