본문 바로가기
Python

바이낸스 선물 GPT 자동매매 6편 : 백테스트 & 페이퍼 트레이딩 시스템 구축

by 코드렌즈 2025. 10. 5.
반응형

안녕하세요! 👋 이번 포스팅에서는 GPT 자동매매 시리즈의 여섯 번째 단계,
“백테스트(Backtest)”와 “페이퍼 트레이딩(Paper Trading)” 을 다룹니다.

앞선 5편까지는 실제로 신호를 만들고, 리스크 관리까지 코드를 완성했죠.
이제 본격적으로 이 전략이 과거 데이터에서 얼마나 유효한지,
그리고 실전 진입 전 가상 환경에서 얼마나 안정적으로 작동하는지 검증해볼 차례입니다.

🔹 1. 백테스트와 페이퍼 트레이딩의 차이

  • 백테스트(Backtesting)
    → 과거 데이터를 기반으로 전략을 시뮬레이션하는 과정
    → “이 전략이 과거에 통했다면 앞으로도 통할까?”를 검증
  • 페이퍼 트레이딩(Paper Trading)
    → 실시간 시세를 사용하지만 실제 자금을 사용하지 않는 가상 거래
    → “실제 시장 환경에서 전략이 얼마나 안정적으로 작동하는가”를 점검

GPT 자동매매의 학습 구조는 “백테스트 → 페이퍼 → 실전” 순서로 발전합니다.

🔹 2. 백테스트 설계 개요

백테스트의 핵심은 세 단계로 나눌 수 있습니다.

  1. 과거 시세 데이터 수집
  2. 전략 적용 (이동평균 교차, 손절·익절 포함)
  3. 거래 결과 기록 및 성과 분석

이 과정을 파이썬 코드로 순차적으로 구현해볼게요.

🔹 3. 시세 데이터 가져오기

우선 바이낸스 API에서 일정 기간의 과거 데이터를 가져옵니다.
(테스트 시 과거 1개월~6개월 정도면 충분합니다.)

def get_data(symbol='BTCUSDT', interval='1h', limit=1000):
    """과거 시세 데이터 수집"""
    klines = client.futures_klines(symbol=symbol, interval=interval, limit=limit)
    df = pd.DataFrame(klines, columns=[
        'timestamp', 'open', 'high', 'low', 'close', 'volume',
        'close_time', 'quote_asset_volume', 'number_of_trades',
        'taker_buy_base_asset_volume', 'taker_buy_quote_asset_volume', 'ignore'
    ])
    df['timestamp'] = pd.to_datetime(df['timestamp'], unit='ms')
    df[['open', 'high', 'low', 'close']] = df[['open', 'high', 'low', 'close']].astype(float)
    return df

🔹 4. 이동평균 신호 적용

def apply_signals(df, short_window=10, long_window=30):
    """이동평균선 교차 전략 적용"""
    df['SMA_Short'] = ta.trend.sma_indicator(df['close'], window=short_window)
    df['SMA_Long'] = ta.trend.sma_indicator(df['close'], window=long_window)

    df['Signal'] = 'HOLD'
    for i in range(1, len(df)):
        prev_short = df['SMA_Short'].iloc[i-1]
        prev_long = df['SMA_Long'].iloc[i-1]
        curr_short = df['SMA_Short'].iloc[i]
        curr_long = df['SMA_Long'].iloc[i]

        if prev_short < prev_long and curr_short > curr_long:
            df.at[i, 'Signal'] = 'BUY'
        elif prev_short > prev_long and curr_short < curr_long:
            df.at[i, 'Signal'] = 'SELL'
    return df

🔹 5. 백테스트 함수 구현

매매 신호가 발생할 때마다 가상으로 포지션을 진입·청산하며
수익률을 계산하는 로직을 구현합니다.

def backtest(df, fee=0.0004):
    """단순 백테스트 시뮬레이션"""
    balance = 1000.0  # 초기 투자금
    position = None
    entry_price = 0
    trade_log = []

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

        if signal == 'BUY' and position != 'LONG':
            position = 'LONG'
            entry_price = price
            trade_log.append(f"BUY @ {price:.2f}")

        elif signal == 'SELL' and position != 'SHORT':
            position = 'SHORT'
            entry_price = price
            trade_log.append(f"SELL @ {price:.2f}")

        elif signal == 'HOLD' and position:
            # 포지션 유지 중 평가손익 계산
            pnl = ((price - entry_price) / entry_price) * (1 if position == 'LONG' else -1)
            balance = balance * (1 + pnl - fee)
            trade_log.append(f"{position} closed @ {price:.2f} | Balance: {balance:.2f}")
            position = None

    return balance, trade_log

📘 핵심 로직 요약

  • 신호 발생 시 가상으로 포지션 진입
  • 포지션 종료 시 수익률 계산 후 잔고 갱신
  • 거래 수수료 반영 (기본 0.04%)
  • 반복 실행으로 전략 전체 성과 측정

🔹 6. 백테스트 실행

df = get_data('BTCUSDT', '1h', 1000)
df = apply_signals(df)
final_balance, logs = backtest(df)

print("최종 잔액:", round(final_balance, 2), "USDT")
print("수익률:", round((final_balance - 1000) / 1000 * 100, 2), "%")

이 코드 한 줄로 전략의 과거 성능을 빠르게 확인할 수 있습니다.
결과 로그에는 매수·매도 시점과 잔액 변동이 함께 기록됩니다.

🔹 7. 페이퍼 트레이딩 구현

백테스트로 전략이 유효하다고 판단되면
실시간 데이터를 기반으로 가상 거래를 수행합니다.

def paper_trading(symbol='BTCUSDT', interval='1h'):
    """실시간 시세 기반 페이퍼 트레이딩"""
    print("📈 페이퍼 트레이딩 시작")
    while True:
        df = get_data(symbol, interval, 100)
        df = apply_signals(df)
        signal = df['Signal'].iloc[-1]
        price = df['close'].iloc[-1]
        print(f"[{pd.Timestamp.now()}] 현재 신호: {signal} | 가격: {price}")

        if signal == 'BUY':
            print("가상 매수 포지션 진입")
        elif signal == 'SELL':
            print("가상 매도 포지션 진입")

        time.sleep(3600)

이 코드를 실행하면 실시간으로 신호 발생, 가격, 포지션 상태를 콘솔에 출력합니다.
자금은 실제로 움직이지 않지만, GPT가 전략을 실시간으로 평가할 수 있습니다.

🔹 8. GPT가 분석할 수 있는 백테스트 결과 항목

GPT는 아래의 백테스트 결과를 분석하여
전략을 개선하거나 리스크 파라미터를 자동 조정할 수 있습니다.

  • 전체 거래 횟수
  • 승률 (이익 거래 / 전체 거래 수)
  • 평균 손익비 (평균 수익 / 평균 손실)
  • 최대 낙폭 (MDD)
  • 누적 수익률
  • 연속 손실 횟수
  • 각 거래별 진입 신호의 정확도

GPT는 이 데이터를 기반으로 “단기선/장기선 기간 최적화”,
“리스크 비율 자동 조정”, “진입 시점 보정” 등의 작업을 수행할 수 있습니다.

🔹 9. 백테스트 결과 해석 팁

  • 백테스트 수익률이 높다고 무조건 좋은 전략은 아닙니다.
  • 변동성이 큰 구간에서 과최적화된 전략은 실전에선 실패할 가능성이 높습니다.
  • 승률보다 중요한 것은 손익비(Risk-Reward Ratio) 입니다.
    즉, 이기면 많이 벌고, 져도 조금만 잃는 구조가 이상적입니다.

🔹 10. 다음 편 예고 (7편)

다음 편에서는 “운영 자동화 & 모니터링 시스템” 을 구축합니다.
즉, 완성된 GPT 자동매매 봇이
24시간 서버에서 안정적으로 작동하도록 설계하는 단계입니다.

실시간 로그, 디스코드 알림, 장애 복구, 헬스체크 등
실전 트레이딩 운영에 필요한 관리 기능을 전부 다뤄보겠습니다.

✨ 맺음말

오늘은 GPT 자동매매 전략이 과거 데이터와 실시간 환경에서
정상적으로 작동하는지 검증할 수 있는 시스템을 완성했습니다.

이제 여러분의 자동매매 봇은 단순한 코드가 아니라
테스트 → 학습 → 개선”이 가능한 지능형 트레이딩 시스템으로 진화할 준비가 되었습니다.
다음 편에서는 운영 자동화까지 완성해봅시다 🚀

 

바이낸스 가입 방법 총정리 (10% 수수료 할인 코드 포함)

바이낸스(Binance)는 세계 최대의 가상화폐 거래소 중 하나로, 현물 거래(Spot)와 선물 거래(Futures)를 모두 지원합니다. 또한 API를 이용한 자동매매 시스템 트레이딩도 가능하여, 전 세계 트레이더들

codelenz.tistory.com

 

반응형