백테스트가 뭔가요
백테스트(backtest)는 첫 등장이니 한 문장으로 정의하면,과거 데이터에 내 규칙을 그대로 적용해서 그때 그랬다면 어떤 결과였을지 재현해 보는 일이에요.
방식은 단순해요. 예를 들어 “매달 첫 거래일에 RSI가 낮은 30종목을 고르고 한 달 뒤 바꾼다”는 규칙이 있다면, 2019년 1월로 돌아가서 그날까지의 데이터만 가지고 30종목을 뽑고, 한 달 뒤 수익률을 기록해요. 그다음 2월로 넘어가 같은 걸 반복해요. 그렇게 5년치를 돌리면 이 규칙의 성적표가 나와요.
중요한 건 ‘그날까지의 데이터만’이라는 조건이에요. 이 한 줄을 지키는 게 백테스트의 전부라고 해도 과언이 아니에요. 그리고 대부분의 잘못된 백테스트는 정확히 이 줄에서 무너져요.
왜 필요한가요 — 직관은 자주 틀려요
솔직히 말하면, 백테스트는 내 직관이 틀렸다는 걸 확인하는 거의 유일한 수단이에요. “이건 당연히 통하지”라고 믿는 규칙을 숫자로 두들겨 보면, 꽤 자주 안 통해요.
맑은 주식에서 실제로 있었던 일이에요. 급락한 종목에 벌점을 주려고 했어요. 떨어지는 칼날은 피하는 게 상식이니까요. 그런데 백테스트를 돌려 보니급락 표본의 20일 뒤 평균이 +4.74%, 그 외 종목이 +2.78%였어요. 상식과 정반대 결과였죠. 그래서 벌점 규칙은 롤백하고, 대신 경고 문구만 붙이는 쪽으로 바꿨어요.
만약 백테스트를 안 했다면 어떻게 됐을까요? 그 벌점은 그럴듯한 얼굴로 몇 년이고 조용히 돌아갔을 거예요. 그리고 성적이 안 나오면 다른 데를 탓했겠죠. 틀린 걸 틀렸다고 알려주는 장치가 없으면 규칙은 영원히 안 고쳐져요.
백테스트의 진짜 쓸모는 “이 규칙 좋다!”를 확인하는 게 아니라“이 규칙 안 되는구나”를 싸게 확인하는 것이에요. 실전에서 확인하면 수업료가 비싸거든요.
함정 ① 미래 참조 — 그때는 몰랐던 걸 쓰는 실수
미래 참조(look-ahead bias)는 그 시점에는 알 수 없었던 정보를 계산에 넣어버리는 실수예요. 백테스트를 망치는 원인 중 가장 흔하고, 동시에 가장 티가 안 나요. 성적이 좋게 나오니까 의심을 안 하게 되거든요.
가장 흔한 사례는 수정된 실적이에요. 기업 실적은 나중에 정정되는 일이 많아요. 지금 데이터베이스에서 “2021년 3분기 영업이익”을 꺼내면 최종 확정된 숫자가 나와요. 그런데 2021년 11월 당시에 시장이 보던 숫자는 그게 아니었을 수 있어요. 확정된 숫자로 그때 종목을 골랐다면, 미래에서 답을 보고 문제를 푼 셈이에요.
확정 수급도 마찬가지예요. 외국인·기관 매매 집계는 장중에 나오는 잠정치와 나중에 확정되는 값이 다를 수 있어요. 확정치로 과거 시점의 매수를 결정했다면 그것도 미래 참조예요. “장중에 이 수치를 보고 샀다”는 시나리오 자체가 성립하지 않으니까요.
- ·공시 시점을 무시하는 경우. 분기 실적이 나온 날이 아니라 분기 마지막 날에 그 숫자를 쓸 수 있다고 가정하면, 한두 달을 앞질러 간 거예요.
- ·종가로 사고 그날 종가로 평가하는 경우. 종가를 보고 나서 그 종가에 살 수는 없어요.
- ·지수 편입 종목을 미리 아는 경우. 지금 시점의 구성 종목을 과거에도 알았다고 가정하는 실수예요.
방지법은 하나뿐이에요. 모든 데이터에 “이건 언제부터 볼 수 있었나”를 붙여 두는 것.맑은 주식이 전일 종가 기준으로만 계산하는 것도 같은 이유예요. 장중 값은 확정되지 않았으니까요. 느리지만, 그 시점에 실제로 알 수 있었던 정보라는 건 확실해요.
함정 ② 생존편향 — 사라진 종목은 표본에 없어요
생존편향(survivorship bias)은 살아남은 것만 표본에 들어가서 성적이 실제보다 좋게 보이는 현상이에요.
지금 시가총액 상위 200종목을 뽑아서 5년치를 돌린다고 해볼게요. 자연스러워 보이지만 함정이 있어요. 이 200종목은 5년 동안 살아남았고, 심지어 크게 성장한 회사들이에요. 그 사이 상장폐지됐거나 반토막 나서 순위 밖으로 밀린 회사는 명단에 없어요. 패자를 뺀 명부로 성적을 내면 어떤 규칙을 써도 그럴듯해 보여요. 규칙이 좋아서가 아니라 표본이 이미 승자들이라서요.
더 골치 아픈 건 이게 규칙 간 비교까지 망친다는 점이에요. A규칙과 B규칙을 같은 편향된 표본에서 비교하면 둘 다 부풀려지는데, 부풀려지는 정도가 달라요. 위험한 규칙일수록 사라진 종목의 영향을 크게 받았을 텐데 그 종목이 없으니, 위험한 규칙이 더 이득을 봐요.
정직하게 밝혀 둘게요. 맑은 주식의 분석 대상도 현재 시총 상위라 생존편향이 있어요. 게다가 검증 구간에 상승장이 많았어요. 그래서 저희가 공개하는 어떤 숫자든실제보다 좋게 나왔다고 가정하고 보는 게 맞아요. 이건 고치려고 노력할 부분이지, 없는 척할 부분이 아니에요.
함정 ③ 과최적화 — 발견이 아니라 암기
과최적화(overfitting)는 과거 데이터에 가장 잘 맞는 숫자를 찾아내는 것이에요. 문제는 그게 법칙을 발견한 게 아니라, 그 기간을 외운 것에 가깝다는 점이에요.
과정은 늘 비슷해요. RSI 기간을 14로 놓고 돌려요. 성적이 그저 그래요. 12로 바꿔요. 조금 낫네요. 11, 13, 9도 해봐요. 11이 제일 좋아요. 기준선도 30 대신 28, 32를 넣어보고 28로 정해요. 그렇게 “RSI 11일, 기준 28”이 나와요. 성적표는 아주 예쁘고요.
여기서 물어야 할 질문은 하나예요. 왜 하필 11일인가요?11일이 맞고 12일이 틀린 경제적 이유를 댈 수 있나요? 못 댄다면, 그 숫자는 그 기간의 우연을 맞춘 것이에요. 다음 기간에는 다른 숫자가 최고가 될 거고요.
- ·징후 1 — 숫자가 어정쩡해요. 14나 20 같은 둥근 값이 아니라 11, 28, 63처럼 특이한 값이 나왔다면 의심할 만해요.
- ·징후 2 — 조금만 바꿔도 무너져요. 11일은 좋은데 10일과 12일은 형편없다면, 그 좋음은 우연이에요. 진짜 효과는 근처에서 완만해요.
- ·징후 3 — 조건이 많아요. 조건을 늘릴수록 과거에는 잘 맞아요. 조건 5개면 웬만한 예외는 다 걸러낼 수 있거든요. 그래서 조건이 많을수록 미래에는 약해져요.
- ·징후 4 — 이유를 설명 못 해요. “왜 통하는지”를 한 문장으로 못 말하면, 아직 아무것도 발견 못 한 거예요.
저희도 여기서 한 번 미끄러졌어요. 변동성이 클 때 모멘텀 가점을 빼는 규칙을 넣었는데, 60일 기준 예측력이 양수에서 음수로 뒤집혀서 즉시 롤백했어요. 더 중요한 건 그다음이에요. 파고들어 보니 진짜 원인은 모멘텀이 아니라 과매도 가점이었어요. 엉뚱한 곳을 손보고 있었던 거죠. 과최적화는 답을 틀리게 할 뿐 아니라, 어디가 문제인지도 헷갈리게 만들어요.
함정 ④ 표본이 작을 때의 착시
마지막 함정은 숫자 자체는 정직한데 표본이 적어서 생기는 착각이에요. 그리고 가장 속기 쉬워요. 앞의 세 가지는 실수지만, 이건 실수를 안 해도 생기거든요.
저희 기록이 딱 교과서 같은 사례예요. 수익성 지표인 ROE(자기자본이익률, 회사가 자기 돈으로 얼마나 이익을 냈는지 보는 지표)와 이후 수익률의 상관을 572표본에서 재보니 0.225가 나왔어요. 주식에서 0.2를 넘는 상관은 꽤 강한 편이라, 이건 진짜다 싶었죠.
그래서 표본을 9,800개로 늘려서 다시 쟀어요. 결과는 0.014였어요. 거의 0이에요.
| 표본 수 | ROE 상관 | 읽는 법 |
|---|---|---|
| 572 | 0.225 | “상당히 유효해 보인다” |
| 9,800 | 0.014 | “사실상 관계 없음” |
지표가 바뀐 게 아니에요. 계산이 틀린 것도 아니고요. 572개 안에 유난히 크게 오른 소수의 승자가 몇 개 섞여 있었고, 표본이 적으니 그 몇 개가 전체 평균을 끌어올린 거예요. 표본을 늘리자 그 몇 개의 비중이 줄면서 진짜 크기가 드러났어요. 0.225는 신호가 아니라 잡음이었어요.
무서운 건 순서예요. 만약 572표본에서 멈췄다면, 저희는 ROE에 큰 비중을 실었을 거예요. 그리고 성적이 안 나올 때마다 다른 이유를 찾았겠죠. 작은 표본은 틀린 답을 자신 있게 알려줘요.
감각 하나만 남기면 좋겠어요. 몇백 개짜리 표본에서 나온 상관 0.2는 거의 항상 착시예요. 지표와 이후 수익률의 상관은 대체로 0.02~0.05고, 시장 상황에 따라 부호가 뒤집혀요. 그보다 훨씬 큰 숫자를 봤다면 기뻐할 게 아니라 표본 수부터 세어 봐야 해요.
맑은 주식이 백테스트로 기각한 것들
백테스트가 실제로 하는 일은 대부분 아이디어를 버리는 일이에요. 저희가 버린 것들을 공개할게요. 전부 처음엔 그럴듯했고, 전부 숫자 앞에서 무너졌어요.
| 버린 규칙 | 기대했던 것 | 실제 결과 | 조치 |
|---|---|---|---|
| 수급 비중 | 외국인·기관이 사면 오른다 | 9,800표본 5년치에서 이후 수익률과 상관 사실상 0 | 비중 절반으로 축소 |
| 급락 벌점 | 떨어지는 종목은 피해야 한다 | 급락 표본 20일 뒤 +4.74% vs 그 외 +2.78% (반대) | 롤백, 경고 문구만 유지 |
| 모멘텀 게이팅 | 변동성 크면 모멘텀 가점을 빼야 한다 | 60일 예측력이 양수→음수로 반전. 원인은 과매도 가점 | 즉시 롤백 |
| 선물 조기경고 | 선물·현물 가격 차로 폭락을 미리 안다 | 103거래일 검증에서 하락 내내 정상 신호, 위험 신호는 바닥 당일 | 기각 |
네 개 다 공통점이 있어요. 말로는 전부 설득력이 있었다는 것.수급이 몰리면 오를 것 같고, 급락주는 위험할 것 같고, 변동성이 크면 추세는 못 믿을 것 같고, 선물은 먼저 움직이니 경고가 될 것 같죠. 그럴듯함과 사실은 다른 문제라는 게 요점이에요.
특히 선물 조기경고는 뼈아팠어요. 검증해 보니 하락이 진행되는 내내 ‘정상’이라고 말하다가, 바닥에 닿은 당일에야 위험하다고 알려줬어요. 필요할 때 침묵하고, 끝난 뒤에 소리치는 신호죠. 이런 건 도움이 안 되는 정도가 아니라, 있으면 해로워요. 신호가 조용하니 안전하다고 착각하게 만드니까요.
좋은 백테스트의 조건
그래서 백테스트를 믿을 만하게 만들려면 뭐가 필요할까요. 거창한 건 없고, 지키기 귀찮은 것들이에요.
- ·그 시점에 알 수 있던 정보만. 모든 데이터에 ‘언제부터 볼 수 있었나’를 붙여요. 수정된 실적, 확정 수급은 특히 조심해야 해요.
- ·표본은 크게, 그리고 사라진 것도 포함. 수백 개로는 부족해요. 상장폐지·순위 이탈 종목을 빼면 성적은 자동으로 부풀어요.
- ·조건은 적게, 숫자는 둥글게. 파라미터가 많을수록 과거는 잘 맞고 미래는 안 맞아요. 근처 값에서도 비슷하게 나오는지 꼭 확인하고요.
- ·서로 다른 시장 국면을 포함. 상승장만 담긴 구간에서 나온 성적은 상승장 성적일 뿐이에요.
- ·왜 통하는지 한 문장으로. 설명이 안 되면 그건 발견이 아니라 우연일 가능성이 높아요.
- ·실패도 남길 것. 성공한 규칙만 기록하면 기록 자체에 생존편향이 생겨요. 위의 기각 표를 공개하는 이유예요.
그리고 하나 더. 좋은 백테스트를 통과했다고 앞으로 잘된다는 뜻은 아니에요. 백테스트가 해주는 건 ‘명백히 나쁜 규칙을 미리 걸러내는 것’까지예요. 걸러지고 남은 규칙이 좋은 규칙이라는 보장은 어디에도 없어요. 통과는 합격증이 아니라 최소 조건이에요.
결국 백테스트를 대하는 가장 건강한 태도는 이거예요. 내 아이디어가 맞는다는 걸 증명하려고 돌리는 게 아니라, 틀렸다는 걸 최대한 빨리 발견하려고 돌리는 것. 앞의 네 가지 함정은 전부 ‘맞는다는 걸 증명하려고 돌릴 때’ 스며들어요. 좋게 나온 결과일수록 더 의심해 보는 게, 지루하지만 확실한 방법이에요.
정리
- ·백테스트 = 과거 데이터에 규칙을 적용해 그때 어땠을지 재현하는 일. 핵심 조건은 ‘그 시점에 알 수 있던 정보만’.
- ·미래 참조 — 수정된 실적·확정 수급처럼 나중에 확정된 값을 쓰면 답을 보고 문제를 푼 거예요.
- ·생존편향 — 사라진 종목이 빠지면 어떤 규칙도 좋아 보여요. 맑은 주식도 이 편향이 있어요.
- ·과최적화 — 과거에 가장 잘 맞는 숫자는 발견이 아니라 암기예요.
- ·작은 표본의 착시 — ROE 상관 0.225(572표본) → 0.014(9,800표본). 소수 승자가 만든 신기루였어요.
- ·버린 규칙 넷: 수급 비중·급락 벌점·모멘텀 게이팅·선물 조기경고. 전부 말로는 그럴듯했어요.