본문 바로가기
* 디지털 노마드/Python

업비트 API를 활용하여 코인 현재가 Plot 그려보기

by lesrois 2021. 10. 16.

 

요즘 핫한 코인 시장...

코인 거래소별로 API를 활용해서 투자 모델을 만들어 보고자 한다.

 

첫 시작은 업비트이다.

업비트 개발자 센터의 레퍼런스는 아래와 같다.

Ref: https://docs.upbit.com/reference

 

업비트 개발자 센터

업비트 Open API 사용을 위한 개발 문서를 제공 합니다.업비트 Open API 사용하여 다양한 앱과 프로그램을 제작해보세요.

docs.upbit.com

 

 

업비트에서 제공하는 API는 자산/출금/입금 등의 개인정보를 제공하는 Exchange API와 시세 관련 정보를 제공하는 Quotation API로 총 두개인데, 

각각 초당/분당 제공하는 요청 회수가 제한되어 있으니 미리 체크해야 한다.

 

EXCHANGE API 요청 수 제한

  • 초당 8회, 분당 200회[주문 요청 외 API]
  • 초당 30회, 분당 900회

 

QUOTATION API 요청 수 제한

  • 초당 5회, 분당 100회REST API 요청 수 제한
  • 분당 600회, 초당 10회 (종목, 캔들, 체결, 티커, 호가별)

 


일단 먼저, 코인의 현재가를 불러들여와서 Plot을 그려보고자 한다.

 

 

1.  먼저 라이브러리를 불러온다.

 

import pandas as pd
import numpy as np
import os
import jwt
import uuid
import hashlib
from urllib.parse import urlencode
import requests
import json
import datetime

import matplotlib as mpl
import matplotlib.pylab as plt

 

 

2. 코인 값을 업비트 API로 가져오는 함수를 정의한다.

 

def get_coin_price(coin_name, min_):
    print(datetime.datetime.today())
    
    market = "KRW-" + coin_name
    url = "https://api.upbit.com/v1/candles/minutes/1"
    querystring = {"market":market,"count":min_}
    headers = {"Accept": "application/json"}
    response = requests.request("GET", url, headers=headers, params=querystring)

    sec = datetime.datetime.today().second
    microsec = datetime.datetime.today().microsecond

    min_price = pd.DataFrame(json.loads(response.text))
    min_price = min_price.sort_values('candle_date_time_kst')

    min_price['second'] = sec
    min_price['microsecond'] = microsec
    min_price['high_low'] = (min_price['high_price'] - min_price['low_price']) / min_price['trade_price']
    min_price['trade_low'] = (min_price['trade_price'] - min_price['low_price']) / min_price['trade_price']
    min_price['high_trade'] = (min_price['high_price'] - min_price['trade_price']) / min_price['trade_price']    
    
    return min_price

 

get_coin_price 함수에 코인명(영어)와 가져오고 싶은 과거의 분의 숫자 값을 변수로 넣으면,

1분 단위로 업비트 API가 해당 코인의 가격을 가져온다.

 

마지막에 넣은 컬럼들은 

  • second: 해당 초
  • microsecond: 해당 마이크로초
  • high_low: 가장 높은 가격에서 가장 낮은 가격을 뺀 것
  • trade_low: 거래 가격에서 가장 낮은 가격을 뺀 것
  • high_trade: 가장 높은 가격에서 거래 가격을 뺀 것

다만 고민인 것은, 이게 초나 마이크로초 단위가 아니라 분 단위 이므로 상당히 긴 시간.. 이라는 점이다.

quotation api는 초당 5회니까 이걸 계속 돌려서 가격을 계속 가져와서 봐야 하는건지 고민이다.

 

 

3. Plot을 그릴 함수를 정의한다.

 

def price_plt(df):
    data = df
    df['min'] = df['candle_date_time_kst'].str.split('T', expand = True)[1].str.replace(':00', '')
    
    fig, axes = plt.subplots(2, 1, figsize=(20, 10), facecolor="#c1f1f1")
    axes[0].set_title("Price", fontsize=16) # ax 중에서 0행 0열의 제목 설정
    axes[0].plot(data['min'], data['trade_price'], color='green', marker='o', linestyle='dashed', linewidth=2, markersize=5, label='trade')
    axes[0].plot(data['min'], data['high_price'], color='red', marker='o',linewidth=1.5, markersize=5, label='high')
    axes[0].plot(data['min'], data['low_price'], color='blue', marker='o',linewidth=1.5, markersize=5, label='low')
    axes[0].legend()

    axes[1].set_title("Ratio", fontsize=16) # ax 중에서 0행 0열의 제목 설정
    axes[1].plot(data['min'], data['high_low'], color='black', marker='o', linestyle='dashed', linewidth=2, markersize=5, label = 'high-low')
    axes[1].plot(data['min'], data['high_trade'], color='pink', marker='o',linewidth=1.5, markersize=5, label='high-trade')
    axes[1].plot(data['min'], data['trade_low'], color='orange', marker='o',linewidth=1.5, markersize=5, label='trade-low')
    axes[1].legend()

 

4. 데이터를 불러들여와서, 코인 현재가 Plot 그리기

 

coin_name, min_ = 'SRM',30
df = get_coin_price(coin_name, min_)
price_plt(df)

 

 

df로 정의된 데이터는 아래와 같이 나오게 된다.

 

'* 디지털 노마드 > Python' 카테고리의 다른 글

네이버 종목게시판 크롤링  (5) 2020.11.14