본문 바로가기
📈 자동매매 & 퀀트 투자

코드 실험편: 마하세븐 매매 전략을 코드로 구현해보기

by digital-sidejob 2025. 4. 1.
반응형

마하세븐 매매 전략을 코드로 구현해보기

자동매매 전략을 백테스트하고 수익을 검증하는 것도 중요하지만,
그 시작은 항상 **“내 전략을 코드로 구현할 수 있는가?”**에서 출발한다.
이번 글에서는 앞서 소개했던 마하세븐 매매법을 파이썬 코드로 하나하나 구현하며,
전략을 실전 자동매매 시스템으로 옮기는 과정을 따라가본다.


반응형

1. 전략 구성요소 다시 보기

마하세븐 매매법의 핵심 로직은 다음과 같다.

이 전략을 자동화하려면 다음 4가지 함수를 구현해야 한다.

  1. RSI 계산기
  2. 골든크로스 판별 함수
  3. 매수/매도 조건 판단 함수
  4. 주문 실행 함수

2. RSI 계산기

def get_rsi(df, period=14):
    delta = df['close'].diff()
    gain = delta.where(delta > 0, 0)
    loss = -delta.where(delta < 0, 0)

    avg_gain = gain.rolling(window=period).mean()
    avg_loss = loss.rolling(window=period).mean()

    rs = avg_gain / avg_loss
    rsi = 100 - (100 / (1 + rs))
    return rsi
  • delta: 전일 대비 종가 변화량
  • gain/loss: 상승/하락만 분리
  • rolling mean: 지정된 기간(14일) 동안의 평균 상승폭, 하락폭 계산

3. 골든크로스 판별

def is_golden_cross(df, short=5, long=20):
    short_ma = df['close'].rolling(window=short).mean()
    long_ma = df['close'].rolling(window=long).mean()

    # 이전에는 교차되지 않았고, 이번에 골든크로스 발생
    if short_ma.iloc[-2] < long_ma.iloc[-2] and short_ma.iloc[-1] > long_ma.iloc[-1]:
        return True
    return False
  • 단기 이평선이 장기 이평선을 위로 뚫고 올라가는지를 판단
  • iloc[-2]와 iloc[-1]을 비교하여 변화 지점 탐지

4. 매수 조건 판단 함수

def check_entry_condition(ticker="KRW-BTC"):
    df = pyupbit.get_ohlcv(ticker, interval="minute60", count=100)
    rsi = get_rsi(df)
    if rsi.iloc[-1] < 60:
        return False
    if not is_golden_cross(df):
        return False
    return True
  • 조건 1: RSI ≥ 60
  • 조건 2: 골든크로스 발생
  • 둘 다 만족해야 매수 신호 발생

5. 스탑로스 및 분할 매도 로직 설계

이 부분은 조금 복잡하므로 가상의 변수로 흐름을 구성한다.

buy_price = 1000000  # 매수 단가
current_price = pyupbit.get_current_price("KRW-BTC")
rate_of_return = (current_price - buy_price) / buy_price * 100

# 분할 매도 로직
if rate_of_return >= 1.0:
    upbit.sell_market_order("KRW-BTC", quantity * 0.5)
elif rate_of_return >= 1.5:
    upbit.sell_market_order("KRW-BTC", quantity * 0.25)
elif rate_of_return >= 2.0:
    upbit.sell_market_order("KRW-BTC", quantity * 0.25)

# 스탑로스
if rate_of_return <= -8.0:
    upbit.sell_market_order("KRW-BTC", quantity)

이 구조는 백테스트를 넘어 실전에서도 안정적인 매도 흐름을 유지할 수 있도록 설계됐다.


6. 테스트 환경에서 먼저 검증하자

  • 가상 환경에서 print로 로그 출력하며 확인
  • 실매매 전 잔고 확인 → 최소 금액만 실험
  • 초기에는 '실시간 매매' 대신 하루 1회 실행으로 시작

7. 실전 팁

  • 매수 조건이 자주 발생하지 않도록 조건 필터링 강화
  • logger 사용하여 모든 주문 기록
  • 카카오톡 메시지 전송 기능 추가 → 거래 확인 쉬움
  • time.sleep() 대신 Crontab을 추천 (AWS에서 5분 단위 실행)

📌 마무리 요약

반응형