α Alphaware
QUANT

백테스트 과적합 방지: Walk-forward vs Purged K-Fold 비교

과거엔 통했던 전략이 실전에서 박살나는 이유의 대부분은 과적합입니다. Walk-forward와 Purged K-Fold를 직접 써본 경험을 바탕으로 두 방법의 차이와 실무 선택 기준을 정리합니다.

백테스트 과적합 방지: Walk-forward vs Purged K-Fold 비교

과적합은 어떻게 생기나

백테스트 결과가 너무 좋으면 의심부터 해야 합니다. 샤프 2.5에 MDD 8%? 실전에서 그대로 나오는 경우는 거의 없습니다. 전략이 데이터의 패턴을 학습한 게 아니라 그 기간의 노이즈를 암기했기 때문입니다.

과적합이 특히 심해지는 상황은 세 가지입니다. 파라미터가 많을수록, 검증 기간이 짧을수록, 최적화 시도를 많이 할수록입니다. “데이터 마이닝 편향”이라고도 부르는데, 같은 데이터로 수백 가지 파라미터 조합을 돌리다 보면 우연히 잘 맞는 조합이 나오게 되어 있습니다.

이를 방지하는 대표 방법 두 가지가 Walk-forward 분석과 Purged K-Fold 교차 검증입니다.


Walk-forward 분석

개념은 단순합니다. 시간 순서를 지키면서 학습과 검증을 반복하는 것입니다. 처음 N개월로 전략을 최적화하고, 그다음 M개월로 실적을 봅니다. 그리고 전체 기간을 M개월씩 밀면서 이 과정을 반복합니다.

results = []
for i in range(train_periods):
    train = data[i : i + train_size]
    test  = data[i + train_size : i + train_size + test_size]

    model.fit(train)
    preds = model.predict(test)
    results.append(evaluate(preds))

가장 큰 장점은 현실에 가깝다는 것입니다. 실제 트레이딩도 결국 과거로 학습하고 미래로 검증하는 구조이기 때문입니다. 미래 데이터가 학습에 끼어들 여지가 없습니다.

단점은 데이터를 많이 소모한다는 것입니다. 학습 기간과 검증 기간이 겹치지 않으니 전체 데이터 중 상당 부분이 한 번 검증에만 쓰입니다. 데이터가 3~5년밖에 안 된다면 검증 샘플이 너무 작아져서 결과의 신뢰도가 떨어질 수 있습니다.


Purged K-Fold 교차 검증

K-Fold의 금융 시계열 버전입니다. 일반 K-Fold를 금융 데이터에 바로 쓰면 치명적인 문제가 생깁니다. 예를 들어 fold 3을 테스트할 때 fold 4, 5의 데이터로 학습하게 되는데, 실제로는 fold 3 이후의 정보를 미리 아는 셈이 됩니다.

Purged K-Fold는 이 문제를 두 가지로 해결합니다.

Purging: 학습 세트에서 테스트 구간과 인접한 데이터를 제거합니다. 두 구간 사이에 완충 지대를 만드는 것입니다.

Embargo: 테스트 구간 직후의 데이터도 학습에서 빼냅니다. 정보가 뒤로 새는 것도 막기 위해서입니다.

kf = KFold(n_splits=5)
for train_idx, test_idx in kf.split(X):
    # 테스트 전후 gap 기간 제거
    purged_train_idx = purge(train_idx, test_idx, gap=5)

    X_train, X_test = X[purged_train_idx], X[test_idx]
    y_train, y_test = y[purged_train_idx], y[test_idx]

    model.fit(X_train, y_train)
    score = model.score(X_test, y_test)

장점은 데이터 활용도가 높다는 것입니다. 같은 데이터를 여러 fold에서 검증에 쓰기 때문에 통계적 검증력이 강합니다. 하이퍼파라미터 튜닝을 많이 해야 하는 ML 전략에 특히 유리합니다.


어느 걸 써야 하나

기준Walk-forwardPurged K-Fold
데이터 활용 효율낮음높음
실제 트레이딩 환경 유사성높음중간
구현 복잡도낮음높음
파라미터 튜닝 적합성낮음높음

Walk-forward가 나은 경우: 데이터가 충분하고(10년 이상), 시간에 따른 전략 안정성을 확인하고 싶을 때. 전략의 시간적 일관성이 핵심인 추세 추종 전략에 자주 씁니다.

Purged K-Fold가 나은 경우: 데이터가 짧거나 ML 모델의 파라미터를 많이 탐색해야 할 때. 학습 데이터 자체가 부족해서 Walk-forward로 분할하면 검증 샘플이 너무 얇아지는 상황에서 대안이 됩니다.

실무에서는 두 방법을 함께 쓰는 게 낫습니다. Purged K-Fold로 파라미터를 좁히고, Walk-forward로 최종 검증하는 순서입니다. 두 결과가 비슷하게 나온다면 그 전략은 과적합 위험이 낮다고 볼 수 있습니다.


과적합 의심 시 체크할 것들

백테스트 결과가 너무 좋을 때 실제로 확인하는 것들입니다.

아웃오브샘플 성과가 인샘플과 크게 차이 나지 않는지 봅니다. 인샘플에서 샤프 3이었는데 OOS에서 0.5라면 과적합입니다.

파라미터를 조금만 바꿔도 결과가 크게 달라진다면 그 전략은 불안정합니다. 파라미터 감도 분석(sensitivity analysis)을 꼭 해보세요.

룩어헤드 바이어스도 흔한 함정입니다. 당일 종가로 진입 신호를 만들고 같은 종가에 체결한다고 가정하는 실수를 생각보다 많이 합니다. 시간 인덱스를 아주 꼼꼼히 확인해야 합니다.

거래 비용과 슬리피지를 빼면 얼마나 남는지도 중요합니다. 고빈도 전략은 수수료만으로 수익이 사라지는 경우가 많습니다.


마지막으로

“과거에도, 현재에도 작동하는 전략”이 진짜입니다. 검증 방법론을 엄격하게 가져갈수록 실전에서 배신당할 가능성이 줄어듭니다. Walk-forward든 Purged K-Fold든, 핵심은 미래 정보가 과거 학습에 끼어들지 않도록 만드는 것입니다.

#backtest #overfitting #walk-forward #cross-validation #quant

Newsletter

주간 퀀트·마켓 인사이트 구독

시장 분석, 퀀트 전략 아이디어, AI·데이터 도구 인사이트를 이메일로 받아보세요.

구독하기 →
같은 카테고리 더 보기 QUANT →