퍼지 K-폴드 교차검증 — 겹친 라벨과 엠바고로 검증 누수 막기
머신러닝으로 매매 신호를 만들 때 가장 흔한 검증 방법은 K-폴드 교차검증입니다. 데이터를 K개로 나눠 하나는 검증에, 나머지는 학습에 쓰는 과정을 K번 반복합니다. 그런데 트레이딩 데이터에서는 이 방법이 그대로 통하지 않습니다. 한 표본의 정답(라벨)이 "앞으로 며칠 동안의 가격"으로 정해지기 때문에, 서로 가까운 표본들이 같은 미래 구간을 나눠 갖기 때문입니다. 이 글은 그 겹침이 어떻게 검증 점수를 부풀리는지, 그리고 퍼지(purge)와 엠바고(embargo)로 이를 막는 방법을 정리합니다. 본문의 기간·정확도·수수료는 모두 설명용 가정입니다.
라벨이 미래 구간을 쓴다는 것
트레이딩 모델의 라벨은 보통 "진입 시점부터 N일 뒤 가격이 올랐는가" 또는 "익절과 손절 중 무엇에 먼저 닿았는가"로 정합니다. 즉 시점 t의 라벨은 t부터 t+N까지의 가격을 보고 결정됩니다. 표본 하나가 차지하는 시간이 한 점이 아니라 한 구간이라는 뜻입니다.
라벨 기간이 5일이면 1일 차 표본은 1~6일 가격을, 2일 차 표본은 2~7일 가격을 씁니다. 두 표본은 5일 중 4일을 공유합니다. 이웃한 표본의 라벨은 거의 같은 값이 나올 수밖에 없습니다. 미래 정보를 피처로 쓰는 문제는 미래참조 편향 글에서 다뤘는데, 여기서 다루는 누수는 피처가 깨끗해도 생긴다는 점이 다릅니다.
일반 K-폴드에서 누수가 생기는 방식
일반 K-폴드는 표본을 무작위로 섞어 나누는 경우가 많습니다. 그러면 검증 표본 바로 옆 날짜의 표본이 학습 데이터에 들어갑니다. 모델은 학습 중에 "2일 차 → 상승"을 외웠고, 검증에서 "3일 차"를 받습니다. 3일 차 라벨은 2일 차 라벨과 4일을 공유하므로 맞힐 확률이 높습니다. 모델이 시장을 예측한 것이 아니라 옆 표본의 답을 기억한 것입니다.
· 일봉 표본 1,000개 · 라벨 기간 5일 · 5-폴드 (검증 20%)
· 검증 표본 하나의 라벨 구간과 겹치는 이웃 표본: 앞 5개 + 뒤 5개 = 10개
· 무작위 분할이면 이웃 하나가 학습 데이터에 있을 확률 80%
· 10개 중 학습에 들어간 이웃의 기대 개수: 10 × 0.8 = 8개
· 검증 표본마다 정답을 거의 공유하는 표본 8개를 모델이 이미 본 셈
섞지 않고 시간 순서대로 블록을 나눠도 문제가 완전히 사라지지는 않습니다. 블록 경계 근처에서는 여전히 학습 표본과 검증 표본의 라벨 구간이 겹칩니다.
퍼지 — 겹치는 학습 표본을 지운다
퍼지는 학습 데이터 중 라벨 구간이 검증 구간과 하나라도 겹치는 표본을 제거하는 작업입니다. 시간 순서로 블록을 나눈 다음, 검증 블록 바로 앞에 있는 표본들의 라벨 끝 시점을 확인해 검증 구간 안으로 들어오면 지웁니다.
· 표본 1,000개를 시간 순으로 200개씩 5블록
· 3번째 폴드의 검증 구간: 401~600일
· 라벨 기간 5일 → 시점 t의 라벨은 t ~ t+5일 가격 사용
· 학습 표본 중 t + 5 ≥ 401 이고 t < 401 인 표본: 396~400일
· 퍼지 대상: 5개 (396일 표본은 401일 가격까지 본다)
라벨 기간이 길어지면 지워야 할 표본도 늘어납니다. 라벨을 "익절·손절 중 먼저 닿는 쪽"으로 정했다면 표본마다 라벨이 끝나는 시점이 다르므로, 표본별 실제 종료 시점을 기록해 두고 그 값으로 판정해야 합니다.
엠바고 — 검증 구간 뒤에 여유를 둔다
검증 구간 바로 뒤의 학습 표본은 라벨이 검증 구간과 겹치지 않습니다. 601일 표본은 601~606일 가격을 쓰니까요. 하지만 피처 쪽이 문제입니다. 20일 이동평균, 변동성, 수익률 자기상관 같은 피처는 과거 며칠을 거슬러 계산되므로 601일 표본의 피처에는 검증 구간의 가격이 녹아 있습니다. 시장 데이터의 자기상관은 수익률 자기상관 글을 참고하세요.
엠바고는 검증 구간이 끝난 뒤 일정 기간의 학습 표본을 추가로 버리는 규칙입니다. 보통 전체 표본의 1% 안팎이나 피처 계산 창 길이만큼 잡습니다.
· 전체 1,000개 − 검증 200개 = 학습 후보 800개
· 퍼지: 396~400일 → −5개
· 엠바고 1% = 10일: 601~610일 → −10개
· 최종 학습 표본: 800 − 5 − 10 = 785개
· 버리는 비율은 학습 후보의 약 1.9%. 데이터 손실은 작고, 누수 차단 효과는 크다
부풀린 정확도가 왜 위험한가
검증 정확도가 몇 %p 높게 나오는 것은 작아 보이지만, 수수료를 넣으면 결론이 뒤집힐 수 있습니다. 손익분기 승률과 비교하면 차이가 분명해집니다.
· 이기면 +1.0%, 지면 −1.0% · 왕복 비용 0.10%
· 순손익: 이길 때 +0.9%, 질 때 −1.1%
· 손익분기 승률 p: 0.9p − 1.1(1 − p) = 0 → p = 55%
· 일반 K-폴드 검증 정확도 58% → 손익분기보다 3%p 높아 보인다
· 퍼지·엠바고 적용 후 정확도 51% → 손익분기보다 4%p 낮다
· 거래당 기대값: 0.51 × 0.9 − 0.49 × 1.1 = −0.08%
같은 모델이 검증 방법만 바꿨는데 "돈 버는 모델"에서 "비용만큼 잃는 모델"이 됩니다. 기대값 계산은 트레이딩 기대값 글에, 왕복 비용은 왕복 거래 비용 글에 정리했습니다.
조합형 교차검증(CPCV)
시간 순 K-폴드는 백테스트 경로가 하나뿐이라는 한계가 있습니다. 조합형 퍼지 교차검증(CPCV)은 데이터를 N개 그룹으로 나눈 뒤, 그중 k개를 검증으로 쓰는 모든 조합을 돌립니다. 각 조합마다 퍼지와 엠바고를 똑같이 적용합니다.
· 그룹 N = 6 · 검증 그룹 k = 2
· 분할 수: 6C2 = 15개
· 그룹 하나가 검증으로 쓰이는 횟수: 15 × 2 ÷ 6 = 5회
· 만들어지는 백테스트 경로: 5개 (각 경로는 모든 구간을 한 번씩 검증)
· 경로가 5개면 성과 하나가 아니라 성과의 분포를 볼 수 있다
경로가 여럿이면 "운 좋은 한 번"을 걸러내기 쉽습니다. 다만 조합을 많이 돌릴수록 그중 좋은 결과만 고르고 싶은 유혹도 커집니다. 여러 설정을 시험할 때 생기는 문제는 다중검정의 함정과 디플레이티드 샤프 비율 글에서 다뤘습니다.
워크포워드와의 관계
워크포워드 분석은 항상 과거로 학습하고 바로 다음 구간으로 검증합니다. 실전과 가장 비슷하지만 검증 구간이 데이터 뒤쪽에 몰리고 경로가 하나입니다. 퍼지 K-폴드는 과거 구간도 검증에 쓰므로 데이터를 더 넓게 활용합니다. 대신 미래 구간으로 학습한 모델이 과거를 검증하는 구조라서, 시장 구조가 크게 바뀐 경우에는 낙관적으로 나올 수 있습니다. 실무에서는 모델 선택은 퍼지 K-폴드로, 최종 확인은 한 번도 보지 않은 최근 구간의 워크포워드로 나누는 경우가 많습니다. 표본이 적으면 어느 방법이든 결과가 흔들리므로 거래 표본 크기도 함께 확인합니다.
정리
② 무작위 K-폴드는 검증 표본마다 정답이 겹치는 표본을 학습에 넣는다 (예시 1: 평균 8개)
③ 퍼지: 라벨 구간이 검증 구간과 겹치는 학습 표본을 지운다
④ 엠바고: 피처 계산 창 때문에 검증 구간 뒤의 학습 표본도 일정 기간 버린다
⑤ 정확도 몇 %p 차이가 손익분기 승률을 넘나들며 결론을 뒤집는다
⑥ CPCV는 여러 경로를 만들어 성과의 분포를 보게 해 준다
주의
본문의 표본 수, 라벨 기간, 정확도, 손익, 수수료는 모두 계산 방법을 설명하기 위한 가정 예시이며 실제 모델이나 시장 데이터의 결과가 아닙니다. 검증을 올바르게 해도 과거 성과는 미래 성과를 보장하지 않습니다. 이 글은 교육 정보이며 특정 종목·전략의 매수·매도 권유나 특정 수익을 보장하는 내용이 아닙니다. 코인 및 선물·레버리지 거래는 원금 손실 위험이 있고, 매매 판단과 그 결과는 본인 책임입니다.
NOONOO TRADING 무료 채팅방에서 실시간 트레이딩을 같이 보세요.
봇에서 시작하기📈 OKX 신규 가입 시 거래 수수료 할인
OKX 수수료 할인 가입 →