Python으로 EMA Trend Meter 구현하기

EMA 트렌드 미터는 트레이딩뷰 오픈 스크립트로 ‘colinmck‘ 이라는 유저가 공개하였습니다.

유저 설명 번역:
이것은 많은 사람들이 월 정기 구독료를 받고 판매하는 유용한 트렌드 분석 도구입니다. 하지만 저는 제 버전을 무료로 제공합니다. 이 스크립트는 동일한 기준 이동 평균을 기반으로 가중치를 적용한 3개의 EMA(지수 이동 평균)로 구성되어 있어 트렌드를 한눈에 파악할 수 있습니다. 제 미터(meter)는 각 EMA의 상태를 표시하며, 상승 시 녹색, 하락 시 빨간색으로 나타납니다. 세로로 동일한 색상이 두 개 정렬되면 해당 방향으로의 거래 가능성이 높아지며, 세 개 모두 같은 색이면 그 방향으로의 움직임이 확실합니다.

트레이딩뷰: https://kr.tradingview.com/v/KFLuglJc/

간단하게 3가지 조건의 색상이 같을때만, 타임프레임에 LONG / SHORT 값을 남기겠습니다.

pip install pandas ccxt

import pandas as pd
import ccxt

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

def ETM(base=1, ema1=7, ema2=14, ema3=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[f"EMA0"] = df['close'].ewm(span=base, adjust=False).mean()
    _df[f"EMA1"] = df['close'].ewm(span=ema1, adjust=False).mean()
    _df[f"EMA2"] = df['close'].ewm(span=ema2, adjust=False).mean()
    _df[f"EMA3"] = df['close'].ewm(span=ema3, adjust=False).mean()

    _df['Bull1'] = _df['EMA1'] < _df['EMA0']
    _df['Bull2'] = _df['EMA2'] < _df['EMA0']
    _df['Bull3'] = _df['EMA3'] < _df['EMA0']
    
    df['ETM'] = _df.apply(lambda row: 'LONG' if row['Bull1'] and row['Bull2'] and row['Bull3'] else ('SHORT' if not row['Bull1'] and not row['Bull2'] and not row['Bull3'] else ''), axis=1)
    
    # 시그널만 리턴
    etm = df[df['ETM'] != '']
    return etm

print(ETM(base=1, ema1=7, ema2=14, ema3=21)) # 트레이딩뷰 디폴트 값

트레이딩뷰 차트와 비교

EMA 시그널이 같은 경우