3.7.3.2 파이썬 코드 구현
RSI 과매수/과매도 전략을 파이썬으로 구현합니다. 이 전략은 간단하면서도 직관적인 매매 방식을 제공합니다. TA-Lib 라이브러리를 사용하여 RSI 지표를 계산합니다. 매수 및 매도 신호를 생성하고, 백테스팅을 수행합니다. 코드를 통해 전략을 이해하고, 실제 자동매매 시스템에 적용합니다.
1단계: 필요한 라이브러리 준비
자동매매 시스템 구축에 필요한 라이브러리를 임포트합니다. Pandas는 데이터 처리에 필수적인 라이브러리입니다. TA-Lib은 RSI 지표 계산을 위해 사용됩니다. pyupbit은 업비트 API를 사용하여 데이터를 가져옵니다.
import pandas as pd
import talib
import pyupbit
2단계: 데이터 획득 및 RSI 계산
업비트 API를 사용하여 가상화폐 데이터를 가져옵니다. pyupbit.get_ohlcv()
함수를 사용하여 OHLCV 데이터를 얻습니다. 데이터프레임 컬럼명을 Open
, High
, Low
, Close
, Volume
으로 변경합니다. TA-Lib의 RSI()
함수를 사용하여 RSI 값을 계산합니다. 기간은 일반적으로 14일을 사용하며, 조정 가능합니다.
# 업비트 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)
# RSI 계산 (14일 기준)
df['RSI'] = talib.RSI(df['Close'], timeperiod=14)
3단계: 매매 신호 생성 함수 구현
RSI 값을 기반으로 매매 신호를 생성하는 함수를 정의합니다. 과매수 기준과 과매도 기준을 설정합니다. RSI가 과매수 기준을 넘으면 매도 신호를 생성합니다. RSI가 과매도 기준보다 낮으면 매수 신호를 생성합니다.
def generate_rsi_signals(df, overbought=70, oversold=30):
"""RSI 기반 과매수/과매도 전략 매매 신호 생성
Args:
df (pd.DataFrame): OHLCV 데이터프레임, RSI 컬럼 필요
overbought (int): 과매수 기준 (기본값: 70)
oversold (int): 과매도 기준 (기본값: 30)
Returns:
pd.DataFrame: 'signal' 컬럼이 추가된 데이터프레임 (1: 매수, -1: 매도, 0: 유지)
"""
signals = [0] * len(df) # 초기값 0으로 설정
position = 0 # 0: No position, 1: Long, -1: Short
for i in range(1, len(df)):
# 매수 신호 (과매도 상태 and No Position)
if df['RSI'][i] < oversold and position == 0:
signals[i] = 1 # 매수 신호
position = 1 # Long Position
# 매도 신호 (과매수 상태 and Long Position)
elif df['RSI'][i] > overbought and position == 1:
signals[i] = -1 # 매도 신호 (Long 청산)
position = 0 # No Position
# 매도 신호 (과매수 상태 and No Position)
elif df['RSI'][i] > overbought and position == 0:
signals[i] = -1 # 매도 신호 (Short 진입)
position = -1 # Short Position
# 매수 신호 (과매도 상태 and Short Position)
elif df['RSI'][i] < oversold and position == -1:
signals[i] = 1 # 매수 신호 (Short 청산)
position = 0 # No Position
else:
signals[i] = 0 # 유지 신호
df['signal'] = signals
return df
df = generate_rsi_signals(df)
print(df[['Close', 'RSI', 'signal']].tail())
4단계: 백테스팅 함수 구현
생성된 매매 신호를 기반으로 백테스팅을 수행합니다. 초기 자본, 수수료 등을 설정합니다. 각 신호에 따라 매수 및 매도 시뮬레이션을 진행합니다. 최종 자산을 계산하여 전략의 수익성을 평가합니다.
def rsi_backtest(df, initial_balance=1000000, fee=0.0005):
"""RSI 기반 과매수/과매도 전략 백테스팅
Args:
df (pd.DataFrame): OHLCV 데이터프레임, Close, signal 컬럼 필요
initial_balance (float): 초기 자본
fee (float): 거래 수수료
Returns:
float: 최종 자산
"""
balance = initial_balance
position = 0 # 0: No position, 1: Long, -1: Short
buy_price = 0
for i in range(1, len(df)):
if df['signal'][i] == 1 and position == 0: # 매수 신호 and No Position
buy_price = df['Close'][i]
balance *= (1 - fee)
position = 1 # Long
print(f"{df.index[i]}: Buy at {buy_price}")
elif df['signal'][i] == -1 and position == 1: # 매도 신호 and Long Position
sell_price = df['Close'][i]
profit = (sell_price - buy_price) / buy_price
balance += balance * profit * (1 - fee)
position = 0 # No Position
print(f"{df.index[i]}: Sell at {sell_price}, Profit: {profit:.4f}")
elif df['signal'][i] == -1 and position == 0: # 매도 신호 and No Position
buy_price = df['Close'][i]
balance *= (1 - fee)
position = -1 # Short
print(f"{df.index[i]}: Short at {buy_price}")
elif df['signal'][i] == 1 and position == -1: # 매수 신호 and Short Position
sell_price = df['Close'][i]
profit = (buy_price - sell_price) / sell_price
balance += balance * profit * (1 - fee)
position = 0 # No Position
print(f"{df.index[i]}: Cover at {sell_price}, Profit: {profit:.4f}")
if position != 0:
last_price = df['Close'][len(df)-1]
if position == 1:
profit = (last_price - buy_price) / buy_price
else:
profit = (buy_price - last_price) / last_price
balance += balance * profit * (1 - fee)
print(f"마지막 청산: {last_price}, 수익률: {profit:.4f}")
print(f"최종 자산: {balance:.0f}")
return balance
rsi_backtest(df)
5단계: 파라미터 최적화 및 전략 개선
백테스팅 결과를 바탕으로 전략의 파라미터를 최적화합니다. 과매수 및 과매도 기준을 조정하여 수익성을 개선합니다. 손절매 설정을 추가하여 리스크를 관리합니다. 다양한 시장 상황에서 전략의 성능을 평가합니다.
주의사항:
- 이 코드는 교육 목적으로 제공되며, 실제 투자에 사용하기 전에 충분한 검증이 필요합니다.
- 과거 데이터 기반의 백테스팅 결과는 미래 수익을 보장하지 않습니다.
- 수수료, 슬리피지, 시장 상황 등을 고려하여 전략을 최적화해야 합니다.
이 섹션에서는 RSI 과매수/과매도 전략을 파이썬 코드로 구현했습니다. 다음 섹션에서는 볼린저 밴드를 활용한 매매 전략을 구현합니다.