코인 RSI 알림 설정
바이낸스 API로 가져올 수 있는가?
마켓 데이터 항목에서 RSI는 찾아볼 수 없었습니다. 저번 거래량의 경우에는 API문서를 통해 response 받을 수 있다는 것을 확인했지만 아마 이제 거의 모든 지표는 직접 만드셔야 할 것입니다. 제 블로그에 '지표 알림 봇' 카테고리를 만든 이유이기도 하며, 앞으로 다른 지표들도 다루도록 하겠습니다.
RSI 공식
RSI = RS / ( 1+ RS ) *100
일정기간 동안
AU : 가격이 전 캔들 가격보다 상승한 캔들의 상승분들의 평균값
AD : 가격이 전 캔들 가격보다 하락한 캔들의 하락분들의 평균값
RS : AU / AD
공식을 보니 캔들의 시세로만 이루어진 지표였네요. 그러므로 Kline에서 종가에 해당하는 'close'열의 정보만 가져온다면 충분히 만들 수 있는 지표라고 볼 수 있습니다. 위의 사진에서 24시간 변화량이 있어 기간은 6 캔들부터 25 캔들까지 다양하게 변화를 줄 수 있고 자신의 투자에 맞는 기간으로 설정하시면 될 것 같습니다. 매개변수를 설정할 기간으로 넣으면 좋겠네요.
그런데 위 공식은 위키백과가 출처인 자료이며 공식 그대로 계산해 본 결과 바이낸스에 나타난 RSI값과 다르다는 것을 알 수 있었습니다. 아마 최근캔들일수록 높은 가중치를 부여하는 방식인 지수가중이동평균을 AU와 AD 식에 사용한 듯합니다. 그 계수가 얼마인지 알려주는 곳을 찾기 힘들었기 때문에 골치 아프게도 직접 비교해 가며 구하였습니다. AU와 AD를 구할 때 사용하는 평균법은 Welles Wider Moving average를 사용합니다. 지수가중이동평균과 같이 가중치가 지수적으로 분포되어 있으며 일반적인 지수이동평균 EMA와는 계수가 다릅니다.
EMA(지수이동평균)
EMA = price(t) * K + EMA (y) * (1-K)
price(t): 오늘의 종가
EMA(y): 어제의 EMA
K(가중승수) = 2 / (period+1)
위 공식은 일반적인 지수이동평균(EMA)의 계산공식입니다.
Welles Wider MA
Welles Wider MA = price(t) * K + WMA(y) * (1-K)
price(t): 오늘의 종가
WMA(y): 어제의 Welles Wider MA
K(가중승수) = 1 / period
위 공식은 RSI의 AU와 AD를 구할 때 사용하는 Welles Wider MA의 계산공식입니다. EMA와 비교해 보시면 K(가증승수)의 식이 다르다는 것을 볼 수 있습니다. 그러므로 파이썬 메서드 중 EMA를 구하는 ewm()를 사용할 때 가증승수에 해당하는 alpha를 a = 1 / period와 같은 형식으로 넣어주시면 됩니다.
전체코드
import binance as bn
import threading
def rsi(symbol, interval, period):
try:
close = bn.get(symbol, interval)['close']
delta = close.diff(1)
#close 행과 행의 차이를 구합니다. 간격은 1입니다.
gain = delta.where(delta > 0, 0)
loss = -delta.where(delta < 0, 0)
#gain(상승폭)은 delta가 양수면 delta를 그대로 들여오고 나머지는 0으로 반환합니다.
#loss의 경우 반대로 하되 음수가 되므로 앞에 마이너스 부호를 붙여줍니다.
c = period - 1
a = 1 / period
#지수가중이동평균을 구하기 위해 필요한 계수입니다. 둘 중 하나만 사용하시면 됩니다.
#com = c , alpha = a
AU = gain.ewm(alpha=(a)).mean()
AD = loss.ewm(alpha=(a)).mean()
#ewm().mean()는 지수가중이동평균을 구하는 함수입니다. 매개변수로 a값을 넣어줍니다.
RS = AU / AD
RSI = round((RS / (1 + RS)) * 100 ,2)
return RSI
except Exception as e:
if str(e).startswith('429'):
bn.tel_text(symbol + " " + str(e))
else:
pass
tickers = bn.tickers("all")
def run():
for i in tickers:
RSI = bn.rsi(i, "5m", 12)
RSI998 = RSI.iloc[-2]
if RSI998 < 20:
bn.tel_text(i + " RSI: " +str(RSI998))
threading.Timer(270, run).start()
run()
조건식은 5분 봉 기준 RSI값이 20 이하로 마감되면 만족하도록 설정하였습니다. rsi함수는 나중에 binance.py에 추가하면 반환값이 RSI를 쉽게 불러올 수 있습니다. 매개변수는 (symbol, interval, period)로 심벌과 인터벌은 문자열로 넣어주시면 됩니다.
SXP와 CTK의 RSI값이 각각 18.76, 18.32로 20 이하 조건에 만족하여 알림이 왔습니다.
SXP코인으로 RSI를 확인하였더니 18.7591, 알림으로 온 값은 18.76으로 반올림을 한다면 정확히 일치하였습니다.
후기
이번에 거래량을 제외하고 처음으로 지표를 다루어 보았는데 이해하는 데 있어서 만만치가 않았습니다. 솔직히 대부분 지표들이 이동평균선(MA)처럼 쉬울 줄 만 알고 접근하였는데 저의 부족함만 느꼈던 포스팅이었습니다. "지수가중이동평균" 이름부터 이해가 잘 안 되고 어디에 가중치를 주었는지, 수치는 어느 정도여야 하는지 정말 하나도 모른 상태에서 진행하다 보니 많이 지치네요. 단순히 30 이하는 과매도, 70 이상은 과매수로만 알고 있던 간단한 지표인 줄 알았던 RSI를 자세히 알게 되는 시간이었습니다. 매매하시는 분들이라면 한 번쯤은 자주 사용하는 지표들을 깊게 파고드시는 것을 추천드립니다.
'기술 > 지표 알림' 카테고리의 다른 글
바이낸스 롱/숏 비율 알림 받기 (429) | 2023.04.16 |
---|---|
MACD 알림 설정하는 방법 (415) | 2023.04.13 |
지수이동평균(EMA) 가중이동평균(WMA) 계산 (457) | 2023.04.11 |
이동 평균(MA) 골든크로스 알림 (398) | 2023.04.09 |
코인 거래량 알림 (415) | 2023.04.07 |
댓글