NOONOO TRADING봇에서 시작하기

다중검정의 함정 — 백테스트 100개 중 1등을 고르면 안 되는 이유

백테스트를 여러 개 돌려서 가장 성적이 좋은 것을 고르는 방식은 자연스러워 보입니다. 그런데 이 방식에는 구조적인 문제가 하나 있습니다. 시도 횟수를 늘리면 실력이 없어도 최고 성적은 올라간다는 점입니다. 100번 중 1등의 성적은 그 전략의 실력이 아니라, 상당 부분 100번 시도했다는 사실 자체가 만들어낸 숫자입니다.

같은 데이터에 여러 번 물어보면 답이 좋아 보인다

다중검정(multiple testing)은 같은 데이터에 여러 개의 가설을 시험할 때 생기는 문제를 가리킵니다. 하나만 시험하면 우연히 좋은 결과가 나올 확률이 낮지만, 수백 번 시험하면 그중 몇 개는 순전히 운으로 좋아 보입니다. 그리고 우리는 대체로 그 몇 개만 남기고 나머지는 버립니다.

같은 절차, 다른 해석

사례 A · 전략 1개를 백테스트
  → 결과가 좋으면  참고할 만한 신호

사례 B · 전략 100개를 백테스트 후 1등 선택
  → 결과가 좋으면  실력인지 운인지 알 수 없음
  → 버린 99개를 보고하지 않으면
     사례 A와 구분되지 않는다

─────────────
같은 성적표라도
몇 번 시도해서 나온 것인지에 따라
의미가 완전히 달라진다

여기서 핵심은 버린 99개가 보고서에 남지 않는다는 점입니다. 성적표에는 1등만 적히고, 그 1등이 100번 중 하나였다는 정보는 사라집니다. 이 정보가 사라지면 읽는 사람은 사례 A와 사례 B를 구별할 방법이 없습니다. 생존자 편향이 살아남은 종목만 보게 만드는 것과 같은 구조가, 전략 선택 단계에서도 그대로 일어납니다.

동전 100개를 던져도 1등은 62승 38패다

가장 확실한 확인 방법은 실력이 전혀 없는 전략으로 같은 절차를 밟아보는 것입니다. 방향을 무작위로 정하는 전략 100개를 만들어 각각 100거래씩 돌려봅니다. 기대 승률은 정확히 50%입니다.

무작위 전략 100개 · 각 100거래

한 전략의 승수 분포
  평균  50승
  표준편차  √(100 × 0.5 × 0.5) = 5승

100개를 뽑았을 때 최댓값의 기대 위치
  대략 평균 + 2.5 표준편차
  50 + (2.5 × 5) = 약 62승

즉 1등 성적표
  62승 38패 · 승률 62%
  그러나 이 전략의 실제 실력 = 50%

─────────────
승률 12%p는 전부
100번 시도했다는 사실에서 나온 것

이 62%는 조작이 아닙니다. 백테스트 코드에 버그가 있는 것도 아니고 미래참조가 섞인 것도 아닙니다. 무작위 숫자를 100번 뽑으면 그중 가장 큰 값은 평균보다 위에 있는 게 당연하고, 우리는 그 가장 큰 값만 골라낸 것뿐입니다. 문제는 그렇게 고른 62%를 앞으로도 62%일 것으로 읽는 순간 시작됩니다. 표본이 몇 거래여야 승률을 믿을 수 있는지는 거래 표본 크기에 따로 정리돼 있습니다.

조합은 생각보다 훨씬 빨리 늘어난다

"나는 전략 100개를 만든 적이 없다"고 생각하기 쉽습니다. 그런데 설정값을 조금씩 바꿔가며 돌린 것도 전부 별개의 시도로 세야 합니다. 격자 탐색은 사람이 세는 것보다 훨씬 빠르게 불어납니다.

단순한 이동평균 교차 전략 하나

단기 이평  5·10·15·20·25·30·35·40·45·50  10개
장기 이평  60·80·100·120·140·160·180·200 … 10개
손절  0.5% · 1% · 1.5% · 2% · 3%  5개
익절  1% · 2% · 3% · 4% · 6%  5개

조합 수
  10 × 10 × 5 × 5 = 2,500가지

여기에 코인 20종을 각각 돌리면
  2,500 × 20 = 50,000번의 시도

─────────────
"전략 하나를 최적화했다"가
실제로는 5만 번 중 1등 고르기

여기에 기간을 바꿔가며 다시 돌린 횟수, 지표를 하나 추가했다가 뺀 횟수, 진입 조건을 손봐서 재실행한 횟수까지 더하면 실제 시도 횟수는 더 커집니다. 과최적화가 "설정값을 데이터에 맞춰 깎는 문제"라면, 다중검정은 그보다 한 단계 위에서 후보 자체를 데이터로 골랐다는 문제입니다. 둘은 같이 나타나지만 원인이 다르고, 대응도 다릅니다.

우연히 통과하는 개수는 미리 계산된다

"성적이 기준을 넘으면 채택한다"는 규칙을 세워도, 시도 횟수가 많으면 기준을 넘는 쓰레기 후보의 개수가 미리 정해집니다. 이건 확률 계산으로 그냥 나옵니다.

개별 기준 = 우연히 통과할 확률 5%

시도 1번  → 우연 통과 기대  0.05개
시도 20번  → 우연 통과 기대  1개
시도 100번  → 우연 통과 기대  5개
시도 2,500번  → 우연 통과 기대  125개

2,500번 중 적어도 하나가 통과할 확률
  1 − (0.95 ^ 2,500) ≈ 사실상 100%

기준을 시도 횟수로 나누면 (본페로니)
  0.05 ÷ 2,500 = 0.00002
  → 이 정도로 빡빡해야 원래 의도한 5%가 유지된다

─────────────
후보가 통과했다는 사실만으로는
아무것도 증명되지 않는다
몇 번 시도했는지를 함께 봐야 한다

본페로니 보정은 가장 단순하고 가장 보수적인 방법이라 실무에서 그대로 쓰기는 빡빡한 편입니다. 다만 방향은 분명합니다. 시도 횟수가 늘어나면 통과 기준도 같이 올라가야 합니다. 시도는 5만 번 하면서 기준은 1번 시도할 때와 똑같이 두면, 통과한 후보가 나오는 건 발견이 아니라 예정된 결과입니다.

승률 12%p가 사라지면 손익은 뒤집힌다

승률 62%가 실제값 50%로 돌아오는 것을 "조금 나빠지는 정도"로 생각하기 쉽습니다. 왕복 수수료를 넣고 계산하면 그렇지 않습니다.

100거래 · 평균 이익 +0.6% · 평균 손실 −0.5%

백테스트 1등 성적 (62승 38패)
  이익  62 × 0.6% = +37.2%
  손실  38 × 0.5% = −19.0%
  수수료  100 × 0.10% = −10.0%
  합계  +8.2%

실제 실력대로 돌아온 성적 (50승 50패)
  이익  50 × 0.6% = +30.0%
  손실  50 × 0.5% = −25.0%
  수수료  100 × 0.10% = −10.0%
  합계  −5.0%

─────────────
승률 12%p 차이가
손익 13.2%p를 움직였고
부호가 바뀌었다

수수료가 고정 비용으로 매 거래에 붙기 때문에 이런 일이 생깁니다. 승률이 조금만 내려가도 그 비용을 덮지 못하게 되고, 백테스트에서 흑자였던 곡선이 실거래에서 적자가 됩니다. 왕복 0.10%가 어디서 나오는 숫자인지는 왕복 거래 비용에, 이익과 손실의 크기 비율로 손익을 보는 방법은 손익비에 있습니다. 백테스트 자산곡선이 실거래에서 꺾이는 다른 원인들은 백테스트 가이드에 함께 정리돼 있습니다.

시도 횟수를 세는 것부터 시작한다

다중검정은 없앨 수 있는 문제가 아닙니다. 후보를 여러 개 시험하는 것 자체가 연구의 방식이기 때문입니다. 대신 얼마나 시도했는지 세고, 그만큼 기준을 올리고, 아껴둔 데이터로 한 번만 확인하는 절차로 관리합니다.

후보를 고르기 전에 정해두는 것

시도 횟수를 기록한다
  · 격자 조합 수 × 종목 수 × 재실행 횟수
  · 세지 않으면 보정할 수 없다
② 데이터를 미리 나눈다
  · 탐색용 70% / 봉인 30%
  · 봉인 구간은 단 한 번만 연다
  · 두 번째 열면 그 구간도 탐색용이 된다
③ 판정 기준을 먼저 적어둔다
  · 거래 수 하한 · 손익비 하한 · 최대 낙폭 상한
  · 결과를 본 뒤 기준을 고치지 않는다
순열 검정으로 대조군을 만든다
  · 신호와 수익률의 짝을 무작위로 섞어 1,000회 재계산
  · 실제 성적이 그 1,000개 중 몇 등인지 본다
  · 상위 30% 안이면 우연과 구분되지 않는다
⑤ 채택 후에도 전진 검증을 붙인다

─────────────
기록할 항목
  · 시험한 조합 수 전체
  · 봉인 구간을 연 횟수
  · 탐색 구간 성적과 봉인 구간 성적의 차이

②의 구간 분할을 한 번이 아니라 시간 순서대로 밀어가며 반복하는 방식이 워크포워드 분석입니다. ④의 순열 검정은 코드 몇 줄이면 되고, 무작위 대조군과 비교한다는 점에서 몬테카를로 시뮬레이션과 발상이 같습니다. ⑤는 실계좌 이전에 모의 거래로 같은 규칙을 그대로 돌려보는 단계입니다. 시장 상태가 바뀌면 성적도 함께 바뀌므로 시장 국면을 나눠 성적을 따로 보는 것도 같이 하면 좋습니다.

연속 손실이 몇 번까지 정상 범위인지 미리 알아두면, 채택한 전략이 깨진 것인지 원래 그럴 수 있는 구간인지 구분할 때 도움이 됩니다. 이 계산은 연속 손실 확률에 있고, 실거래 곡선을 기준선과 비교하는 방법은 자산곡선 매매에 정리돼 있습니다.

정리

다중검정 = 같은 데이터에 여러 가설을 시험할 때 생기는 문제
시도 횟수를 늘리면 실력이 없어도 최고 성적은 올라간다
무작위 전략 100개 × 100거래 → 1등은 62승 38패
그 승률 12%p는 전부 시도 횟수가 만든 것
이평 2개 + 손절 + 익절만 훑어도 조합 2,500가지
코인 20종을 붙이면 5만 번의 시도가 된다
개별 기준 5% · 시도 2,500번 → 우연 통과 125개
시도가 늘면 통과 기준도 같이 올라가야 한다
승률 62% → 50%면 손익이 +8.2% → −5.0%
수수료가 고정으로 붙어 부호가 뒤집힌다
봉인 구간은 단 한 번만 연다
성적표에는 시도 횟수를 함께 적는다

한 줄로 줄이면 이렇습니다. 1등의 성적보다 몇 번 중 1등인지가 더 많은 것을 말해줍니다. 시도 횟수를 적어두지 않은 백테스트 결과는, 잘 나왔더라도 그것이 발견인지 우연인지 판단할 근거가 없습니다.

주의

본문의 무작위 전략 100개, 각 100거래, 표준편차 5승, 최댓값 위치 약 62승, 격자 조합 2,500가지, 코인 20종, 개별 기준 5%, 평균 이익 +0.6%와 평균 손실 −0.5%, 왕복 수수료 0.10%, 순열 1,000회 같은 숫자는 모두 다중검정의 크기를 보여주기 위한 가정 예시이며 특정 전략이나 특정 계좌의 실제 측정값이 아닙니다. 100개 표본에서 최댓값이 평균 + 2.5 표준편차 부근에 오는 것은 근사이고 실제로는 시행마다 흩어집니다. 본페로니 보정은 가장 보수적인 방법이라 후보가 많을 때 실제 신호까지 함께 걸러낼 수 있으며, 격자 조합처럼 서로 비슷한 후보들은 완전히 독립적인 시도가 아니라서 우연 통과 개수 계산도 근사입니다. 홀드아웃·워크포워드·순열 검정을 모두 통과했다고 해서 앞으로의 수익이 보장되는 것은 아니며, 시장 구조가 바뀌면 검증된 전략도 성적이 달라집니다. 레버리지 거래는 원금 전액을 잃을 수 있으며, 투자 판단과 그 결과는 본인 책임입니다.

NOONOO TRADING 무료 채팅방에서 실시간 트레이딩을 같이 보세요.

봇에서 시작하기

📈 OKX 신규 가입 시 거래 수수료 할인

OKX 수수료 할인 가입 →