이전 포스팅에서 업비트 API Key 발급 및 거래량 급등 알리미를 작성해보았습니다. 지난 포스팅에서 업비트 API를 이용해 데이터를 가져오고 NaverTTS 및 AudioPlayer를 이용해 음성으로 알림을 생성 및 재생하는 부분은 다루었으니, 이번 포스팅에서는 업비트 API를 이용해 가져온 캔들 데이터를 이용해 RSI(Relative Strength Index)를 계산하는 코드를 파이썬으로 작성해보도록 하겠습니다.
pandas 라이브러리를 이용해 업비트 API를 이용해 가져온 캔들 데이터를 DataFrame으로 변경해줍니다.
import pandas as pd
rsi_periods = 14
unit = 240 # 4 hours
candles = upbit.candles('KRW-BTC')
min_candles = candles.minute(unit=unit, count=200)
df = pd.DataFrame(data={
'open': [x.opening_price() for x in min_candles],
'close': [x.trade_price() for x in min_candles],
'high': [x.high_price() for x in min_candles],
'low': [x.low_price() for x in min_candles],
})
캔들 데이터를 가져오기 위한 코드는 이전 포스팅에서 사용한 코드를 재사용했습니다. RSI periods는 기본값 14로, 캔들 크기는 4시간(=240 minutes) 봉을 기준으로 비트코인 데이터(업비트 원화 코드 'KRW-BTC')를 예제로 사용하였습니다.
DataFrame의 shapes은 다음과 같습니다.
open close high low
0 42836000.0 42673000.0 43394000.0 42060000.0
1 42673000.0 43229000.0 43327000.0 42410000.0
2 43230000.0 43198000.0 43500000.0 42617000.0
3 43192000.0 42676000.0 43682000.0 42565000.0
4 42675000.0 43298000.0 43400000.0 42581000.0
.. ... ... ... ...
195 38977000.0 38655000.0 38977000.0 38297000.0
196 38655000.0 38381000.0 38845000.0 38327000.0
197 38381000.0 38713000.0 38812000.0 38340000.0
198 38741000.0 37885000.0 38901000.0 37800000.0
199 37898000.0 37920000.0 38061000.0 37864000.0
이제 RSI를 DataFrame을 사용해 다음 함수를 이용해 계산할 수 있습니다.
def rsi(df, periods=14, ema=True):
close_delta = df['close'].diff()
up = close_delta.clip(lower=0)
down = -1 * close_delta.clip(upper=0)
if ema: # Exponential Moving Average
ma_up = up.ewm(com=periods - 1, adjust=True, min_periods=periods).mean()
ma_down = down.ewm(com=periods - 1, adjust=True, min_periods=periods).mean()
else: # Simple Moving Average
ma_up = up.rolling(window=periods).mean()
ma_down = down.rolling(window=periods).mean()
rsi = ma_up / ma_down
rsi = 100 - (100 / (1 + rsi))
return rsi
RSI 계산 시에는 종가('close')를 기준으로 구간별 상승/하락 차이와 그 평균값을 이용합니다. 위 함수에서는 기본값으로 지수 이동 평균선(EMA)을 사용하고 있지만, 단순 이동 평균선(SMA)을 사용할 수도 있습니다.
RSI 계산 결과는 다음과 같습니다.
0 NaN
1 NaN
2 NaN
3 NaN
4 NaN
...
195 35.857965
196 32.699008
197 39.637964
198 31.041927
199 31.716033
이제 최근 RSI 값인 가장 마지막의 결과를 얻기 위해 다음과 같이 할 수 있습니다.
df_rsi = rsi(df)
print(df_rsi[-1:].values[0])
일반적으로 해당 값이 20~30 이하인 경우 과매도(Oversold), 70~80 이상인 경우 과매수(Overbought) 시그널로 받아들이므로, 해당 조건에 따라 알림을 보내는 식으로 프로그램을 작성해 볼 수 있겠습니다.
'코인 > 코인 개발' 카테고리의 다른 글
업비트 API와 Python TA-Lib를 이용한 캔들 패턴 인식(Candle Pattern Recognition) (0) | 2021.07.16 |
---|---|
업비트 API와 Python TA-lib를 이용한 스토캐스틱, RSI 등 보조 지표 활용 (0) | 2021.07.15 |
파이썬으로 캔들차트 그리기 (0) | 2021.07.10 |
업비트(Upbit) API를 이용해 프로그램 개발 시 주의 사항 (1) | 2021.07.09 |
코인 거래량 급등 텔레그램(Telegram) 알림 봇 파이썬(Python)으로 만들기 (7) | 2021.07.08 |