Python으로 MA Cross 지표 구현하기

MA 크로스는 두 개의 이동 평균을 계산하여 표시하고 교차하는 바를 강조 표시합니다.
단기적으로 추세가 약해지거나 강해지는 시점을 보여주는 지표입니다.

골든크로스 – 단기 이동평균선이 장기 이동평균선을 상향 돌파할 때 발생합니다. 이는 매수 신호로 해석되며, 일반적으로 상승 추세가 시작될 가능성을 나타냅니다.
데드크로스 – 단기 이동평균선이 장기 이동평균선을 하향 돌파할 때 발생합니다. 이는 매도 신호로 해석되며, 일반적으로 하락 추세가 시작될 가능성을 나타냅니다.

골든크로스는 up, 데드크로스는 down, SMA 크로스를 구현하겠습니다.

pip install pandas ccxt numpy

import pandas as pd
import ccxt
import numpy as np

# 예시) 바이낸스 선물 BTCUSDT, 1시간 봉 
bnb = ccxt.binance({'options': { 'defaultType': 'future' }}) 


def MA_CROSS(short_length=9, long_length=21):
    ohlcv = bnb.fetch_ohlcv(symbol="BTC/USDT", timeframe="1h", limit=500)
    df = pd.DataFrame(ohlcv, columns=['time', 'open', 'high', 'low', 'close', 'volume'])

    # Y-m-d H:is로 변환
    df['time'] = pd.to_datetime(df['time'], unit='ms').dt.tz_localize('UTC')
    df['time'] = df['time'].dt.tz_convert('Asia/Seoul').dt.strftime('%Y-%m-%d %H:%M:%S')

    _df = df.copy()
    _df['short'] = _df['close'].rolling(window=short_length).mean()
    _df['long'] = _df['close'].rolling(window=long_length).mean()
    df['MA_Cross'] = np.where((_df['short'] > _df['long']) & (_df['short'].shift(1) <= _df['long'].shift(1)), 'up',
        np.where((_df['short'] < _df['long']) & (_df['short'].shift(1) >= _df['long'].shift(1)), 'down', ''))

    # MA_Cross가 빈 값이 아닌 것만 필터링
    cross = df[df['MA_Cross'] != '']
    return cross

print(MA_CROSS(short_length=9, long_length=21)) # 트레이딩뷰 디폴트 값

트레이딩뷰 차트와 비교

해당 시간 단기 이동평균(9일), 장기 이동평균(21일) 기준으로 골든크로스가 발생했습니다.