백테스트란 무엇인가?
백테스트(Backtest)는 과거 시장 데이터를 활용해 특정 매매 전략의 수익성을 검증하는 과정입니다. 퀀트 투자자와 자동매매 시스템 개발자에게 백테스트는 전략을 실전에 투입하기 전 반드시 거쳐야 할 핵심 단계입니다.
하지만 많은 투자자들이 백테스트에서 과최적화(Overfitting)라는 치명적인 함정에 빠집니다. 과거 데이터에 지나치게 맞춘 전략은 실전에서 처참한 성과를 내는 경우가 대부분입니다.
과최적화(Overfitting)란?
과최적화는 전략의 파라미터를 과거 데이터에 지나치게 맞추는 현상입니다. 백테스트 수익률은 화려하지만, 실전에서는 전혀 다른 결과가 나옵니다.
예를 들어, 이동평균선 교차 전략에서 “7일과 23일 조합이 최고 수익”이라는 결론을 얻었다면, 이는 해당 기간의 특수한 시장 패턴에 맞춰진 것일 가능성이 높습니다.
과최적화의 대표적 신호
- 파라미터 민감도가 극도로 높음: 파라미터를 조금만 바꿔도 수익률이 급변합니다.
- 백테스트 수익률이 비현실적: 연 100% 이상의 수익률은 의심해야 합니다.
- 거래 횟수가 적음: 소수의 대박 거래에 의존하는 전략은 위험합니다.
- 특정 기간에만 성과가 집중: 전 구간에서 고르게 수익이 나지 않습니다.
과최적화를 방지하는 5가지 핵심 방법
1. 표본 외 테스트(Out-of-Sample Test)
전체 데이터를 훈련 구간과 검증 구간으로 분리합니다. 일반적으로 70%는 전략 개발용, 30%는 검증용으로 나눕니다. 검증 구간에서도 유사한 성과가 나와야 신뢰할 수 있습니다.
# 파이썬 예시: 데이터 분할
train_data = data[:'2023-06-30'] # 훈련 구간
test_data = data['2023-07-01':] # 검증 구간
# 훈련 구간에서 전략 최적화
best_params = optimize(strategy, train_data)
# 검증 구간에서 성과 확인
result = backtest(strategy, test_data, best_params)
2. 워크포워드 분석(Walk-Forward Analysis)
워크포워드 분석은 표본 외 테스트를 반복적으로 수행하는 방법입니다. 시간을 순차적으로 이동하면서 최적화와 검증을 반복합니다.
예를 들어, 6개월 훈련 → 2개월 검증 → 다음 6개월 훈련 → 다음 2개월 검증… 이런 식으로 진행합니다. 이 방법은 실전과 가장 유사한 조건에서 전략을 검증할 수 있어 가장 신뢰도가 높습니다.
3. 파라미터 개수 최소화
전략에 사용하는 파라미터 수가 많을수록 과최적화 위험이 급격히 증가합니다. 파라미터는 3개 이하로 제한하는 것이 좋습니다.
| 파라미터 수 | 과최적화 위험 | 실전 신뢰도 |
|---|---|---|
| 1~2개 | 낮음 | 높음 |
| 3~5개 | 중간 | 중간 |
| 6개 이상 | 매우 높음 | 낮음 |
4. 다중 시장/기간 테스트
하나의 시장, 하나의 기간에서만 좋은 전략은 과최적화일 가능성이 높습니다. 최소 3개 이상의 서로 다른 시장에서 테스트해야 합니다.
- 비트코인에서 개발한 전략 → 이더리움, 주식시장에서도 검증
- 상승장 데이터로 만든 전략 → 하락장, 횡보장에서도 검증
- 최소 3년 이상의 데이터를 사용하여 다양한 시장 국면을 포함
5. 몬테카를로 시뮬레이션
몬테카를로 시뮬레이션은 거래 순서를 무작위로 섞어서 수천 번 반복 실행하는 방법입니다. 이를 통해 전략의 최대 손실(MDD) 분포와 수익률 분포를 파악할 수 있습니다.
import numpy as np
def monte_carlo(trades, n_simulations=1000):
results = []
for _ in range(n_simulations):
shuffled = np.random.permutation(trades)
equity = np.cumsum(shuffled)
mdd = np.max(np.maximum.accumulate(equity) - equity)
results.append({'final': equity[-1], 'mdd': mdd})
return results
시뮬레이션 결과에서 95% 신뢰구간의 최대 손실을 확인하고, 이를 감당할 수 있는지 판단해야 합니다.
실전 체크리스트: 백테스트 검증 5단계
- 슬리피지와 수수료 반영: 실제 거래 비용을 반드시 포함시킵니다. 스캘핑 전략이라면 이것만으로 수익이 사라질 수 있습니다.
- 표본 외 테스트 통과 여부: 검증 구간에서도 훈련 구간 성과의 70% 이상을 유지해야 합니다.
- 파라미터 안정성 확인: 파라미터를 ±20% 변경해도 성과가 크게 달라지지 않아야 합니다.
- 충분한 거래 횟수: 최소 100건 이상의 거래가 있어야 통계적으로 유의미합니다.
- 다중 시장 검증: 최소 2개 이상의 다른 시장에서도 양의 기대값을 보여야 합니다.
자주 하는 실수와 해결법
미래 데이터 참조(Look-Ahead Bias)
백테스트 시점에서 아직 알 수 없는 미래 데이터를 사용하는 오류입니다. 종가 기반 신호로 같은 날 종가에 진입하는 것이 대표적입니다. 반드시 신호 발생 다음 봉에서 진입하도록 설계해야 합니다.
생존자 편향(Survivorship Bias)
상장폐지된 종목을 제외한 데이터로 백테스트하면 결과가 왜곡됩니다. 상폐 종목을 포함한 데이터를 사용해야 정확한 결과를 얻을 수 있습니다.
결론: 좋은 백테스트의 기준
좋은 백테스트란 화려한 수익률을 보여주는 것이 아닙니다. 실전에서도 재현 가능한 결과를 보여주는 것입니다. 과최적화를 방지하려면 표본 외 테스트, 파라미터 최소화, 다중 시장 검증을 반드시 거쳐야 합니다.
자동매매 시스템을 운영한다면, 백테스트 결과를 맹신하지 말고 소액 실전 테스트를 병행하는 것이 가장 안전한 접근법입니다.
관련 글도 함께 읽어보세요: