TUTORIAL

비트코인 자동매매 백테스팅 완벽 가이드

파이썬으로 비트코인 자동매매 전략을 백테스팅하는 방법. ccxt, pandas를 활용한 데이터 수집부터 전략 구현, 성과 분석까지 완벽 가이드.

럿지 AI 팀
2025-01-10
16
백테스팅 워크플로우
1

데이터 수집

2

전략 구현

3

시뮬레이션

4

분석

1. 환경 설정 & 데이터 수집

ccxt와 pandas를 활용하여 거래소에서 OHLCV 데이터를 수집합니다.

import ccxt
import pandas as pd
from datetime import datetime

# 바이낸스 거래소 연결
exchange = ccxt.binance()

# BTC/USDT 1시간봉 데이터 수집
ohlcv = exchange.fetch_ohlcv(
    'BTC/USDT',
    timeframe='1h',
    limit=1000
)

# DataFrame 변환
df = pd.DataFrame(
    ohlcv,
    columns=['timestamp', 'open', 'high', 'low', 'close', 'volume']
)
df['timestamp'] = pd.to_datetime(df['timestamp'], unit='ms')

2. 이동평균 크로스 전략

가장 기본적인 트레이딩 전략인 이동평균선 교차 전략을 구현합니다.

# 이동평균 계산
df['SMA_20'] = df['close'].rolling(window=20).mean()
df['SMA_50'] = df['close'].rolling(window=50).mean()

# 매매 신호 생성
df['signal'] = 0
df.loc[df['SMA_20'] > df['SMA_50'], 'signal'] = 1  # 매수
df.loc[df['SMA_20'] < df['SMA_50'], 'signal'] = -1  # 매도

# 포지션 변경점 찾기
df['position'] = df['signal'].diff()

# 백테스트 실행
initial_capital = 10000
df['returns'] = df['close'].pct_change()
df['strategy_returns'] = df['signal'].shift(1) * df['returns']
df['cumulative_returns'] = (1 + df['strategy_returns']).cumprod()

핵심 성과 지표

총 수익률

(최종 자산 - 초기 자산) / 초기 자산 × 100

샤프 비율

(평균 수익률 - 무위험 수익률) / 표준편차

최대 낙폭 (MDD)

(고점 - 저점) / 고점 × 100

승률

이익 거래 수 / 전체 거래 수 × 100

3. 성과 분석 코드

def calculate_metrics(df):
    # 총 수익률
    total_return = (df['cumulative_returns'].iloc[-1] - 1) * 100

    # 샤프 비율 (연간화)
    sharpe = (df['strategy_returns'].mean() * 252) / \
             (df['strategy_returns'].std() * np.sqrt(252))

    # 최대 낙폭 (MDD)
    rolling_max = df['cumulative_returns'].cummax()
    drawdown = (df['cumulative_returns'] - rolling_max) / rolling_max
    mdd = drawdown.min() * 100

    # 승률
    wins = (df['strategy_returns'] > 0).sum()
    total_trades = (df['strategy_returns'] != 0).sum()
    win_rate = wins / total_trades * 100

    return {
        'Total Return': f'{total_return:.2f}%',
        'Sharpe Ratio': f'{sharpe:.2f}',
        'Max Drawdown': f'{mdd:.2f}%',
        'Win Rate': f'{win_rate:.2f}%'
    }

백테스팅 주의사항

!

과최적화 방지

훈련/테스트 데이터 분리 필수

!

슬리피지 반영

실제 체결가격과 신호가격 차이

!

수수료 계산

거래 수수료 반드시 포함

!

생존 편향

상장폐지 코인 데이터 주의

결과 지표 예시

%

총 수익률

샤프 비율

-%

최대 낙폭

%

승률

관련 태그

#Bitcoin
#Backtesting
#Python
#Trading
#Crypto