요즘 핫한 코인 시장...
코인 거래소별로 API를 활용해서 투자 모델을 만들어 보고자 한다.
첫 시작은 업비트이다.
업비트 개발자 센터의 레퍼런스는 아래와 같다.
Ref: https://docs.upbit.com/reference
업비트에서 제공하는 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 |
---|