AI

[AI | 데이터분석] 6. 실전 적용 방법: 종합 매매 전략

revolutionarylife 2024. 11. 23. 14:02
반응형

📊 [AI | 데이터분석] 6. 실전 적용 방법: 종합 매매 전략

목차

  • 1. 적용 준비
  • 2. 종합 매매 전략
  • 3. 종합 매매 전략 구현
  • 4. 백테스팅 및 실시간 실행
  • 5. 실행 시 유의사항
  • 6. 마무리

1. 적용 준비

실전 적용을 위해 먼저 데이터를 수집합니다. CCXT 라이브러리를 사용해 거래소의 실시간 데이터를 가져오고, Pandas와 TA-Lib를 사용해 지표를 계산합니다.

import ccxt
import pandas as pd
import talib

# 거래소 데이터 가져오기
exchange = ccxt.binance()
symbol = 'BTC/USDT'
data = exchange.fetch_ohlcv(symbol, timeframe='1h', limit=100)

# 데이터 프레임 생성
df = pd.DataFrame(data, columns=['timestamp', 'open', 'high', 'low', 'close', 'volume'])
df['timestamp'] = pd.to_datetime(df['timestamp'], unit='ms')

2. 종합 매매 전략

아래는 5부에서 작성한 세 가지 전략입니다.
각 전략은 지표의 결합을 통해 매수 및 매도 신호를 생성하며, 다양한 시장 상황에 대처할 수 있도록 설계되었습니다.

전략 1: RSI와 MACD를 결합

이 전략은 모멘텀 기반 지표인 RSI와 MACD를 결합하여 과매수 및 과매도 상태를 활용합니다.

RSI:  가격의 상대적인 강도를 측정하는 지표로, 가격이 얼마나 빠르게 상승 또는 하락하는지 나타냄

MACD: 이동평균선(EMA)을 기반으로 한 모멘텀 지표로, 시장의 추세와 변화를 분석함
  • 매수 신호: RSI가 30 이하로 떨어져 과매도 상태임을 나타내고, 동시에 MACD선이 Signal선을 상향 돌파(골든 크로스)할 경우.
    • RSI가 30 이하 → 과매도 상태로 상승 반전 가능성 증가.
    • MACD선이 Signal선을 상향 돌파 (골든 크로스) → 상승 추세로 전환 중.
    • 이 두 조건이 동시에 충족되면 매수 신호 발생.
  • 매도 신호: RSI가 70 이상으로 올라가 과매수 상태임을 나타내고, 동시에 MACD선이 Signal선을 하향 돌파(데드 크로스)할 경우.
    • RSI가 70 이상 → 과매수 상태로 하락 반전 가능성 증가.
    • MACD선이 Signal선을 하향 돌파 (데드 크로스) → 하락 추세로 전환 중.
    • 이 두 조건이 동시에 충족되면 매도 신호 발생.
# 전략 1 매수 및 매도 신호
df["Buy_Signal_Strategy1"] = (df["RSI"] < 30) & (df["MACD"] > df["Signal"])
df["Sell_Signal_Strategy1"] = (df["RSI"] > 70) & (df["MACD"] < df["Signal"])

RSI와 MACD를 결합하는 이유

  • RSI는 가격의 과매수/과매도를 측정하지만, 추세의 방향을 확인할 수는 없습니다.
  • MACD는 추세의 방향을 확인하는 데 유용하지만, 과매수/과매도 상태를 직접 나타내지는 않습니다.
  • 이 둘을 결합하면 과매수/과매도 상태와 추세 변화를 동시에 파악할 수 있어 신호의 정확도가 높아집니다.

전략 2: 볼린저 밴드와 ADX를 결합

이 전략은 변동성 기반 지표인 볼린저 밴드와 추세 강도를 측정하는 ADX를 결합합니다.

볼린저 밴드: 시장의 변동성을 나타내는 지표로, 세 가지 주요 선으로 구성됩니다

ADX: 시장의 추세 강도를 나타내는 지표
  • 매수 신호: 가격이 볼린저 밴드의 하단에 도달하고, ADX 값이 상승 추세를 나타내는 25 이상일 경우.
    • 가격이 하단 밴드에 도달 → 과매도 상태로 간주.
    • ADX 값이 25 이상 → 강한 상승 추세로 이어질 가능성이 높음.
    • 가격이 저점에서 상승할 가능성이 크므로 매수.
  • 매도 신호: 가격이 볼린저 밴드의 상단에 도달하고, ADX 값이 상승 추세를 나타내는 25 이상일 경우.
    • 가격이 상단 밴드에 도달 → 과매수 상태로 간주.
    • ADX 값이 25 이상 → 강한 하락 추세로 이어질 가능성이 높음.
    • 가격이 고점에서 하락할 가능성이 크므로 매도.
# 전략 2 매수 및 매도 신호
df["Buy_Signal_Strategy2"] = (df["close"] < df["Lower_Band"]) & (df["ADX"] > 25)
df["Sell_Signal_Strategy2"] = (df["close"] > df["Upper_Band"]) & (df["ADX"] > 25)

 볼린저 밴드와 ADX를 결합하는 이유

  • 볼린저 밴드는 변동성만을 측정하므로, 단순히 가격이 상단/하단 밴드에 도달했다고 해서 바로 매매를 결정하면 신호가 부정확할 수 있습니다.
  • ADX를 결합하면 해당 상태에서 추세 강도가 강한지 확인할 수 있어, 신호의 신뢰도를 높일 수 있습니다.

전략 3: OBV와 RSI를 결합

이 전략은 볼륨 기반 지표인 OBV와 모멘텀 기반 지표인 RSI를 결합하여 매매 신호를 생성합니다.

OBV: 거래량과 가격 움직임의 관계를 나타내는 지표로, 자금의 유입과 유출을 분석함

RSI:  가격의 상대적인 강도를 측정하는 지표로, 가격이 얼마나 빠르게 상승 또는 하락하는지 나타냄
  • 매수 신호: OBV가 상승하고, RSI가 중립선인 50 이상일 경우.
    • OBV가 상승 → 자금이 유입되고 있으며, 가격 상승 가능성 증가.
    • RSI가 50 이상 → 모멘텀이 강해지며, 상승 추세로 전환 중.
    • 이 두 조건이 동시에 충족되면 매수 신호 발생.
  • 매도 신호: OBV가 하락하고, RSI가 중립선인 50 이하일 경우.
    • OBV가 하락 → 자금이 유출되고 있으며, 가격 하락 가능성 증가.
    • RSI가 50 이하 → 모멘텀이 약해지며, 하락 추세로 전환 중.
    • 이 두 조건이 동시에 충족되면 매도 신호 발생.
# 전략 3 매수 및 매도 신호
df["Buy_Signal_Strategy3"] = (df["OBV"].diff() > 0) & (df["RSI"] >= 50)
df["Sell_Signal_Strategy3"] = (df["OBV"].diff() < 0) & (df["RSI"] < 50)

OBV와 RSI를 결합하는 이유

  • OBV는 자금 흐름을 분석하지만, 현재 가격의 강도를 직접적으로 측정하지는 못합니다.
  • RSI는 모멘텀을 분석하지만, 거래량 정보를 포함하지 않습니다.
  • 이 둘을 결합하면 거래량과 가격의 모멘텀을 동시에 분석할 수 있어 신호의 신뢰도가 높아집니다.

3. 종합 매매 전략 구현

아래는 위 세 가지 전략을 실전에 적용하는 방식입니다. 
위 세 가지 전략은 각각 독립적으로 사용할 수도 있지만, 결합하여 보다 강력한 매매 신호를 생성할 수 있습니다.
이를 통해 다양한 시장 상황에서 신뢰성 있는 매매 결정을 내릴 수 있습니다.
코드 예제:

# RSI 계산
df["RSI"] = talib.RSI(df["close"], timeperiod=14)

# MACD 계산
df["MACD"], df["Signal"], _ = talib.MACD(df["close"], fastperiod=12, slowperiod=26, signalperiod=9)

# 볼린저 밴드 계산
df["Upper_Band"], df["Middle_Band"], df["Lower_Band"] = talib.BBANDS(
    df["close"], timeperiod=20, nbdevup=2, nbdevdn=2, matype=0
)

# ADX 계산
df["ADX"] = talib.ADX(df["high"], df["low"], df["close"], timeperiod=14)

# OBV 계산
df["OBV"] = talib.OBV(df["close"], df["volume"])

# 매매 신호 생성
df["Buy_Signal"] = (
    (df["RSI"] < 30) &  # RSI가 30 이하 (과매도 상태)
    (df["MACD"] > df["Signal"]) &  # MACD 골든 크로스
    (df["close"] < df["Lower_Band"]) &  # 가격이 볼린저 밴드 하단
    (df["ADX"] > 25) &  # 강한 추세 (ADX > 25)
    (df["OBV"].diff() > 0)  # OBV 상승 (거래량 증가)
)

df["Sell_Signal"] = (
    (df["RSI"] > 70) &  # RSI가 70 이상 (과매수 상태)
    (df["MACD"] < df["Signal"]) &  # MACD 데드 크로스
    (df["close"] > df["Upper_Band"]) &  # 가격이 볼린저 밴드 상단
    (df["ADX"] > 25) &  # 강한 추세 (ADX > 25)
    (df["OBV"].diff() < 0)  # OBV 하락 (거래량 감소)
)

매수 조건 설명:

  • RSI는 30 이하로 과매도 상태.
  • MACD 골든 크로스 발생.
  • 가격이 볼린저 밴드의 하단에 도달.
  • ADX가 25 이상으로 강한 추세를 나타냄.
  • OBV가 상승하며 매수세 증가를 시사.

결론: 이 조건이 모두 충족되면 매수 신호 발생.
매도 조건 설명:

  • RSI는 70 이상으로 과매수 상태.
  • MACD 데드 크로스 발생.
  • 가격이 볼린저 밴드의 상단에 도달.
  • ADX가 25 이상으로 강한 추세를 나타냄.
  • OBV가 하락하며 매도세 증가를 시사.

결론: 이 조건이 모두 충족되면 매도 신호 발생.


4. 백테스팅 및 실시간 실행

전략의 유효성을 확인하기 위해 과거 데이터를 사용한 백테스팅을 진행합니다. 이후 실시간 데이터를 기반으로 매매 신호를 모니터링하며 전략을 실행합니다.

# 백테스팅 예제
initial_balance = 10000
position = 0

for i in range(len(df)):
    if df["Buy_Signal"].iloc[i]:
        position = initial_balance / df["close"].iloc[i]
    elif df["Sell_Signal"].iloc[i] and position > 0:
        final_balance = position * df["close"].iloc[i]
        print(f"최종 수익: {final_balance - initial_balance}")
        break

실시간 실행: 아래 코드를 사용해 실시간 데이터를 기반으로 매매 신호를 생성하고 실행합니다.

# 실시간 매매 신호 모니터링
while True:
    live_data = exchange.fetch_ohlcv(symbol, timeframe='1h', limit=1)
    current_close = live_data[-1][4]
    print(f"현재 가격: {current_close}")
    if df["Buy_Signal"].iloc[-1]:
        print("매수 신호 발생!")
    elif df["Sell_Signal"].iloc[-1]:
        print("매도 신호 발생!")
    time.sleep(3600)  # 1시간 간격으로 실행

5. 실행 시 유의사항

  • 모든 전략은 100% 정확하지 않습니다. 반드시 백테스팅을 통해 성능을 확인하세요.
  • 실제 거래 시에는 손절매(Stop Loss)와 목표가(Target Price)를 설정하여 리스크를 관리하세요.
  • 시장 상황은 변동성이 높으므로, 항상 실시간 데이터를 모니터링하고 전략을 유연하게 조정하세요.

6. 마무리

6부에서는 종합 매매 전략을 실전에 적용하는 방법과 실행 시 유의해야 할 사항을 다뤘습니다. 이걸로도 충분히 체계적이기에 자동 매매 앱을 만들어도 되지만 더욱 정확한 예측을 위해 다음 7부에서는 감정 분석과 시장 데이터를 활용한 추가 전략을 소개하겠습니다. 🚀

반응형