블록 부트스트랩 — 거래 성적의 신뢰구간을 구하는 법
백테스트나 모의매매 결과를 볼 때 거의 모든 사람이 평균 하나만 봅니다. "건당 +0.25%, 승률 58%" 같은 숫자입니다. 그런데 그 숫자는 내가 가진 기록 한 묶음에서 나온 값 하나일 뿐입니다. 같은 전략을 같은 기간에 다시 돌려 거래가 조금만 다르게 뽑혔다면 평균은 얼마나 흔들렸을까. 이 질문에 숫자로 답하는 도구가 부트스트랩이고, 거래 데이터에서는 거래 단위가 아니라 날짜 블록 단위로 재추출해야 답이 정직해집니다.
평균 하나는 결론이 아니다
거래 기록 200건의 평균이 건당 +0.25%라고 합시다. 이 숫자만 보면 전략이 양수라고 말하고 싶어집니다. 하지만 거래 수익은 한 번도 같은 값이 나오지 않습니다. 어떤 거래는 +3%, 어떤 거래는 −4%이고, 그 200개를 평균한 것이 +0.25%입니다. 분산이 큰 값들의 평균은 표본이 조금만 바뀌어도 크게 움직입니다.
그래서 봐야 하는 것은 평균이 아니라 평균이 놓여 있을 수 있는 범위입니다. 범위가 +0.18% ~ +0.32%라면 양수라고 말해도 됩니다. 범위가 −0.30% ~ +0.80%라면 평균은 똑같이 +0.25%지만 "양수인지 아닌지 모른다"가 정직한 결론입니다. 거래 표본 수가 왜 중요한지도 이 범위의 폭으로 설명됩니다.
이 범위를 구하는 고전적인 방법은 공식(표준오차 × 1.96)을 쓰는 것인데, 그 공식은 거래 수익이 정규분포를 따르고 서로 독립이라는 두 가정 위에 서 있습니다. 거래 수익은 둘 다 아닙니다. 꼬리가 두껍고(큰 손실 몇 건이 전체를 좌우), 같은 날 거래들이 서로 닮아 있습니다. 그래서 공식 대신 데이터를 직접 재추출하는 방법을 씁니다.
부트스트랩이 하는 일
부트스트랩의 아이디어는 단순합니다. 기록 200건에서 복원추출로 200건을 다시 뽑습니다. 복원추출이므로 같은 거래가 두 번 뽑히기도 하고 어떤 거래는 한 번도 안 뽑힙니다. 그렇게 만든 가짜 표본의 평균을 계산합니다. 이것을 수천 번 반복하면 평균값 수천 개가 모이고, 그 분포의 양쪽 끝을 잘라내면 신뢰구간이 됩니다.
원본 기록 200건, 평균 +0.25%
반복 횟수 2,000회
1회차: 200건 복원추출 → 평균 +0.31%
2회차: 200건 복원추출 → 평균 +0.19%
3회차: 200건 복원추출 → 평균 +0.27%
...
2,000회차: 평균 +0.22%
평균 2,000개를 정렬
2.5% 분위 +0.11%
97.5% 분위 +0.39%
─────────────
95% 신뢰구간 = [+0.11%, +0.39%]
구간 폭 0.28%p · 0을 포함하지 않는다
여기까지만 보면 깔끔합니다. 구간이 0 위에 있으니 양수라고 말할 수 있어 보입니다. 문제는 이 계산이 200건을 서로 독립인 200개의 정보로 취급했다는 점입니다. 실제 거래 기록에서 그 가정은 거의 항상 틀립니다.
거래는 서로 독립이 아니다
같은 날 발생한 거래들을 생각해 보세요. 그 거래들은 같은 시장 분위기, 같은 변동성, 같은 방향의 추세 안에 있습니다. BTC가 하루 종일 떨어지는 날에 롱으로 진입한 거래 8건은 거의 다 같이 손실입니다. 이 8건은 정보 8개가 아니라 "그날 시장이 불리했다"는 정보 1개에 가깝습니다.
원인은 세 가지가 겹칩니다.
- 공통 시장 요인 — 알트코인 대부분이 BTC 방향을 따라 움직입니다. 여러 종목에 동시 진입했어도 결과는 한 방향으로 뭉칩니다.
- 신호 군집 — 대부분의 전략은 신호가 몰려 나옵니다. 급락하면 급락 신호가 여러 종목에서 동시에 뜹니다. 조용한 날에는 거래가 0건입니다.
- 수익률 자기상관 — 가격 자체에 짧은 지속성·반전 경향이 있습니다. 수익률 자기상관이 0이 아니면 연속된 거래의 결과도 서로 얽힙니다.
의존성이 있는 데이터를 독립인 것처럼 재추출하면 구간이 실제보다 좁게 나옵니다. 정보량을 실제보다 많게 세기 때문입니다. 좁은 구간은 "통계적으로 유의하다"는 결론을 너무 쉽게 만들어 줍니다. 실전에서 성적이 안 나오는 전략이 검증 단계에서 통과했다면, 이 지점을 의심해야 합니다.
블록 부트스트랩 — 거래 대신 날짜를 재추출한다
해결책은 재추출 단위를 바꾸는 것입니다. 거래 하나를 뽑는 대신 하루치 거래 전체를 한 덩어리(블록)로 뽑습니다. 블록 안의 의존성은 블록이 통째로 움직이므로 보존되고, 블록끼리는 서로 다른 날이므로 독립에 가깝습니다.
200건을 날짜별로 묶는다
거래가 있었던 날 26일
하루 평균 7.7건
가장 많은 날 24건
가장 적은 날 1건
1회차: 26개 블록 중 26개 복원추출
→ 거래 183건 → 평균 +0.52%
2회차: → 거래 221건 → 평균 −0.08%
3회차: → 거래 196건 → 평균 +0.31%
...
평균 2,000개 분위
2.5% −0.09%
97.5% +0.61%
─────────────
95% 신뢰구간 = [−0.09%, +0.61%]
구간 폭 0.70%p · 0을 포함한다
같은 데이터, 같은 평균 +0.25%입니다. 재추출 단위만 바꿨는데 구간 폭이 0.28%p에서 0.70%p로 2.5배 넓어졌고, 0을 포함하게 됐습니다. 판정이 "양수 확인"에서 "모른다"로 바뀝니다. 어느 쪽이 맞을까요. 블록 쪽입니다. 단순 부트스트랩이 구간을 좁게 만든 것은 계산이 더 정밀했기 때문이 아니라 의존성을 무시했기 때문입니다.
블록을 뽑으면 재추출된 거래 수가 매번 달라지는 것도 눈여겨볼 점입니다. 거래가 24건인 날이 두 번 뽑히면 그 회차의 표본은 커지고, 1건인 날만 뽑히면 작아집니다. 이 변동 자체가 "거래 수가 날마다 다르다"는 실제 구조를 반영합니다.
유효 표본 수는 거래 수가 아니라 블록 수다
이 방법의 가장 중요한 결론은 여기입니다. 검정의 정밀도를 결정하는 것은 거래 수가 아니라 독립적인 블록의 개수입니다.
사례 A
거래 4,500건
기간 26일
유효 표본 26 (거래 4,500이 아니다)
사례 B
거래 900건
기간 380일
유효 표본 380
─────────────
거래 수는 A가 5배 많지만
신뢰구간은 B가 훨씬 좁다
26일치 기록에서 거래 4,500건을 모았다고 해서 표본 4,500의 정밀도가 생기지 않습니다. 26일이라는 기간은 시장 국면 하나 또는 둘밖에 담지 못합니다. 그 기간이 마침 전략에 유리한 국면이었다면 평균은 양수로 나오고, 다음 달에 뒤집힙니다. 짧은 기간에서 나온 양수를 근거로 쓰지 않는다는 규칙이 여기서 나옵니다. 거래를 더 모으는 것으로는 해결되지 않고, 기간을 늘려야 합니다.
그래서 보고할 때는 거래 수와 함께 기간(블록 수)을 항상 같이 적어야 합니다. "4,500건"만 적힌 보고서는 정밀도를 과장합니다.
구간을 읽는 두 가지 기준
구간을 구했다면 판정은 두 단계입니다. 첫째는 0, 둘째는 비용입니다.
- 구간이 0을 포함하는가 — 포함하면 "방향이 있다고 말할 근거가 없다"입니다. 평균이 양수여도 마찬가지입니다. 이 단계를 통과하지 못한 결과는 발견이 아닙니다.
- 구간 하단이 비용을 넘는가 — 0을 넘는 것으로는 부족합니다. 실제로 매매하면 수수료와 슬리피지가 빠집니다. 왕복 비용이 0.30%라면 구간 하단이 0.30%를 넘어야 운용 가치가 있습니다.
전략 1 CI [−0.09%, +0.61%]
→ 0 포함 근거 없음
전략 2 CI [+0.05%, +0.21%]
→ 0은 넘지만 비용 미달
(상단 0.21% < 비용 0.30%)
→ 통계적으로는 양수, 실전은 적자
전략 3 CI [+0.44%, +1.02%]
→ 하단 0.44% > 비용 0.30%
→ 비용 차감 후에도 양수
─────────────
기준선은 0이 아니라 왕복 비용이다
전략 2가 가장 흔하게 사람을 속이는 경우입니다. 구간이 전부 0 위에 있으니 "유의하다"고 보고되지만, 비용 선을 그어 보면 상단조차 비용에 못 미칩니다. 그래서 검정은 처음부터 비용을 차감한 순수익으로 해야 합니다. 비용 가정을 어떻게 세우는지는 백테스트 슬리피지 모델링에서 다룹니다.
블록 길이를 고르는 기준
블록을 하루로 묶는 것이 기본이지만, 길이를 늘려야 하는 경우도 있습니다. 판단 기준은 "의존성이 며칠까지 이어지는가"입니다.
- 하루(기본) — 대부분의 단기 전략. 같은 날 거래들의 공통 요인을 잡습니다. 보유 시간이 몇 분~몇 시간이면 충분합니다.
- 며칠 — 보유 시간이 하루를 넘거나, 포지션이 날짜를 걸쳐 이어지는 전략. 블록이 보유 기간보다 짧으면 한 거래가 두 블록에 쪼개져 의존성이 샙니다.
- 주 단위 — 추세 추종처럼 국면 전체가 성적을 좌우하는 전략. 다만 블록 수가 급격히 줄어듭니다. 380일이면 일 블록 380개지만 주 블록은 54개뿐입니다.
블록이 길수록 의존성 보존은 좋아지지만 블록 수가 줄어 구간이 더 넓어집니다. 둘 사이의 교환입니다. 실무적으로는 길이를 몇 가지로 바꿔 돌려 보고 구간이 어떻게 변하는지 확인합니다. 길이를 늘려도 구간 하단이 비용 위에 남아 있으면 그 결과는 블록 선택에 의존하지 않는 것이고, 길이를 조금 늘리자마자 0을 포함하기 시작하면 원래부터 근거가 약했던 것입니다. 파라미터를 바꿔가며 안정성을 보는 워크포워드 분석과 같은 발상입니다.
흔한 실수
- 거래 단위로 재추출하고 끝낸다. 가장 흔한 실수입니다. 구간이 좁게 나와서 결론이 과감해집니다. 날짜 블록으로 한 번 더 돌려 비교해야 합니다.
- 거래 수를 유효 표본으로 보고한다. "n = 4,500"이 아니라 "거래 4,500건 / 26일(블록 26개)"로 적습니다.
- 여러 후보를 돌리고 가장 좋은 하나의 구간만 본다. 후보를 100개 돌리면 우연히 구간이 0 위에 오는 것이 몇 개는 나옵니다. 다중검정 함정을 같이 다뤄야 합니다.
- 비용 차감 전 값으로 구간을 구한다. 기준선을 0으로 잡게 되고, 실전 적자 전략이 통과합니다.
- 구간이 좁은 것을 좋은 신호로 본다. 좁은 구간은 전략이 좋다는 뜻이 아니라 표본이 많다는 뜻입니다. 의존성을 무시해서 좁아진 경우도 구별할 수 없습니다.
- 구간이 0을 포함했는데 평균이 양수라는 이유로 진행한다. 이것이 과최적화된 결과를 라이브로 옮기는 전형적인 경로입니다.
- 부트스트랩으로 미래를 추정한다고 생각한다. 부트스트랩은 "내가 가진 기록에서 평균이 얼마나 흔들리는가"만 말해 줍니다. 기간 밖에서도 성립하는지는 홀드아웃 검정으로 따로 확인해야 합니다.
마지막 항목이 특히 중요합니다. 신뢰구간은 표본 내 불확실성을 재는 도구이고, 기간이 바뀌었을 때 전략이 살아남는지는 전혀 다른 질문입니다. 두 가지를 다 통과해야 합니다. 분포 전체를 다루는 방식이라는 점에서 몬테카를로 시뮬레이션과 비슷해 보이지만, 몬테카를로는 가정한 분포에서 미래 경로를 생성하고 부트스트랩은 실제 기록만 재배열한다는 점이 다릅니다.
실무 순서
정리하면 작업 순서는 이렇습니다.
① 거래 기록에 비용을 차감한다 (왕복)
② 날짜별로 블록을 만든다 → 블록 수 확인
③ 블록 복원추출 2,000회 → 평균 분포
④ 2.5% / 97.5% 분위 → 95% 신뢰구간
⑤ 구간 하단 vs 왕복 비용 비교
⑥ 블록 길이를 바꿔 구간 안정성 확인
⑦ 후보가 여럿이면 다중검정 보정
⑧ 기간 밖 홀드아웃으로 재확인
─────────────
①~⑧ 중 하나라도 건너뛰면
통과한 것이 아니라 검정하지 않은 것
⑥번에서 자주 걸립니다. 일 블록으로는 통과했는데 3일 블록으로 바꾸니 0을 포함하는 경우, 그 전략은 "의존성이 하루보다 길다"는 사실에 걸린 것이고 결과를 신뢰할 수 없습니다. 평균이 몇 %였는지보다 이 점검을 통과했는지가 중요합니다. 기대값 계산 자체는 기대값과 R 배수 쪽을 참고하면 되고, 부트스트랩은 그 기대값에 오차 막대를 붙이는 작업입니다.
정리
② 부트스트랩 = 복원추출 반복으로 평균의 분포를 만든다
③ 거래는 독립이 아니다 (공통 시장 요인·신호 군집·자기상관)
④ 거래 단위 재추출은 구간을 좁게 만든다 = 과신
⑤ 블록(날짜) 단위로 재추출하면 구간이 정직해진다
⑥ 예시: 폭 0.28%p → 0.70%p, 0을 포함하게 바뀜
⑦ 유효 표본 = 거래 수가 아니라 블록 수
⑧ 판정 기준선은 0이 아니라 왕복 비용
⑨ 블록 길이를 바꿔 구간 안정성까지 확인
⑩ 신뢰구간은 표본 내 불확실성 — 기간 밖은 홀드아웃으로
한 줄로 줄이면 이렇습니다. 거래 4,500건을 모았다는 말은 정밀도를 말해 주지 않습니다. 며칠을 모았는지가 정밀도를 말해 줍니다.
주의
본문의 거래 200건·26일·하루 평균 7.7건, 평균 +0.25%, 신뢰구간 [+0.11%, +0.39%]·[−0.09%, +0.61%]·[+0.05%, +0.21%]·[+0.44%, +1.02%], 왕복 비용 0.30%, 사례 A·B의 4,500건·900건, 반복 2,000회 등 모든 숫자는 계산과 개념을 설명하기 위한 가정 예시이며 특정 전략·특정 기간의 실제 측정값이 아닙니다. 블록 부트스트랩은 널리 쓰이는 방법이지만 모든 데이터 구조에서 정확한 구간을 보장하지는 않으며, 블록 길이 선택에 따라 결과가 달라집니다. 신뢰구간이 0이나 비용 선을 넘었다는 것은 보유한 과거 기록 안에서의 통계적 결과일 뿐, 미래 성과를 예측하거나 보장하지 않습니다. 이 글은 거래 성적을 통계적으로 검정하는 방법을 설명하는 교육 정보이며 특정 종목의 매수·매도 권유나 특정 수익을 보장하는 내용이 아닙니다. 레버리지 거래는 원금 손실 위험이 있고, 매매 판단과 그 결과는 본인 책임입니다.
NOONOO TRADING 무료 채팅방에서 실시간 트레이딩을 같이 보세요.
봇에서 시작하기📈 OKX 신규 가입 시 거래 수수료 할인
OKX 수수료 할인 가입 →