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를 활용한 진입 전략이 완성되었습니다. 다음 편에서는 이 시그널을 실제 주문(포지션 진입)으로 연결해보겠습니다.
지표는 진입 타이밍을 알려줄 뿐, 진짜 매매는 다음 단계입니다.
반응형