본문 바로가기
Python/업비트

[업비트] 실시간 RSI API Python Code

by Guardy 2021. 5. 2.
728x90

upbit upbit macd upbit python code 업비트 오토트레이딩 macd macd 계산식 

 

업비트 개발자 센터에서는 실시간으로 RSI 값을 제공하는 API가 없습니다. 대신 업비트에서 제공하는 시세 종목 조회 API를 이용해서 실시간 RSI 를 출력하는 프로그램을 짜보려고 합니다.

코인 종목 중 하나인 XRP로 테스트 해보겠습니다. 최근 캔들 200개의 정보를 가져오는 api를 이용한 코드는 다음과 같습니다.

url = "https://api.upbit.com/v1/candles/minutes/1"
querystring = {"market":"KRW-XRP","count":"200"}
response = requests.request("GET", url, params=querystring)
data = response.json()
df = pd.DataFrame(data)
df=df.reindex(index=df.index[::-1]).reset_index()

pandas의 dataframe을 이용해 리턴된 json을 담습니다.

데이터를 가져왔으니 이제 rsi  함수를 작성합니다. rsi는 다음과 같습니다.

RSI(Relative Strength Index)
주식의 기술적분석에 사용되는 보조지표로써 상대강도지수라고 부릅니다.
가격의 상승압력과 하락압력간의 상대적인 강도를 나타내는 지표입니다.

RSI의 계산공식은 다음과 같습니다.

RS = AU / AD
RSI = RS / (1 + RS) or RSI = AU / (AU + AD)

이때 AU와 AD는 다음과 같이 계산할 수 있습니다.

first AU/AD calc
 - AU : Sum of gains over the past 14 days / 14
 - AD : Sum of declines over the past 14 days / 14

second ~ AU/AD calc
 - AU : [(last AU) * 13 + now gains] / 14
 - AD : [(last AD) * 13 + now declines] / 14

이를 python code로 나타내면 다음과 같습니다.

def rsi(ohlc: pd.DataFrame, period: int = 14):
    ohlc["trade_price"] = ohlc["trade_price"]
    delta = ohlc["trade_price"].diff()
    gains, declines = delta.copy(), delta.copy()
    gains[gains < 0] = 0
    declines[declines > 0] = 0

    _gain = gains.ewm(com=(period - 1), min_periods=period).mean()
    _loss = declines.abs().ewm(com=(period - 1), min_periods=period).mean()

    RS = _gain / _loss
    return pd.Series(100 - (100 / (1 + RS)), name="RSI")

 

이제 실시간으로 rsi를 출력하는 최종 코드를 보여드리겠습니다.

import requests
import pandas as pd
import time
def rsi(ohlc: pd.DataFrame, period: int = 14):
    ohlc["trade_price"] = ohlc["trade_price"]
    delta = ohlc["trade_price"].diff()
    gains, declines = delta.copy(), delta.copy()
    gains[gains < 0] = 0
    declines[declines > 0] = 0

    _gain = gains.ewm(com=(period - 1), min_periods=period).mean()
    _loss = declines.abs().ewm(com=(period - 1), min_periods=period).mean()

    RS = _gain / _loss
    return pd.Series(100 - (100 / (1 + RS)), name="RSI")


while True:
    url = "https://api.upbit.com/v1/candles/minutes/1"
    querystring = {"market":"KRW-XRP","count":"200"}
    response = requests.request("GET", url, params=querystring)
    data = response.json()
    df = pd.DataFrame(data)
    df=df.reindex(index=df.index[::-1]).reset_index()
    nrsi = rsi(df, 14).iloc[-1]
    print("현재 rsi : "+ str(nrsi))
    time.sleep(1)

 

code rsi
upbit 실시간 차트

업비트 실시간 차트에서 보여지는 rsi 값과 똑같이 나오는 것을 확인할 수 있습니다. 도움이 되셨다면 공감버튼과 댓글 부탁드립니다!

728x90