Purged 교차검증과 엠바고: 트레이딩 모델의 레이블 누출 방지
겹치는 결과 레이블을 제거하는 purging, 엠바고와 시간순 간격의 차이, 워크포워드·TimeSeriesSplit·CPCV가 각각 어떤 검증 질문에 맞는지 알아봅니다.
이 글에서 다루는 내용무작위 폴드는 금융 레이블 간 의존성을 가릴 수 있습니다
짧은 요약
Purged 교차검증은 테스트 폴드의 결과 구간과 겹치는 레이블을 가진 학습 관측치를 제거합니다. 엠바고는 테스트 구간 뒤의 관측치도 학습에 포함할 수 있는 분할에서, 이후 관측치 일부를 별도로 제외하는 완충 구간입니다. 어느 쪽도 미래 정보를 사용해 만든 피처, 반복적인 전략 선택, 비현실적인 체결 가정을 고쳐주지는 않습니다. 모델을 특정 시점에 배포했다면 어떻게 됐을지를 묻는다면 시간순 워크포워드 검증이 더 직접적인 질문에 답합니다.
무작위 폴드는 금융 레이블 간 의존성을 가릴 수 있습니다
교차검증 점수는 특정 학습에서 제외한 관측치에 대해 모델링 절차가 어떻게 동작하는지 추정합니다. 일반적인 K-fold는 관측치를 무작위로 여러 폴드에 나누고, 일부 폴드로 학습해 나머지를 평가합니다. 표본 추출과 의존성에 관한 가정이 맞으면 쓸 수 있습니다. 하지만 금융 데이터에서는 이 가정을 더 면밀히 봐야 합니다. 연속 수익률이 서로 의존할 수 있고, 한 시점의 미래 레이블이 다른 레이블과 같은 가격 경로를 공유할 수도 있습니다.
매일 매매 결정을 내리면서 향후 5거래일 수익률을 예측한다고 가정해 보겠습니다. 월요일의 레이블과 화요일의 레이블은 상당 부분 같은 미래 가격 경로를 담습니다. 한 행이 학습 폴드에, 다른 행이 테스트 폴드에 들어가면 모델은 이미 본 것과 밀접하게 연관된 결과로 평가될 수 있습니다. 그러면 검증 점수가 실제로 보지 못한 결과에 대한 예측력을 과장할 수 있습니다.
금융 시계열에서 무작위 분할은 항상 틀렸다는 뜻은 아닙니다. 핵심은 분할 방식이 검증하려는 질문에 맞는지, 그리고 학습 표본과 테스트 표본의 목표 구간이 겹치거나 피처가 잘못 구성되어 정보가 공유되는지를 확인하는 것입니다. Advances in Financial Machine Learning 7장은 겹치는 금융 레이블에서 일반 K-fold가 실패할 수 있는 이유와 purged fold를 설명합니다.
피처와 레이블이 알려지는 시점을 정합니다
각 표본에 대해 의사결정 시점 t, 그때 이용할 수 있었던 정보, 피처 계산 구간, 목표값을 계산하는 결과 구간을 기록합니다. 종가 시점에 이용 가능한 가격으로 매일 향후 5거래일 수익률을 예측한다면, 결과 구간은 (t, t+5]로 쓸 수 있습니다. 이 레이블은 구간이 끝나야 확정됩니다.
이벤트 기반 레이블은 종료 시점이 달라질 수 있습니다. 예를 들어 장벽 조건에 따른 레이블은 이벤트 조건에 도달하거나 시간 제한이 끝날 때 결정됩니다. 모든 레이블이 같은 행 수만큼 지속된다고 가정하지 말고 각 표본의 실제 시작·종료 시각을 저장합니다. 종가, 공시, 체결 정보가 예측보다 먼저 또는 나중에 이용 가능한지 타임스탬프 기준도 분명히 해야 합니다.
인접한 의사결정 시점의 피처가 같은 과거 관측값을 사용하는 건 정당할 수 있습니다. 공유되는 후행 이력이 곧바로 목표 누출은 아닙니다. 실시간 모델도 연속된 날에 같은 과거 가격을 사용할 수 있습니다. 피처가 예측 시점에 알 수 없던 정보를 담거나 검증 설계가 목표 정보를 테스트 경계 너머로 공유할 때 누출이 생깁니다. 모든 피처는 실제 당시 정보 집합으로 계산해야 합니다.
Purging은 테스트 레이블과 겹치는 학습 표본을 제거합니다
테스트 폴드를 정한 다음 테스트 레이블 구간과 각 학습 후보의 결과 구간을 비교합니다. 정해 둔 경계 규약에 따라 테스트 결과와 겹치는 학습 표본은 purging으로 제거합니다. 테스트 구간은 표본별 구간의 합집합일 수 있으므로, 테스트 행의 위치만 보지 말고 실제 시간 구간을 비교해야 합니다.
목표 기간이 모두 고정되어 있고 관측 간격도 같으면 행 수 기준의 간격으로 필요한 제외 구간을 근사할 수 있습니다. 하지만 거래일 달력이 불규칙하거나, 봉이 빠져 있거나, 이벤트 기간이 달라지거나, 레이블이 일찍 확정되는 경우에는 이 방법이 실패할 수 있습니다. 이벤트 레이블은 기록된 실제 확정 시점을 비교합니다. 고정 행 수는 어떤 이벤트에는 너무 짧고 다른 이벤트에는 과도하게 길 수 있습니다.
Purging은 “이번 테스트에서 사용한 결과와 겹치는 학습 목표는 무엇인가?”에 답합니다. 모든 학습 행이 테스트보다 앞선 시점이어야 한다는 뜻은 아닙니다. Purged K-fold 분할도 테스트 폴드 뒤의 날짜를 학습에 포함할 수 있으며, 피처 누출·데이터 수정·모델 선택 편향은 남습니다. 금융 교차검증을 다룬 López de Prado의 장에서 이 맥락의 purged K-fold 설계를 확인할 수 있습니다.
엠바고는 테스트 구간 뒤에 두는 별도의 완충 구간입니다
분할 방식상 테스트 블록 이후의 표본도 학습에 들어갈 수 있다면, 엠바고는 테스트 구간 직후의 관측치 일부를 학습에서 제외합니다. 이벤트, 레이블, 피처의 경계 처리로 생길 수 있는 잔여 의존성을 줄이는 데 도움이 될 수 있습니다. 실제 레이블 구간을 확인하는 절차에 더해 적용해야 하며, 그 확인을 대신하지 않습니다.
모든 경우에 통하는 고정 비율이나 거래일 수는 없습니다. 관측 빈도, 레이블 기간, 피처 구성, 해당 모델과 관련된 의존성을 고려해 폭을 정하고 이유를 기록합니다. 일봉 사례에서 이틀 엠바고를 가정하더라도 모든 시장과 레이블에 적용할 권고안은 아닙니다.
엠바고를 모든 시간순 간격과 같은 말로 쓰면 안 됩니다. 과거만으로 학습하는 순방향 분할은 테스트 블록 뒤에 둘 학습 표본이 없습니다. 그래도 학습 레이블이 테스트 결과 구간까지 이어지지 않도록 사전 테스트 간격이 필요할 수 있습니다. 두 방법은 관련된 보호 장치지만 테스트 구간의 서로 다른 쪽에 있고, 구현 질문도 다릅니다.
5거래일 레이블로 제외할 표본을 확인합니다
매 거래일 결정을 내리고 각 목표가 (t, t+5]를 다룬다고 가정합니다. 테스트 폴드는 11일부터 15일까지의 의사결정 날짜를 포함합니다. 테스트 레이블은 합쳐서 20일까지의 결과 가격을 사용합니다. 학습 후보 레이블 (7,12]은 11일 이후부터 12일까지 테스트 구간과 겹치므로 제거합니다. (16,21]도 20일까지 테스트 결과와 겹치므로 제거합니다.
학습 후보 레이블 (21,26]은 이 경계 가정에서는 (11,20]과 겹치지 않습니다. 테스트 뒤 학습 행을 허용하는 경우, 선택한 피처 구성이나 의존성 분석에 따라 연구자가 테스트 뒤 첫 두 의사결정을 별도 엠바고로 제외할 수 있습니다. 이것은 설명을 위한 가정일 뿐입니다. 연구에서 근거를 제시해야 하며, 레이블이 겹치지 않는다는 사실만으로 엠바고가 필요하다거나 불필요하다고 단정할 수는 없습니다.
그림은 이 두 작업을 따로 보여줍니다. 테스트 레이블과 겹치는 학습 결과는 제거하고, 테스트 뒤의 작은 완충 구간은 별도 규칙으로 표시합니다. 이 개념도는 보편적인 행 수 규칙이 아닙니다. 실제 연구에서는 거래일 경계 포함 규칙을 일관되게 적용하고 남겨 둔 각 표본을 테스트 구간과 비교해야 합니다.

검증 방식마다 답하는 질문이 다릅니다
| 방식 | 작동 방식 | 주요 한계 |
|---|---|---|
| 무작위 K-fold | 전체 표본에서 뽑은 폴드로 평가 | 과거와 미래가 섞이거나 겹치는 레이블이 폴드 경계를 넘을 수 있음 |
| 워크포워드 또는 이동 원점 | 과거로 학습하고 이후 블록을 테스트한 뒤 앞으로 이동 | 학습에 쓰는 자료가 적고 윈도 선택에 민감할 수 있음 |
| TimeSeriesSplit(gap=...) | 시간순으로 학습 구간을 늘리고 각 테스트 앞에서 고정 행 수를 제외 | gap은 행 수이며 가변 이벤트 레이블의 종료 시각을 살피지 않음 |
| Purged K-fold | 테스트 레이블과 결과 구간이 겹치는 학습 표본을 제거 | 테스트 폴드보다 뒤에 기록된 표본을 학습에 쓸 수 있음 |
| Combinatorial purged CV (CPCV) | 테스트 그룹 조합을 여러 개 만들고 purging된 테스트 경로를 구성 | 경로 수를 늘려도 다른 누출이 고쳐지거나 실제 배포 이력이 재현되지는 않음 |
공식 scikit-learn TimeSeriesSplit 문서는 시간순 데이터 분할을 설명합니다. 비교 가능한 테스트 기간을 얻으려면 표본 간격이 같아야 하며 gap은 각 테스트 세트 앞에서 학습 세트 끝부분으로부터 제외할 표본 수라고 정의합니다. 행 기반 구조와 데이터가 맞을 때 편리하게 쓸 수 있습니다. 불규칙한 이벤트 레이블에는 별도의 구간 인식 규칙이 필요합니다.
연구 주장의 형태에 맞춰 분할을 고릅니다
“각 과거 시점에 이 절차가 무엇을 알고 어떻게 동작했을까?”가 질문이라면 확장형 또는 이동형 워크포워드 설계를 사용합니다. 각 테스트 단계에서 그 시점 이전에 존재했을 정보만 쓰고 학습 기간, 재학습 일정, 레이블 지연도 현실에 맞춥니다. 실제 배포 경로를 더 직접적으로 흉내 내지만, 과거 경로 한 번은 가능한 시장 국면 중 하나일 뿐입니다.
의존성을 고려한 폴드에서 모델 구별력을 묻는다면 Purged K-fold가 겹치는 결과를 제거하면서 데이터를 효율적으로 쓸 수 있습니다. 다만 학습에 더 뒤의 날짜가 포함될 수 있으므로, 점수를 실시간 과거 배포의 재현이라고 부르면 안 됩니다. López de Prado의 교차검증 백테스트 12장은 워크포워드와 조합형 purged 교차검증(CPCV)을 다룹니다. CPCV는 그룹 데이터에서 여러 학습·테스트 조합과 경로를 만들지만, 경로가 많다고 독립적인 시장 이력이 많아지는 건 아닙니다.
관측 간격이 일정하고 목표 기간이 고정되어 있다면 TimeSeriesSplit(gap=...)을 명료한 시간순 기준선으로 쓸 수 있습니다. 이벤트 기간이 다르면 각 이벤트의 실제 시작·확정 시각으로 분할을 만듭니다. 각기 다른 질문에 답한다면 검증 설계를 둘 이상 제시할 수 있지만, 서로 바꿔 쓸 수 있는 점수처럼 합치면 안 됩니다.
Purging만으로 연구 파이프라인의 누출을 고칠 수는 없습니다
폴드에서 purging을 완벽히 해도 피처 계산에 미래 종가가 들어갔거나, 상장폐지 종목이 과거 유니버스에서 사라졌거나, 수정된 경제 지표를 당시부터 알 수 있었던 것처럼 취급하면 검증은 실패합니다. 전체 데이터에서 정규화·대치·피처 선택·임곗값 선택을 하는 것도 폴드 사이로 정보를 누출시킵니다. 학습 가능한 전처리 단계는 각 폴드의 학습 데이터에서만 맞추고, 그다음 보류 데이터에 적용합니다.
지표, 유니버스, 예측 기간, 하이퍼파라미터, 청산 규칙을 반복해서 시험하면 레이블을 purging했더라도 우연한 백테스트를 고를 수 있습니다. 백테스트 과최적화 확률에 관한 Bailey 등의 논문은 많은 시험 중 선택하는 문제가 별개로 있음을 설명합니다. 모델 선택에는 중첩된 시간순 검증을 사용하고, 연구 절차를 확정할 때까지 마지막 시간순 홀드아웃을 열지 않습니다.
마지막으로 예측 점수는 매매 성과가 아닙니다. 수수료, 스프레드, 시장 충격, 회전율, 수용 규모, 해당하는 경우 대차 비용이나 펀딩비, 보수적인 체결 가정을 반영합니다. 가장 좋은 폴드나 평균 하나만 제시하지 말고 폴드별 성과와 불확실성을 봅니다. 관련 연구 위험은 금융 모델 과최적화, 다중검정과 거짓발견율, 샤프 비율의 자기상관 글에서 이어집니다.
다른 연구자가 재현할 수 있게 분할 규칙을 기록합니다
점수를 계산하기 전에 표본의 의사결정 시각, 피처 이용 가능 규칙, 목표 구간 정의, 가변 레이블이 확정되는 방식을 기록합니다. 테스트 블록과 학습 날짜, 이후 관측치의 학습 포함 여부, 겹침 경계 규칙, 엠바고의 근거와 길이를 설명합니다. 폴드와 테스트 경로의 수, 선택 절차, 최종 홀드아웃을 공개하는 시점도 씁니다.
데이터 버전, 자산 유니버스, 기업행위와 상장폐지 반영, 전처리 경계, 체결 비용, 재학습 일정을 결과와 함께 보관합니다. 집계값 옆에 폴드별 점수, 분산, 회전율, 실패한 구간도 보고합니다. 검증 점수는 명시된 데이터와 절차에 관한 근거이지 실전 시장에서 전략이 통한다는 보장은 아닙니다.
자주 묻는 질문
Q1금융 데이터에서 무작위 K-fold는 항상 잘못인가요?
아닙니다. 표본에 관한 가정과 연구 질문이 타당하면 사용할 수 있습니다. 다만 점수를 해석하기 전에 겹치는 미래 레이블, 시간 의존성, 미래 관측치가 학습에 들어가는지를 확인해야 합니다.
Q2엠바고는 거래일 몇 개로 설정하면 되나요?
모두에게 맞는 고정값은 없습니다. 표본 간격, 레이블 기간, 피처 구성, 분할과 관련된 의존성을 바탕으로 정하고 이유를 기록합니다. 별도 엠바고를 쓰더라도 기간이 다른 이벤트 레이블의 purging에는 실제 타임스탬프를 사용합니다.
Q3Purged 교차검증을 하면 전략이 실전에서 통한다는 뜻인가요?
아닙니다. 학습 결과와 테스트 결과 사이의 겹침이라는 한 가지 문제를 다룰 뿐입니다. 당시의 데이터 이용 가능성, 반복적인 모델 선택, 시장 변화, 체결 비용, 운영상 제약은 여전히 실전 결과에 영향을 줍니다.
출처와 더 읽을 자료
내용 정정 제보
이 아티클 링크를 담은 이메일 초안을 준비합니다. 직접 보내야 Mark에 제보가 접수됩니다
QUICK CHECK
글을 다 읽었다면, 3문항으로 확인해보세요
Question 01
학습 표본의 미래 수익률 구간이 테스트 표본의 결과 구간과 겹칩니다. 직접 적용할 purging 규칙은 무엇인가요?
정답을 고르면 바로 설명을 볼 수 있어요