본문 바로가기
Python/업비트

[업비트] 실시간 OBV API Upbit Python Code

by Guardy 2021. 9. 9.
728x90

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

업비트 개발자 센터에서는 실시간으로 obv 값을 제공하는 API가 없습니다.

이번 글에서도 저번글과 마찬가지로 업비트에서 제공하는 시세 종목 조회 API를 이용해서
실시간 OBV를 출력하는 프로그램을 짜보려고 합니다.

지난글 보러가기 "실시간 RSI API Ubit Python Code"

OBV란?

On Balance Volume 으로 거래량 지표입니다. 조셉 그랜빌에 의해 탄생한 수식으로 매수세가 많으면 주가가 상승하고, 매도세가 많으면 하락한다는 원리와 더불어서 거래량은 주가에 대해 선행한다라는 원리로 만든 것입니다.즉 상승한 날의 거래량 합계 - 하락한 날의 거래량 합계로 이를 누적 집계한 뒤 도표화한 것입니다.OBV 계산방법은 다음과 같습니다.

if ) now tradeprice > prev tradeprice -> now OBV = prev OBV + now volume
else if) now tradeprice  < prev tradeprice  -> now OBV = prev OBV - now volume
else if) now tradeprice  = prev tradeprice : now OBV = prev OBV

 

이제 이 OBV를 Python code로 바꿔보겠습니다.

import pandas as pd 
import requests
def OBV(tradePrice, volume):
    obv = pd.Series(index=tradePrice.index)
    obv.iloc[0] = volume.iloc[0]
    
    for i in range(1,len(tradePrice)):
        if tradePrice.iloc[i] > tradePrice.iloc[i-1] : 
            obv.iloc[i] = obv.iloc[i-1] + volume[i]
            
        elif tradePrice.iloc[i] < tradePrice.iloc[i-1] :
            obv.iloc[i] = obv.iloc[i-1] - volume[i]
            
        else:
            obv.iloc[i] = obv.iloc[i-1]
            
    return obv

if __name__ == "__main__":
    url = "https://api.upbit.com/v1/candles/days"
    querystring = {"market":"KRW-BTC","count":"200"}

    response = requests.request("GET", url, params=querystring)

    data = response.json()

    df = pd.DataFrame(data)
    df=df.iloc[::-1]
    
    obv = OBV(df['trade_price'],df['candle_acc_trade_volume'])
    print(obv[0])

그런데 결과로 나온 값과 현재 업비트 실시간 obv가 다른 것을 확인할 수 있습니다.

이유는 obv의 경우 rsi와 달리 특정 개수만을 보는게 아닌 계속해서 쌓이는 형태로 이루어져있기 때문에 차트에 존재하는 캔들 개수에 따라서 달라지기 때문입니다.

하지만 obv의 변화값을 이용할 수 있기 때문에 쓸데없는 코드는 아니라고 생각합니다.

원하시는 지표의 코드가 있다면 댓글로 남겨주세요. 도움되셨으면 공감이나 댓글 부탁드립니다.

728x90

'Python > 업비트' 카테고리의 다른 글

Cannot find module 'sass' 해결법  (1) 2021.09.14
[업비트] 실시간 MACD API Python Code  (2) 2021.09.09
[업비트] 실시간 RSI API Python Code  (2) 2021.05.02