퀀트 백테스트 과최적화 방지법

백테스트란 무엇인가?

퀀트 투자에서 백테스트(Backtest)는 과거 데이터를 기반으로 전략의 수익성을 검증하는 과정입니다. 자동매매 시스템을 구축하기 전, 반드시 거쳐야 할 핵심 단계이며 전략의 생존 가능성을 판단하는 유일한 객관적 도구입니다.

하지만 백테스트 결과가 좋다고 해서 실전에서도 좋은 성과를 낸다는 보장은 없습니다. 가장 큰 원인이 바로 과최적화(Overfitting)입니다.

과최적화(Overfitting)가 위험한 이유

과최적화란 과거 데이터에 지나치게 맞춰진 전략을 의미합니다. 백테스트 수익률은 화려하지만, 실전에서는 완전히 다른 결과를 보여줍니다. 마치 시험 답안지를 외워서 만점을 받았지만, 새로운 문제는 전혀 풀지 못하는 것과 같습니다.

과최적화된 전략의 대표적인 특징은 다음과 같습니다:

  • 파라미터가 지나치게 많다 — 이동평균 기간, RSI 임계값, 볼린저 밴드 배수 등을 과도하게 조합
  • 특정 구간에서만 수익이 집중 — 2020년 코로나 폭락장에서만 동작하는 전략
  • 백테스트 vs 실전 괴리가 크다 — 슬리피지, 수수료, 유동성을 고려하지 않은 비현실적 결과

과최적화를 방지하는 5가지 실전 기법

1. 인샘플 / 아웃오브샘플 분리

가장 기본적이면서 효과적인 방법입니다. 전체 데이터를 학습용(In-Sample)과 검증용(Out-of-Sample)으로 나눕니다.

  • 학습용: 전체 데이터의 60~70%로 전략 파라미터를 최적화
  • 검증용: 나머지 30~40%로 전략 성능을 검증

검증용 데이터에서도 안정적인 수익 곡선을 보여야 실전 투입 가치가 있습니다. 학습용에서는 연 40% 수익이지만 검증용에서 -10%라면, 그 전략은 과최적화된 것입니다.

2. 워크포워드 분석(Walk-Forward Analysis)

인샘플/아웃오브샘플의 발전된 형태입니다. 시간 순서대로 데이터를 이동시키면서 반복 검증합니다.

  • 2018~2020년으로 최적화 → 2021년으로 검증
  • 2019~2021년으로 최적화 → 2022년으로 검증
  • 2020~2022년으로 최적화 → 2023년으로 검증

이 방식을 사용하면 시장 변화에 대한 전략의 적응력을 확인할 수 있습니다. 모든 구간에서 일관된 성과를 보이는 전략이 실전에서도 살아남을 확률이 높습니다.

3. 파라미터 민감도 테스트

최적 파라미터를 찾았다면, 그 값을 소폭 변경했을 때도 성과가 유지되는지 확인해야 합니다.

예를 들어 이동평균 20일이 최적이라면:

  • 18일, 19일, 21일, 22일에서도 비슷한 수익률을 보이는가?
  • 특정 값 하나에서만 갑자기 수익이 폭등하는가?

견고한(Robust) 전략은 파라미터를 약간 바꿔도 성과가 크게 변하지 않습니다. 반면 과최적화된 전략은 파라미터 값 하나만 바뀌어도 수익이 급락합니다.

4. 거래 비용과 슬리피지 현실 반영

백테스트에서 가장 흔히 간과되는 부분입니다. 실전에서는 다음 비용이 발생합니다:

  • 수수료: 거래소별 메이커/테이커 수수료 (보통 0.02~0.1%)
  • 슬리피지: 주문 체결 시 예상가와 실제가의 차이 (시장가 주문 시 발생)
  • 스프레드: 매수/매도 호가 차이

이 비용들을 보수적으로 설정하여 백테스트에 반영해야 합니다. 비용을 반영한 뒤에도 수익이 나는 전략만이 실전 가치가 있습니다.

5. 몬테카를로 시뮬레이션

거래 순서를 무작위로 섞어 수천 번 시뮬레이션하는 기법입니다. 이를 통해 최대 낙폭(MDD)의 분포수익률의 신뢰 구간을 파악할 수 있습니다.

백테스트에서 MDD가 15%였더라도, 몬테카를로 분석 결과 95% 신뢰 구간에서 MDD가 30%까지 나올 수 있다면, 자금 관리 전략을 그에 맞게 조정해야 합니다.

실전 체크리스트: 전략 검증 전 확인 사항

항목 확인 기준
파라미터 수 5개 이하로 제한
아웃오브샘플 성과 인샘플 대비 70% 이상 유지
파라미터 민감도 ±20% 변경 시 성과 유지
거래 비용 반영 수수료 + 슬리피지 포함
거래 횟수 통계적 유의성 확보 (최소 100회 이상)
MDD 허용 범위 몬테카를로 95% 신뢰구간 내 수용 가능

Python 백테스트 과최적화 탐지 예시

import numpy as np

def walk_forward_test(data, strategy_fn, train_size=252, test_size=63):
    """워크포워드 분석으로 과최적화 탐지"""
    results = []
    for start in range(0, len(data) - train_size - test_size, test_size):
        train = data[start:start + train_size]
        test = data[start + train_size:start + train_size + test_size]

        # 학습 구간에서 최적 파라미터 탐색
        best_param = strategy_fn.optimize(train)

        # 검증 구간에서 성과 측정
        oos_return = strategy_fn.evaluate(test, best_param)
        results.append(oos_return)

    # 모든 검증 구간의 평균 수익률
    avg_oos = np.mean(results)
    consistency = np.sum([r > 0 for r in results]) / len(results)

    print(f"평균 OOS 수익률: {avg_oos:.2%}")
    print(f"양수 구간 비율: {consistency:.0%}")
    return results

위 코드는 워크포워드 분석의 기본 구조입니다. consistency 값이 60% 이상이면 전략의 견고성이 어느 정도 확보된 것으로 판단할 수 있습니다.

관련 글 더 보기

마무리

퀀트 백테스트에서 가장 큰 적은 과거 데이터에 대한 과신입니다. 화려한 백테스트 수익 곡선에 현혹되지 않고, 인샘플/아웃오브샘플 분리, 워크포워드 분석, 파라미터 민감도 테스트, 거래 비용 현실 반영, 몬테카를로 시뮬레이션 등의 검증 기법을 체계적으로 적용해야 합니다.

좋은 전략은 단순하고, 견고하며, 현실적입니다. 백테스트 수익률 1위 전략보다, 모든 검증을 통과한 중간 성과의 전략이 실전에서 훨씬 오래 살아남습니다.

위로 스크롤
WordPress Appliance - Powered by TurnKey Linux