카테고리 없음

코인 자동매매 백테스트 하는 법 (파이썬으로 과거 검증)

ddugi03 2026. 5. 11. 23:35
반응형

자동매매 봇을 만들었는데 바로 실거래에 돌리기 겁나시죠? 그럴 때 필요한 게 바로 백테스트입니다. 오늘은 파이썬으로 코인 자동매매 백테스트 하는 법을 처음부터 끝까지 정리해드릴게요.


백테스트란?

백테스트(Backtest)는 과거 데이터로 전략을 시뮬레이션하는 것입니다.

쉽게 말하면 이렇습니다.

"내 전략을 1년 전 데이터에 적용했다면 얼마나 벌었을까?" 를 미리 계산해보는 것

실제 돈을 넣기 전에 전략이 효과적인지 확인할 수 있어서 자동매매에서 가장 중요한 단계 중 하나입니다.


백테스트가 중요한 이유

많은 분들이 전략을 만들자마자 바로 실거래에 적용합니다. 그러다 손실이 나면 그때야 "전략이 잘못됐구나"를 깨닫게 되죠.

백테스트를 하면 이런 것들을 미리 알 수 있어요.

  • 해당 전략의 과거 수익률
  • 최대 손실폭 (MDD)
  • 승률 (몇 번 중 몇 번 수익)
  • 수수료 포함 순수익

실거래 전 반드시 백테스트를 먼저 해야 하는 이유입니다.


준비물

 
 
bash
pip install pyupbit pandas

추가로 시각화를 원하면 matplotlib도 설치하세요.

 
 
bash
pip install matplotlib

1단계 — 과거 데이터 가져오기

pyupbit로 업비트 과거 데이터를 쉽게 가져올 수 있어요.

 
 
python
import pyupbit
import pandas as pd

# 비트코인 일봉 데이터 200개 가져오기
df = pyupbit.get_ohlcv("KRW-BTC", interval="day", count=200)
print(df.head())

출력 결과는 이런 형태입니다.

 
 
            open      high       low     close    volume
2024-01-01  55000000  56000000  54000000  55500000  1234.5
2024-01-02  55500000  57000000  55000000  56800000  2345.6
...
  • open: 시가
  • high: 고가
  • low: 저가
  • close: 종가
  • volume: 거래량

2단계 — RSI 계산 함수

 
 
python
def calculate_rsi(df, period=14):
    delta = df['close'].diff()
    gain = delta.where(delta > 0, 0).rolling(period).mean()
    loss = -delta.where(delta < 0, 0).rolling(period).mean()
    rs = gain / loss
    rsi = 100 - (100 / (1 + rs))
    return rsi

df['rsi'] = calculate_rsi(df)
print(df[['close', 'rsi']].tail(10))

3단계 — 백테스트 핵심 코드

 
 
python
# 백테스트 설정
initial_capital = 1000000  # 시드머니 100만원
capital = initial_capital
btc_amount = 0
buy_price = 0
commission = 0.0005  # 수수료 0.05%

# 거래 기록
trades = []

for i in range(len(df)):
    rsi = df['rsi'].iloc[i]
    price = df['close'].iloc[i]

    # 매수 조건: RSI 30 이하, 현금 보유 중
    if rsi < 30 and capital > 0:
        btc_amount = (capital * (1 - commission)) / price
        buy_price = price
        capital = 0
        trades.append({
            'date': df.index[i],
            'type': '매수',
            'price': price,
            'rsi': rsi
        })

    # 매도 조건: RSI 70 이상, 코인 보유 중
    elif rsi > 70 and btc_amount > 0:
        capital = btc_amount * price * (1 - commission)
        profit_rate = (price - buy_price) / buy_price * 100
        trades.append({
            'date': df.index[i],
            'type': '매도',
            'price': price,
            'rsi': rsi,
            '수익률': f"{profit_rate:.2f}%"
        })
        btc_amount = 0

# 마지막에 코인 보유 중이면 현재가로 평가
if btc_amount > 0:
    final_price = df['close'].iloc[-1]
    capital = btc_amount * final_price * (1 - commission)

# 결과 출력
total_return = (capital - initial_capital) / initial_capital * 100
print(f"\n=== 백테스트 결과 ===")
print(f"초기 자본: {initial_capital:,}원")
print(f"최종 자본: {capital:,.0f}원")
print(f"총 수익률: {total_return:.2f}%")
print(f"총 거래 횟수: {len(trades)}회")

4단계 — 결과 분석

백테스트 결과에서 꼭 확인해야 할 지표들입니다.

① 총 수익률

 
 
python
total_return = (capital - initial_capital) / initial_capital * 100
print(f"총 수익률: {total_return:.2f}%")

② 최대 낙폭 (MDD) 전략이 가장 많이 손실났을 때의 폭입니다. MDD가 크면 심리적으로 버티기 어려워요.

 
 
python
portfolio = []
temp_capital = initial_capital

for trade in trades:
    portfolio.append(temp_capital)

portfolio_series = pd.Series(portfolio)
mdd = (portfolio_series / portfolio_series.cummax() - 1).min() * 100
print(f"최대 낙폭 (MDD): {mdd:.2f}%")

③ 승률

 
 
python
sell_trades = [t for t in trades if t['type'] == '매도']
win_trades = [t for t in sell_trades if float(t['수익률'].replace('%','')) > 0]
win_rate = len(win_trades) / len(sell_trades) * 100 if sell_trades else 0
print(f"승률: {win_rate:.1f}%")

백테스트 결과 해석 방법

지표좋은 기준주의 기준
총 수익률 연 20% 이상 연 10% 미만
MDD -20% 이내 -30% 초과
승률 50% 이상 40% 미만
거래 횟수 월 5~20회 월 50회 초과 (수수료 폭탄)

백테스트의 한계 — 꼭 알아야 할 것

백테스트가 좋다고 실거래도 좋은 건 아닙니다.

1. 과거가 미래를 보장하지 않는다 2021년 불장에서 잘 통한 전략이 2024년엔 안 통할 수 있어요.

2. 슬리피지가 없다 실거래에서는 원하는 가격에 정확히 체결되지 않습니다. 백테스트보다 실거래 수익률이 낮은 주된 이유예요.

3. 과최적화 주의 백테스트에만 맞게 파라미터를 조정하면 실거래에서 실패할 확률이 높아요. 이를 오버피팅이라고 합니다.


정리

 
 
백테스트 순서 요약

1. 과거 데이터 수집 (pyupbit)
2. 전략 지표 계산 (RSI 등)
3. 매수·매도 시뮬레이션
4. 수익률·MDD·승률 확인
5. 결과가 좋으면 소액 실거래 테스트
6. 실거래 결과와 비교 후 전략 개선

백테스트는 완벽한 도구가 아니지만, 실거래 전 최소한의 검증 과정입니다. "감"이 아닌 데이터로 전략을 검증하는 습관이 자동매매 성공의 핵심이에요.

반응형