파이썬 백테스트 실전 가이드

백테스트란 무엇인가?

퀀트 투자에서 백테스트(Backtest)는 과거 데이터를 기반으로 매매 전략의 수익성을 검증하는 과정입니다. 실제 자금을 투입하기 전에 전략이 유효한지 확인하는 필수 단계로, 모든 체계적 투자자가 거쳐야 할 관문입니다.

파이썬은 풍부한 금융 라이브러리 생태계 덕분에 백테스트 구현에 가장 널리 사용되는 언어입니다. 이 글에서는 파이썬으로 백테스트를 설계하고 실행하는 전체 과정을 실무 관점에서 정리합니다.

백테스트 프레임워크 선택

파이썬에는 다양한 백테스트 프레임워크가 존재합니다. 대표적인 선택지를 비교해 보겠습니다.

프레임워크 특징 적합한 사용자
Backtrader 이벤트 기반, 커뮤니티 활발 중급 이상
Zipline Quantopian 기반, 안정적 미국 주식 중심
vectorbt 벡터 연산 기반, 초고속 대량 전략 스크리닝
pandas 직접 구현 완전한 커스터마이징 학습 목적, 단순 전략

입문자라면 pandas로 직접 구현하면서 백테스트의 원리를 이해한 뒤, Backtrader나 vectorbt로 넘어가는 것을 권장합니다.

pandas로 이동평균 크로스 전략 구현하기

가장 기본적인 퀀트 전략인 이동평균 골든크로스/데드크로스 전략을 pandas로 구현해 보겠습니다.

import pandas as pd
import numpy as np

# 데이터 로드 (yfinance 등으로 수집)
df = pd.read_csv('btc_daily.csv', parse_dates=['date'], index_col='date')

# 이동평균 계산
df['sma_20'] = df['close'].rolling(window=20).mean()
df['sma_60'] = df['close'].rolling(window=60).mean()

# 매매 신호 생성
df['signal'] = 0
df.loc[df['sma_20'] > df['sma_60'], 'signal'] = 1   # 골든크로스 → 매수
df.loc[df['sma_20'] <= df['sma_60'], 'signal'] = -1  # 데드크로스 → 매도

# 포지션 변화 감지
df['position'] = df['signal'].diff()

# 수익률 계산
df['returns'] = df['close'].pct_change()
df['strategy_returns'] = df['signal'].shift(1) * df['returns']
df['cumulative'] = (1 + df['strategy_returns']).cumprod()

이 코드는 20일 이동평균이 60일 이동평균을 상향 돌파하면 매수, 하향 돌파하면 매도하는 단순 전략입니다. shift(1)은 신호 발생 다음 날 실행을 시뮬레이션하여 미래 참조(look-ahead bias)를 방지합니다.

백테스트에서 반드시 점검해야 할 5가지

백테스트 결과가 좋다고 실전에서도 수익이 나는 것은 아닙니다. 다음 항목을 반드시 점검해야 합니다.

1. 과적합(Overfitting) 방지

파라미터를 과거 데이터에 지나치게 맞추면 미래에는 작동하지 않습니다. 인샘플/아웃샘플 분리는 기본이고, Walk-Forward 분석으로 검증하는 것이 이상적입니다.

# Walk-Forward 분할 예시
train_size = 252  # 1년 학습
test_size = 63    # 3개월 검증

for i in range(0, len(df) - train_size - test_size, test_size):
    train = df.iloc[i:i+train_size]
    test = df.iloc[i+train_size:i+train_size+test_size]
    # train으로 파라미터 최적화 → test로 성과 측정

2. 거래 비용 반영

수수료와 슬리피지를 무시하면 백테스트 결과가 왜곡됩니다. 암호화폐 거래소 기준 편도 0.04~0.1%, 슬리피지까지 포함하면 편도 0.1~0.15% 정도를 반영해야 현실적입니다.

commission = 0.001  # 편도 0.1%
df['trade_cost'] = abs(df['position']) * commission * 2  # 왕복
df['net_returns'] = df['strategy_returns'] - df['trade_cost']

3. 생존 편향(Survivorship Bias)

상장폐지된 종목을 제외하고 백테스트하면 결과가 과대평가됩니다. 가능하면 상폐 종목을 포함한 전체 데이터를 사용해야 합니다.

4. 핵심 성과 지표 확인

총 수익률만 보면 안 됩니다. 다음 지표를 함께 확인해야 전략의 품질을 판단할 수 있습니다.

  • 샤프 비율(Sharpe Ratio): 위험 대비 수익. 1.0 이상이면 양호, 2.0 이상이면 우수
  • 최대 낙폭(MDD): 고점 대비 최대 하락폭. 30% 이상이면 실전 운용이 심리적으로 어려움
  • 승률과 손익비: 승률이 낮아도 손익비가 높으면 수익 가능
  • 거래 횟수: 너무 적으면 통계적 유의성이 부족
# 핵심 지표 계산
sharpe = df['net_returns'].mean() / df['net_returns'].std() * np.sqrt(252)
cummax = df['cumulative'].cummax()
mdd = ((df['cumulative'] - cummax) / cummax).min()

print(f"샤프 비율: {sharpe:.2f}")
print(f"최대 낙폭: {mdd:.2%}")
print(f"총 수익률: {df['cumulative'].iloc[-1] - 1:.2%}")

5. 미래 참조(Look-Ahead Bias) 제거

현재 시점에서 알 수 없는 미래 데이터를 신호 생성에 사용하면 결과가 비현실적으로 좋아집니다. 모든 지표와 신호는 반드시 과거 데이터만 참조해야 합니다.

Backtrader로 확장하기

pandas 구현의 한계를 넘어서려면 Backtrader 같은 이벤트 기반 프레임워크가 필요합니다. 포지션 관리, 주문 체결 시뮬레이션, 포트폴리오 레벨 관리 등을 자동으로 처리해 줍니다.

import backtrader as bt

class SmaCross(bt.Strategy):
    params = dict(fast=20, slow=60)

    def __init__(self):
        sma_fast = bt.ind.SMA(period=self.p.fast)
        sma_slow = bt.ind.SMA(period=self.p.slow)
        self.crossover = bt.ind.CrossOver(sma_fast, sma_slow)

    def next(self):
        if self.crossover > 0:
            self.buy()
        elif self.crossover < 0:
            self.sell()

cerebro = bt.Cerebro()
cerebro.addstrategy(SmaCross)
cerebro.broker.setcommission(commission=0.001)
# 데이터 추가 후 실행
cerebro.run()

Backtrader는 파라미터 최적화(optstrategy)와 시각화(cerebro.plot) 기능도 내장하고 있어 전략 개발 사이클을 크게 단축합니다.

백테스트에서 실전으로 넘어가기

백테스트를 통과한 전략을 실전에 적용할 때는 다음 단계를 거치는 것이 안전합니다.

  1. 페이퍼 트레이딩: 실시간 데이터로 가상 매매를 2~4주 실행
  2. 소액 실전: 총 자본의 5~10%로 실제 매매 시작
  3. 점진적 확대: 3개월 이상 양호한 성과 확인 후 비중 확대
  4. 모니터링 체계 구축: 실시간 성과 대시보드와 이상 탐지 알림 설정

백테스트 결과와 실전 성과 사이의 괴리를 줄이는 것이 퀀트 투자의 핵심 과제입니다. 계좌 생존 규칙을 먼저 숙지하고, 감정매매 체크리스트와 병행하면 전략의 실전 적용 성공률을 높일 수 있습니다.

정리

파이썬 백테스트는 퀀트 투자의 출발점입니다. pandas로 원리를 이해하고, Backtrader나 vectorbt로 효율을 높이되, 과적합·거래비용·생존편향 같은 함정을 항상 경계해야 합니다. 백테스트는 전략을 증명하는 도구가 아니라 검증하는 도구임을 기억하세요.

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