Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

Code Habit

[python] upbit-api 이용하여 비트코인 rsi 구하기 본문

카테고리 없음

[python] upbit-api 이용하여 비트코인 rsi 구하기

코드베어 2021. 8. 9. 00:07

rsi는 'Relative Strength index'의 약자로 상대강도지수를 뜻하는데 투자에서 보조지표로 많이 활용된다. 이를 upbit-api를 통해 구해보겠다. 

 

먼저 구하고자하는 기준캔들의 가격정보를 가져와야 한다.

import requests
import pandas as pd

url  ="https://api.upbit.com/v1/candles/minutes/15"
querystring = {"market" : "KRW-BTC", "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()

"KRW-BTC" 마켓의 15분봉 캔들 정보를 최근 것부터 200개 가져와서 pd.DataFrame()함수를 이용하여 테이블 형식의 데이터로 전환한다.

 

이렇게 구한 가격 정보를 기반으로 rsi를 계산한다.

ohlc = df
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
rsi = pd.Series(100-(100/(1+RS)), name="RSI")
print(rsi)

(본 포스팅은 실제 사용을 위해 코드를 남기는 것이 주목적이므로 rsi를 구하는 자세한 공식은 생략하겠다 ㅜㅜ!)

 

위 내용을 모듈로 정리하면 다음과 같다.

import requests
import time
import pandas as pd

def rsi_upbit(itv, symbol="KRW-BTC"):
    url = "https://api.upbit.com/v1/candles/minutes/"+str(itv)
    querystring = {"market" : symbol, "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_calc(df, 14).iloc[-1]
    print("현재" + str(itv) +"분 rsi :" +str(nrsi))

    return nrsi


def rsi_calc(ohlc: pd.DataFrame, period: int = 14):
    ohlc["trad_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")    


# test
while True:
    rsi_upbit(15)
    rsi_upbit(60)
    rsi_upbit(240)
    time.sleep(1)