본문 바로가기

투자 재테크

백테스트로 전략 검증하기 — 과거 데이터로 수익률 미리 확인하는 법

전략을 만들었으면 바로 실전에 투입하면 안 됩니다. 백테스트(Backtest)로 과거 데이터에서 이 전략이 통했는지 먼저 확인해야 합니다. 오늘은 파이썬으로 간단한 백테스트를 하는 방법을 공유합니다.

백테스트란?

과거 차트 데이터를 가져와서, "만약 이 전략대로 매매했다면 얼마를 벌었을까?"를 시뮬레이션하는 것입니다. 과거에 잘 된 전략이 미래에도 잘 된다는 보장은 없지만, 과거에도 안 되는 전략은 미래에도 안 될 확률이 높습니다.

 

주의할 점

1. 오버피팅 조심 — 과거 데이터에 너무 맞추면 미래에서는 작동하지 않습니다.

2. 수수료 반영바이비트 선물 수수료(메이커 0.02%, 테이커 0.055%)를 반드시 포함해야 합니다.

3. 슬리피지 고려 — 실제 체결가는 주문가와 다를 수 있습니다. 보통 0.05~0.1%를 슬리피지로 잡습니다.

 

간단한 백테스트 코드

import pandas as pd

def simple_backtest(df, initial_balance=1000):
    balance = initial_balance
    position = None
    trades = []
    
    for i in range(1, len(df)):
        prev = df.iloc[i-1]
        curr = df.iloc[i]
        
        # 골든크로스 + 가격 > EMA200 → 롱
        if (prev['ema_21'] <= prev['ema_55'] and 
            curr['ema_21'] > curr['ema_55'] and 
            curr['close'] > curr['ema_200'] and 
            position is None):
            
            entry_price = curr['close']
            atr = curr['atr']
            sl = entry_price - atr * 1.5
            tp = entry_price + atr * 2.0
            position = {'entry': entry_price, 'sl': sl, 'tp': tp, 'type': 'LONG'}
        
        # 포지션 있을 때 손절/익절 체크
        if position and position['type'] == 'LONG':
            if curr['low'] <= position['sl']:
                pnl = position['sl'] - position['entry']
                balance += pnl * (balance * 0.02 / abs(position['entry'] - position['sl']))
                trades.append({'pnl': pnl, 'result': 'SL'})
                position = None
            elif curr['high'] >= position['tp']:
                pnl = position['tp'] - position['entry']
                balance += pnl * (balance * 0.02 / abs(position['entry'] - position['sl']))
                trades.append({'pnl': pnl, 'result': 'TP'})
                position = None
    
    wins = len([t for t in trades if t['result'] == 'TP'])
    total = len(trades)
    win_rate = wins / total * 100 if total > 0 else 0
    
    print(f"총 거래: {total}회")
    print(f"승률: {win_rate:.1f}%")
    print(f"최종 잔고: ${balance:.2f}")
    print(f"수익률: {(balance/initial_balance - 1)*100:.1f}%")
    return trades

 

마무리

백테스트 결과가 좋다고 바로 실전에 투입하면 안 됩니다. 반드시 테스트넷에서 2주 이상 돌려본 후에 소액으로 실전을 시작하세요. 다음 글에서는 테스트넷에서 봇을 실전처럼 돌리는 방법을 다루겠습니다.

 

※ 이 글은 투자 권유가 아닙니다. 암호화폐 투자는 원금 손실 위험이 있으며, 모든 투자 판단과 책임은 투자자 본인에게 있습니다.