백테스트 기능 구현과 전략 검증 시스템 설계 – 코인 자동 거래 앱 개발기 (11)

2025. 7. 27. 05:20프로젝트 (Project)/바이낸스 코인 자동거래

반응형

11. 백테스트 기능 구현과 전략 검증 시스템 설계 – 코인 자동 거래 앱 개발기 (11)

자동매매 시스템이 실전에서 안정적으로 작동하기 위해선, 반드시 전략의 과거 성과를 검증해야 합니다. 이번 편에서는 Python 기반으로 백테스트 시스템을 직접 구성해보고, MACD + RSI 전략의 과거 성과를 실제 데이터에 적용하여 평가합니다.


11-1. 백테스트란?

백테스트(Backtest)는 과거 시세 데이터를 바탕으로 전략을 시뮬레이션하여 해당 전략이 수익성이 있었는지, 손실은 어느 정도였는지 등을 분석하는 기법입니다.

  • 진입/청산 시점을 계산
  • 수익률, 손실률, 승률, 최대 낙폭 등 지표 추출

11-2. 백테스트를 위한 데이터 준비

우선 과거의 1분봉 또는 5분봉 데이터를 가져옵니다. Binance에서 CSV로 다운로드하거나, CCXT 라이브러리 사용도 가능합니다.


import pandas as pd

df = pd.read_csv("BTCUSDT_5m.csv")
df['timestamp'] = pd.to_datetime(df['timestamp'])
df.set_index('timestamp', inplace=True)

11-3. 간단한 전략 적용 함수 만들기

예: MACD + RSI 조건 충족 시 매수 / RSI 과열 시 매도


import talib

def generate_macd_rsi_signals(df):
    df['macd'], df['macdsignal'], _ = talib.MACD(df['close'])
    df['rsi'] = talib.RSI(df['close'])

    df['signal'] = 0
    df.loc[(df['macd'] > df['macdsignal']) & (df['rsi'] < 30), 'signal'] = 1  # Buy
    df.loc[(df['rsi'] > 70), 'signal'] = -1  # Sell
    return df

11-4. 백테스트 로직 구현


def backtest(df):
    df = generate_macd_rsi_signals(df)
    position = 0
    entry_price = 0
    pnl_list = []

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

        if signal == 1 and position == 0:
            position = 1
            entry_price = price

        elif signal == -1 and position == 1:
            profit = price - entry_price
            pnl_list.append(profit)
            position = 0

    return pnl_list

이제 수익 리스트를 바탕으로 총 수익, 평균 수익, 최대 손실 등을 계산합니다.


11-5. 전략 성능 분석


pnl = backtest(df)
print("총 거래 수:", len(pnl))
print("총 수익:", round(sum(pnl), 2))
print("평균 수익:", round(sum(pnl)/len(pnl), 2))
print("최대 손실:", round(min(pnl), 2))

이 출력 결과만으로도 전략의 대략적인 유효성을 평가할 수 있습니다.


11-6. 시각화


import matplotlib.pyplot as plt

plt.plot(df['close'], label="Price")
plt.plot(df['macd'], label="MACD")
plt.plot(df['macdsignal'], label="Signal")
plt.legend()
plt.title("MACD 전략 적용 시점")
plt.show()

11-7. 확장 방향

  • 수수료 반영 기능
  • 슬리피지 고려 및 실전 환경 유사도 향상
  • 모든 전략을 공통 백테스트 인터페이스로 통합

향후 Flask 또는 Streamlit을 활용해 시각적 백테스트 리포트 제공도 가능해집니다.


11-8. 마무리 및 다음 편 예고

이제 과거 데이터를 기반으로 전략의 성과를 평가할 수 있게 되었고, 실전 적용 전 안정성과 수익성을 사전에 검증할 수 있게 되었습니다. 다음 편에서는 멀티 전략 지원 구조와 전략 등록 시스템을 구현해봅니다.

 

반응형