Project/바이낸스 코인 자동거래

MACD + RSI 전략 구성 및 자동 진입 로직 – 코인 자동 거래 앱 개발기 (5)

human coding 2025. 7. 21. 07:33
반응형

5. MACD + RSI 전략 구성 및 자동 진입 로직 – 코인 자동 거래 앱 개발기 (5)

이제 실전 전략 개발 단계에 들어왔습니다. 이번 글에서는 MACD + RSI 전략을 결합하여 매수/매도 시그널을 만들고, 이를 통해 자동으로 포지션 진입 여부를 판단하는 로직을 구현해보겠습니다.


5-1. MACD란?

MACD (Moving Average Convergence Divergence)는 12일 EMA와 26일 EMA의 차이를 나타낸 지표입니다. 여기에 9일 Signal Line을 함께 비교하여 교차점을 분석합니다.

  • MACD Line = EMA(12) - EMA(26)
  • Signal Line = EMA(MACD, 9)

MACD가 Signal Line을 상향 돌파하면 매수 시그널, 하향 돌파하면 매도 시그널로 해석합니다.


5-2. RSI란?

RSI (Relative Strength Index)는 일정 기간 동안의 상승폭과 하락폭을 비교하여 과매수/과매도 구간을 판단하는 지표입니다.

  • RSI > 70 → 과매수 (매도 유리)
  • RSI < 30 → 과매도 (매수 유리)

5-3. 진입 조건 정의 (MACD + RSI 결합)

이제 두 지표를 조합하여 다음과 같은 조건으로 진입 시그널을 정의합니다.

  • 매수(BUY): MACD가 Signal을 상향 돌파 AND RSI < 30
  • 매도(SELL): MACD가 Signal을 하향 돌파 AND RSI > 70

그 외의 조건일 경우 진입하지 않습니다 ("HOLD").


5-4. 전략 구현 코드 (pandas 기반)

아래는 Pandas를 사용해 MACD + RSI를 계산하고 시그널을 리턴하는 함수입니다.


import pandas as pd

def generate_macd_rsi_signal(df):
    df['EMA12'] = df['close'].ewm(span=12, adjust=False).mean()
    df['EMA26'] = df['close'].ewm(span=26, adjust=False).mean()
    df['MACD'] = df['EMA12'] - df['EMA26']
    df['Signal'] = df['MACD'].ewm(span=9, adjust=False).mean()
    
    # RSI 계산
    delta = df['close'].diff()
    gain = delta.where(delta > 0, 0)
    loss = -delta.where(delta < 0, 0)
    avg_gain = gain.rolling(window=14).mean()
    avg_loss = loss.rolling(window=14).mean()
    rs = avg_gain / avg_loss
    df['RSI'] = 100 - (100 / (1 + rs))

    # 시그널 판단 (가장 최근 값)
    if df['MACD'].iloc[-2] < df['Signal'].iloc[-2] and df['MACD'].iloc[-1] > df['Signal'].iloc[-1] and df['RSI'].iloc[-1] < 30:
        return "BUY"
    elif df['MACD'].iloc[-2] > df['Signal'].iloc[-2] and df['MACD'].iloc[-1] < df['Signal'].iloc[-1] and df['RSI'].iloc[-1] > 70:
        return "SELL"
    else:
        return "HOLD"

5-5. 시세 데이터 연동 예시

실제 Binance API에서 받은 가격 데이터를 Pandas DataFrame으로 변환해 이 전략에 적용할 수 있습니다.


from binance.client import Client
import pandas as pd

# 바이낸스 클라이언트 준비
client = Client(api_key, secret_key)

# 과거 데이터 가져오기
klines = client.futures_klines(symbol="BTCUSDT", interval=Client.KLINE_INTERVAL_1MINUTE, limit=100)
df = pd.DataFrame(klines, columns=[
    "time", "open", "high", "low", "close", "volume",
    "close_time", "quote_asset_volume", "trades",
    "taker_base_vol", "taker_quote_vol", "ignore"
])
df["close"] = df["close"].astype(float)

# 전략 적용
signal = generate_macd_rsi_signal(df)
print("시그널 결과:", signal)

5-6. 마무리 및 다음 편 예고

이제 MACD와 RSI를 활용한 진입 전략이 완성되었습니다. 다음 편에서는 이 시그널을 실제 주문(포지션 진입)으로 연결해보겠습니다.

지표는 진입 타이밍을 알려줄 뿐, 진짜 매매는 다음 단계입니다.

반응형