“과거 데이터로 돌려보니 연 30% 수익이 나왔습니다.”
이 한 문장을 보면 대부분 솔깃해집니다. 저는 이제 경계부터 합니다. 1년 넘게 실제 돈으로 자동매매를 돌리면서, 그럴듯한 백테스트가 사람을 어떻게 속이는지 여러 번 겪었거든요.
[30초 요약] 백테스트는 “과거에 이 규칙을 썼다면 어땠을까”를 데이터로 계산해보는 것입니다. 아이디어를 거르는 데는 유용하지만, 결과가 좋게 나오는 건 전략이 좋아서가 아니라 과거에 맞춰 깎았기 때문일 때가 많습니다. 진짜 검증은 결과를 보기 전에 규칙을 먼저 정하고, 시험에 안 쓴 기간에서 다시 확인하는 것입니다.
백테스트 뜻 — 한 줄로
과거 가격 데이터 위에서 투자 규칙을 가상으로 실행해, 그 규칙의 성과를 추정하는 것입니다.
“50일 이동평균선 위에서만 산다” 같은 규칙을 정하고, 10년·20년치 데이터에 적용해서 수익률·최대 낙폭·승률을 계산합니다. 실제 돈을 넣기 전에 규칙이 말이 되는지 보는 과정이죠.
백테스트 방법 — 기본 5단계
| 단계 | 할 일 | 흔한 실수 |
|---|---|---|
| 1. 규칙 정의 | 언제 사고 언제 파는지 문장으로 확정 | 돌려보면서 규칙을 바꿈 |
| 2. 데이터 준비 | 가격·거래량, 가능하면 상장폐지 종목까지 | 살아남은 종목만 씀 |
| 3. 시뮬레이션 | 날짜 순서대로 규칙 적용 | 그날 몰랐던 정보를 씀 |
| 4. 비용 반영 | 수수료·세금·호가 차이 | 비용 0으로 계산 |
| 5. 검증 | 안 쓴 기간에서 다시 확인 | 한 기간 결과만 믿음 |
직접 해보고 싶다면 파이썬으로 가격 데이터를 받는 것부터 시작하면 됩니다. 5분짜리 실습은 파이썬 주식 데이터 가져오기에 정리했습니다. 코딩 없이 해보려면 포트폴리오 단위로 백테스트를 돌려주는 웹 도구들도 있습니다 — 다만 어떤 도구든 아래 함정은 똑같이 적용됩니다.
백테스트가 거짓말이 되는 여섯 가지
| 함정 | 무슨 일이 생기나 | 확인법 |
|---|---|---|
| 과최적화 | 과거에만 맞는 규칙이 됨 | 몇 번 시험해서 고른 결과인지 |
| 생존편향 | 망한 종목이 빠져 수익률 부풀림 | 상장폐지 종목 포함 여부 |
| 수정주가 혼용 | 액면분할이 가짜 수익·손실을 만듦 | 하루 ±50% 넘는 날 훑어보기 |
| 거래비용 누락 | 매매가 잦을수록 크게 과대평가 | 비용 넣고 다시 돌리기 |
| 자금 제약 무시 | 모든 신호를 다 샀다고 가정 | 동시 보유 한도 넣어보기 |
| 미래 정보 누수 | 그날 몰랐던 값으로 판단 | 종가 확정 전 신호인지 |
아래에서 가장 흔한 셋과, 제가 실제로 당한 것들을 적어둡니다.
과최적화 — 동전을 1,000명이 던지면 ‘천재’가 한 명 나옵니다
백테스트의 문제는 우리가 과거를 이미 알고 있다는 데 있습니다. 이동평균을 며칠로 할지, 손절을 몇 %로 할지 — 손잡이를 돌리며 “이렇게 하니까 곡선이 예뻐지네” 하고 맞추게 됩니다.
숫자로 보면 확실합니다. 동전을 10번 던져 10번 다 앞면이 나올 확률은 약 1,024분의 1입니다. 그런데 1,000명이 각자 10번씩 던지면 평균 약 1명은 10연속 앞면이 나옵니다. 그 사람을 “동전의 천재”라고 부르면 웃기죠.
전략도 같습니다. 조건을 바꿔 1,000가지를 돌리면 하나는 반드시 기가 막힌 곡선을 그립니다. 그게 실력인지 운인지는 화면만 봐서는 구분이 안 됩니다.
생존편향 — 데이터에는 이미 죽은 종목이 없습니다
오늘 상장된 종목 목록으로 과거 10년을 돌리면, 그 사이 상장폐지된 회사는 애초에 목록에 없습니다. 살아남은 자만 인터뷰하고 “다들 성공했다”고 결론 내는 셈이죠. 이것 하나만으로도 수익률이 실제보다 몇 %씩 부풀려집니다.
제가 실제로 당한 것들
수정주가 혼용. 한 번은 결과가 좋게 나와 채택하려던 규칙이 있었는데, 들여다보니 이익의 72%를 한 종목이 만들고 있었습니다. 5대 1 액면분할이었고, 가격 데이터는 분할을 반영한 수정주가인데 체결 기록은 분할 전 원가였습니다. 걸러내고 나니 우위가 거의 사라졌습니다.
거래비용. 같은 규칙을 비용만 바꿔 27년치로 돌려보니, 편도 0.25%만 넣어도 연 수익률이 1.7%포인트 깎였습니다. 매매가 잦은 규칙일수록 비용 없는 백테스트는 거짓말에 가깝습니다. 자세한 결과는 수수료 27년 실측에 있습니다.
자금 제약. 신호가 떠도 이미 슬롯이 차 있으면 못 삽니다. 동시 보유 한도를 넣고 다시 돌렸더니 신호의 절반 이상을 실제로는 살 수 없었습니다.
셋 다 공통점이 있습니다. 결과가 좋게 나와서 의심을 덜 했다는 것입니다.
그래서 저는 결과를 보기 전에 규칙을 못박습니다
원칙은 단순합니다. 규칙을 먼저 정하고, 그다음에 돌린다. 돌려보고 마음에 안 든다고 손잡이를 다시 돌리는 순간, 그건 검증이 아니라 과거 맞추기입니다.
그래서 파라미터를 미리 글로 적어 ‘동결’ 해두고, 시험에 한 번도 안 쓴 기간에서 따로 확인합니다. 여기서도 통해야 겨우 믿습니다. “여러 번 시험한 것치고 이 성과가 운일 확률은 얼마인가”를 보정하는 방법(대표적으로 디플레이티드 샤프 지수)도 있고, 이걸 통과 못 하면 곡선이 아무리 예뻐도 버립니다.
자주 묻는 질문
백테스트 자체가 쓸모없다는 건가요? 아니요. 아이디어를 거르는 데는 유용합니다. 다만 ‘잘 나온 결과’를 믿는 게 아니라, ‘잘 나오게 만든 과정’을 의심하는 도구로 써야 합니다.
연 수익률 몇 %면 믿을 만한가요? 숫자만으로는 판단할 수 없습니다. 같은 30%라도 규칙을 미리 정해 한 번에 나온 30%와 1,000번 돌려 고른 30%는 완전히 다릅니다. 물어야 할 건 “몇 번 시험해서 고른 거냐”입니다.
백테스트 사이트나 프로그램은 뭘 쓰나요? 포트폴리오 비중 테스트는 웹 도구로 충분하고, 매매 규칙 테스트는 파이썬이 자유도가 높습니다. 도구보다 중요한 건 위 여섯 가지 함정을 넣었는지입니다.
개인 투자자도 이런 검증이 가능한가요? 가능합니다. 결과를 보기 전에 규칙을 종이에 적어두는 것만으로 절반은 해결됩니다. 기술보다 규율의 문제입니다.
함께 읽으면 좋은 글
규칙을 미리 정하고 30년을 실제로 돌려본 사례는 이동평균 30년 백테스트에, 비용이 성과를 얼마나 갉는지는 수수료 27년 실측에 공개했습니다.
결과를 공유하기 전에 무엇을 남겨야 하는지는 백테스트 결과를 공유하기 전에 남겨야 할 최소 기록에 체크리스트로 정리했습니다.
좋은 전략보다 먼저 필요한 건, 자기 자신을 속이지 않는 습관입니다.
이 글에서 다룬 함정을 코드로 어떻게 걸러내는지 — 사전등록, 교차검증, 다중검정 보정까지 — 전자책 파이썬 주식 스크리너 만들기와 검증 방법의 한 모듈 전체로 정리했습니다. 스크리너를 만드는 법보다 만든 결과를 의심하는 법에 무게를 둔 교재입니다.
※ 본 글은 특정 종목·매매 시점 권유가 아니며, 과거 데이터에 대한 기록은 미래 성과를 보장하지 않습니다. 투자 판단과 결과의 책임은 본인에게 있습니다.