본문 바로가기

코인/코인 개발

업비트 API를 이용한 코인 RSI 알리미 프로그램

이전 포스팅에서 업비트 API Key 발급거래량 급등 알리미를 작성해보았습니다. 지난 포스팅에서 업비트 API를 이용해 데이터를 가져오고 NaverTTSAudioPlayer를 이용해 음성으로 알림을 생성 및 재생하는 부분은 다루었으니, 이번 포스팅에서는 업비트 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. 출처: 업비트


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) 시그널로 받아들이므로, 해당 조건에 따라 알림을 보내는 식으로 프로그램을 작성해 볼 수 있겠습니다.