리서치 › 백테스트를 읽는 법
앞선 글에서 이상한 결과를 하나 남겨뒀습니다. 볼린저 하단 매수 신호를 손절 없이 5일 보유하면 거래당 평균은 +0.49%로 플러스입니다. 그런데 같은 규칙으로 10종목짜리 계좌를 굴리면 −58.9%가 됩니다. 거래비용은 이미 뺀 숫자라 비용 탓도 아닙니다. 이 격차는 계산 실수가 아니라 백테스트를 읽는 방식 자체의 문제이고 볼린저에만 해당하는 이야기도 아닙니다.
← 앞선 글: 볼린저 하단에서 사고 짧게 손절하면 어떻게 되는가범인을 찾으려면 24,692건의 신호를 날짜별로 세어봐야 합니다. 그날 하단을 이탈한 대형주가 몇 개였는지에 따라 거래를 나눠 성적을 다시 계산했습니다.
| 그날 신호 개수 | 해당 일수 | 거래 수 | 승률 | 평균 | 중앙값 |
|---|---|---|---|---|---|
| 1~3개 (평상시) | 259일 | 510 | 45.1% | −0.81% | −0.61% |
| 4~10개 | 313일 | 2,075 | 43.8% | −0.60% | −0.62% |
| 11~30개 | 323일 | 6,018 | 45.2% | −0.41% | −0.52% |
| 31~100개 | 183일 | 9,279 | 46.5% | −0.18% | −0.38% |
| 101개 이상 (시장 패닉) | 48일 | 6,810 | 61.9% | +2.63% | +1.79% |
D+1 시가 진입, 손절·익절 없이 5거래일 보유. 전체 거래일은 1,222일.
구조가 한눈에 드러납니다. 네 구간이 전부 마이너스이고 맨 아래 한 줄만 플러스입니다. 그리고 그 한 줄이 전체 거래의 27.6%를 차지합니다. 1,222거래일 중 3.9%에 불과한 48일이 6,810건의 거래를 만들어냈습니다.
왜 이렇게 되는지는 볼린저밴드가 무엇을 재는지 생각해 보면 알 수 있습니다. 하단 이탈은 개별 종목의 사정이 아니라 변동성이 커졌다는 신호입니다. 시장 전체가 하루에 −2%씩 빠지는 날에는 수백 개 종목이 동시에 하단을 벗어납니다. 반대로 평온한 날에는 진짜 악재가 있는 한두 종목만 이탈합니다.
그러니까 같은 "볼린저 하단 이탈"이라는 이름 아래 성격이 완전히 다른 두 사건이 섞여 있습니다. 하나는 시장이 통째로 흔들린 날의 동반 하락이고 다른 하나는 그 종목만의 악재입니다. 앞의 것은 며칠 뒤 반등하고 뒤의 것은 대체로 더 떨어집니다.
백테스트가 "거래당 평균 +0.49%"라고 말할 때, 그 계산은 24,692건을 한 통에 부어놓고 나눈 값입니다. 이걸 풀링 평균이라고 부르겠습니다. 문제는 그 통 안에 패닉일 거래 6,810건이 들어 있다는 점입니다. 평균 +2.63%짜리 덩어리가 전체의 4분의 1을 넘게 차지하니, 나머지가 모두 마이너스여도 총합은 플러스로 나옵니다.
다른 방식으로 세어보면 답이 달라집니다. 날마다 같은 금액을 투입한다고 가정하고 하루치 성적을 먼저 낸 다음, 그 일별 평균들을 다시 평균 내는 겁니다.
풀링 평균: +0.49% — 거래를 전부 한 통에 넣고 나눈 값
일별 평균의 평균: −0.34% — 날마다 같은 돈을 넣었을 때
부호가 뒤집힙니다. 두 숫자 모두 틀리지 않았지만 서로 다른 질문에 답하고 있습니다. 풀링 평균은 "이 신호 하나를 무작위로 뽑으면 평균 얼마인가"에 답합니다. 실제 투자자가 알고 싶은 것은 그게 아니라 "내 계좌를 이 규칙에 맡기면 어떻게 되는가"입니다.
그 차이는 돈이 무한하지 않다는 데서 옵니다. 패닉일에 신호가 300개 떴을 때 300개를 다 살 수 있다면 풀링 평균이 곧 내 성적입니다. 하지만 10종목만 담을 수 있는 계좌는 그중 10개만 잡고 나머지 290개를 흘려보냅니다. 정작 돈이 놀고 있는 평상시에는 마이너스 신호를 꼬박꼬박 받아먹습니다. 좋은 기회는 용량이 없어서 놓치고 나쁜 기회는 자리가 남아서 다 받는 구조입니다.
이 설명이 맞다면 계좌 용량을 키울수록 성적이 좋아져야 합니다. 슬롯 수만 바꿔서 같은 규칙을 돌렸습니다.
| 동시 보유 슬롯 | 5년 총수익 | 연환산 | 최대낙폭 | 거래 수 |
|---|---|---|---|---|
| 10종목 | −58.9% | −16.3% | −73.5% | 2,137 |
| 30종목 | −41.0% | −10.0% | −56.6% | 5,151 |
| 100종목 | +3.4% | +0.7% | −33.2% | 9,459 |
| 300종목 | +24.9% | +4.6% | −11.3% | 11,420 |
예상대로입니다. 규칙은 한 글자도 바꾸지 않았는데 −58.9%와 +24.9% 사이를 오갑니다. 차이를 만든 것은 전략이 아니라 그 전략을 담는 그릇의 크기였습니다.
여기서 백테스트 도구를 볼 때 확인할 점이 하나 생깁니다. 자본 제약이 없는 백테스트는 300슬롯 세계의 숫자를 보여줍니다. 신호가 뜨면 무조건 다 산다고 가정하기 때문입니다. 개인 계좌가 실제로 사는 세계는 위 표의 맨 윗줄에 가깝습니다.
표를 다시 보면 자연스럽게 떠오르는 생각입니다. 플러스가 나오는 구간이 하나뿐이라면 그 구간에서만 사면 될 일입니다. 게다가 그날 신호가 몇 개인지는 종가에 이미 알 수 있습니다. 미래를 훔쳐보는 조건이 아닙니다.
"그날 대형주 하단 이탈이 100개 이상인 날에만 진입, 손절 없이 5일 보유"로 10슬롯 계좌를 돌렸습니다.
5년 +85.3%, 연환산 +13.2%, 최대낙폭 −9.6%. 앞의 −58.9%와 같은 신호·같은 슬롯 수인데 진입일만 골랐습니다.
낙폭이 −73.5%에서 −9.6%로 줄어든 것이 수익률보다 중요합니다. 손실을 만들던 구간에 아예 들어가지 않았기 때문입니다.
이런 결과가 나오면 임계값을 100개로 정한 것이 우연인지부터 의심해야 합니다. 하나의 숫자에서만 좋게 나온다면 과최적화입니다. 임계값을 넓게 흔들어 봤습니다.
| 임계값 | 해당 일수 | 에피소드 | 거래당 평균 | 10슬롯 총수익 | 최대낙폭 |
|---|---|---|---|---|---|
| 60개 이상 | 96일 | 33 | +1.70% | +62.1% | −16.0% |
| 80개 이상 | 68일 | 26 | +2.15% | +89.8% | −15.7% |
| 100개 이상 | 48일 | 21 | +2.63% | +85.3% | −9.6% |
| 120개 이상 | 32일 | 16 | +2.66% | +80.7% | −9.9% |
| 150개 이상 | 16일 | 11 | +2.86% | +33.7% | −9.5% |
유니버스 대비 비율(15%·20%·25%·30%·35%)로 바꿔 정의해도 전 구간에서 플러스가 유지됩니다.
임계값을 60에서 150까지 움직여도 부호가 바뀌지 않습니다. 특정 숫자에 얹힌 결과가 아니라는 뜻입니다. 여기까지만 보면 쓸 만한 규칙을 찾은 것처럼 보입니다.
같은 데이터를 반대편에서 보면 이야기가 달라집니다. 네 가지가 걸립니다.
패닉일에 산 것이 좋았던 걸까요, 아니면 볼린저 이탈 종목을 고른 것이 좋았던 걸까요. 같은 48일에 대조군을 만들어 비교했습니다.
| 패닉일에 무엇을 샀나 | 거래 수 | 승률 | 5일 평균 |
|---|---|---|---|
| 볼린저 하단 이탈 종목 | 6,807 | 62.0% | +2.64% |
| 대형주 전체 (무차별 매수) | 18,786 | 56.3% | +1.80% |
| 하단 이탈하지 않은 대형주 | 11,979 | 53.1% | +1.32% |
| 코스피 지수 보유 | 48 | 72.9% | +2.01% |
이탈하지 않은 종목도 +1.32%를 냈고 지수만 들고 있어도 +2.01%였습니다. 볼린저 조건이 더한 몫은 나머지 절반 정도입니다. 수익의 절반가량은 종목 선택이 아니라 "폭락 다음 날 샀다"는 시장 타이밍에서 나왔습니다. 패닉일의 코스피 당일 등락은 평균 −2.51%였고 48일 중 22일이 −2% 아래였습니다.
가장 결정적인 문제입니다. 핀트릭스는 공공데이터를 쓰고 그 데이터는 하루 늦게 도착합니다. 신호를 계산해 화면에 띄우는 시점에는 이미 D+1이 지나 있어서 이용자가 실제로 살 수 있는 가장 빠른 시점은 D+2 시가입니다.
| 진입 시점 | 2일 보유 | 3일 보유 | 5일 보유 | 10일 보유 |
|---|---|---|---|---|
| 신호일 종가 (불가능) | +1.36% | +1.79% | +2.67% | +2.57% |
| D+1 시가 (불가능) | +0.92% | +1.78% | +2.63% | +2.07% |
| D+2 시가 (핀트릭스 현실) | +0.89% | +1.60% | +1.64% | +0.84% |
하루 늦으면 +2.63%가 +1.64%로 줄어듭니다. 반등의 40%가 이미 지나간 뒤에 들어가는 셈입니다. 이 정도 감쇠는 평균회귀 전략에서 흔합니다 — 신선도가 곧 수익인 구조라서 그렇습니다.
48일이라고 하면 많아 보이지만 패닉은 연달아 옵니다. 붙어 있는 날을 하나로 묶으면 독립적인 사건은 21개뿐입니다. 그리고 그 21개의 성적이 고르지 않습니다.
| 에피소드 | 거래 | 평균 | 승률 |
|---|---|---|---|
| 2026-07-29 (1일) | 133 | +25.68% | 99% |
| 2026-06-08 (1일) | 185 | +12.24% | 97% |
| 2024-12-09 (1일) | 116 | +9.47% | 96% |
| … 중간 17개 생략 … | |||
| 2022-06-13 ~ 06-23 (8일) | 1,201 | −3.11% | 29% |
상위 한두 사건을 빼면 그림이 상당히 달라집니다. 반대쪽 끝에는 2022년 6월이 있습니다. 이 시기는 하루 폭락이 아니라 추세적인 하락이었고 8일 동안 1,201건을 사서 평균 −3.11%에 승률 29%를 기록했습니다. 연도별로 봐도 2022년만 −0.10%로 유일한 마이너스입니다.
규칙의 약점이 여기서 드러납니다. 이 필터는 하루짜리 충격과 계속 흘러내리는 장을 구분하지 못합니다. 둘 다 "그날 신호 100개 이상"으로 똑같이 보입니다.
1,222거래일 중 48일에만 진입하므로 나머지 96%의 기간에는 현금으로 대기합니다. 연 13.2%라는 숫자는 그 유휴 자본까지 포함해 계산한 값이라 그 자체로 부풀려지지는 않았습니다. 다만 1년에 서너 번 오는 날을 기다렸다가 그날 바로 실행할 수 있는가는 다른 문제입니다. 시장이 하루에 −3% 빠진 다음 날 아침에 열 종목을 사는 일은 계산상으로는 간단하지만 실제로는 그렇지 않습니다.
이 글에서 확인한 것을 다시 모으면 이렇습니다.
그래서 패닉일 필터는 핀트릭스의 전략 프리셋에 넣지 않았습니다. 검증에서 살아남긴 했지만 우리 데이터로는 하루 늦게밖에 실행할 수 없고 그 하루에 수익의 40%가 사라집니다. 여기에 표본 21개와 추세 하락장에서의 약점을 더하면 남에게 권할 만한 상태가 아닙니다. 다만 왜 안 되는지가 분명한 실패라서 기록으로는 남겨둘 값어치가 있다고 봅니다.