3.7.3.2. 파이썬 코드 구현

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 과매수/과매도 전략을 파이썬 코드로 구현했습니다. 다음 섹션에서는 볼린저 밴드를 활용한 매매 전략을 구현합니다.

위로 스크롤