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를 이용한 매매 전략을 구현합니다.