3.7.2.2. 파이썬 코드 구현

3.7.2.2 파이썬 코드 구현

이 섹션에서는 이동평균선 교차 전략을 파이썬 코드로 구현합니다. 앞서 설명한 전략 로직을 바탕으로 코드를 작성합니다. 핵심은 효율적인 데이터 처리와 명확한 신호 생성입니다. Pandas와 TA-Lib 라이브러리를 활용하여 구현합니다. 실제 자동매매 시스템에 적용 가능한 코드를 제시합니다.

1단계: 개발 환경 설정 및 라이브러리 임포트

먼저 필요한 라이브러리를 임포트합니다. Pandas는 데이터 분석 및 처리에 사용됩니다. TA-Lib은 기술적 지표 계산에 사용됩니다.

import pandas as pd
import talib
import pyupbit  # 업비트 API 사용

2단계: 데이터 획득 및 전처리

가상화폐 시세 데이터를 가져옵니다. 여기서는 업비트 API를 사용합니다. 다른 거래소 API를 사용해도 무방합니다. 데이터프레임의 컬럼명을 통일합니다. open, high, low, close, volume 컬럼이 필요합니다.

# 업비트 API를 통해 데이터 가져오기
df = pyupbit.get_ohlcv("KRW-BTC", interval="minute60", count=500)

# 컬럼명 변경 (필요한 경우)
df.rename(columns={'open': 'Open', 'high': 'High', 'low': 'Low', 'close': 'Close', 'volume': 'Volume'}, inplace=True)

3단계: 이동평균선 계산

TA-Lib을 사용하여 이동평균선을 계산합니다. 단기 이동평균선과 장기 이동평균선을 설정합니다. 여기서는 50일 이동평균선과 200일 이동평균선을 사용합니다. 전략에 맞게 기간을 조정할 수 있습니다.

# 이동평균선 계산
df['SMA_50'] = talib.SMA(df['Close'], timeperiod=50)
df['SMA_200'] = talib.SMA(df['Close'], timeperiod=200)

4단계: 매매 신호 생성

골든 크로스와 데드 크로스를 감지하여 매매 신호를 생성합니다. 단기 이동평균선이 장기 이동평균선을 상향 돌파하면 매수 신호(1)를 발생시킵니다. 하향 돌파하면 매도 신호(-1)를 발생시킵니다. 두 선이 교차하지 않으면 유지 신호(0)를 발생시킵니다.

def generate_trade_signals(df):
  """이동평균선 교차 전략 기반 매매 신호 생성 함수

  Args:
      df (pd.DataFrame): OHLCV 데이터프레임. SMA_50, SMA_200 컬럼 필요

  Returns:
      pd.DataFrame: 'signal' 컬럼이 추가된 데이터프레임 (1: 매수, -1: 매도, 0: 유지)
  """
  signals = [0] * len(df)  # 초기 신호는 0 (유지)으로 설정
  for i in range(1, len(df)):
    # 골든 크로스 발생
    if (df['SMA_50'][i-1] < df['SMA_200'][i-1]) and (df['SMA_50'][i] > df['SMA_200'][i]):
      signals[i] = 1  # 매수 신호
    # 데드 크로스 발생
    elif (df['SMA_50'][i-1] > df['SMA_200'][i-1]) and (df['SMA_50'][i] < df['SMA_200'][i]):
      signals[i] = -1  # 매도 신호
    # 그 외의 경우: 유지
    else:
      signals[i] = 0
  df['signal'] = signals
  return df

df = generate_trade_signals(df)
print(df[['Close', 'SMA_50', 'SMA_200', 'signal']].tail())

5단계: 백테스팅 (간단한 예시)

생성된 매매 신호를 바탕으로 백테스팅을 수행합니다. 초기 자본을 설정하고, 매수/매도 시뮬레이션을 진행합니다. 수수료를 고려하여 수익률을 계산합니다. 이 부분은 3.8 백테스팅 환경 구축 섹션에서 더 자세히 다룹니다.

def simple_backtest(df, initial_balance=1000000, fee=0.0005):
  """간단한 백테스팅 함수

  Args:
      df (pd.DataFrame): OHLCV 데이터프레임. Close, signal 컬럼 필요
      initial_balance (float): 초기 자본
      fee (float): 거래 수수료 (기본값: 0.05%)

  Returns:
      float: 최종 자산
  """
  balance = initial_balance
  position = False  # 포지션 보유 여부
  buy_price = 0

  for i in range(1, len(df)):
    if df['signal'][i] == 1 and not position:  # 매수 신호 발생 and 포지션 없는 경우
      buy_price = df['Close'][i]
      balance *= (1 - fee) # 수수료 차감
      position = True
      print(f"{df.index[i]}: Buy at {buy_price}")

    elif df['signal'][i] == -1 and position:  # 매도 신호 발생 and 포지션 있는 경우
      sell_price = df['Close'][i]
      profit = (sell_price - buy_price) / buy_price
      balance += balance * profit * (1 - fee)  # 수익 계산 및 수수료 차감
      position = False
      print(f"{df.index[i]}: Sell at {sell_price}, Profit: {profit:.4f}")

  if position:  # 마지막에 포지션이 남아있다면
    sell_price = df['Close'][len(df) - 1]
    profit = (sell_price - buy_price) / buy_price
    balance += balance * profit * (1 - fee)
    print(f"마지막 청산: {sell_price}, 수익률: {profit:.4f}")

  print(f"최종 자산: {balance:.0f}")
  return balance

simple_backtest(df)

6단계: 결과 분석 및 개선

백테스팅 결과를 분석합니다. 수익률, MDD(최대 낙폭) 등을 확인합니다. 전략의 파라미터(이동평균선 기간)를 조정하여 성능을 개선합니다. 3.8 섹션에서 백테스팅 결과 분석 지표를 자세히 다룹니다.

주의사항:

  • 위 코드는 예시이며, 실제 투자에 사용하기 전에 충분한 검증이 필요합니다.
  • 수수료, 슬리피지 등을 고려하여 백테스팅해야 합니다.
  • 백테스팅 결과는 과거 데이터에 기반하며, 미래 수익을 보장하지 않습니다.
  • 다양한 시장 상황에서 전략의 성능을 평가해야 합니다.

이 섹션에서는 이동평균선 교차 전략을 파이썬 코드로 구현했습니다. 다음 섹션에서는 RSI를 이용한 매매 전략을 구현합니다.

위로 스크롤