암호화폐 Cryptocurrency

파이선 Plotly 라이브러리에 의한 Cryptocurrency 가격 캔들 그래프 작성

coding art 2021. 7. 13. 15:51
728x90

파이선 그래픽을 지원하는 Plotly를 사용하여 암호화폐(Cryptocurrency)의 캔들 그래프를 작성해 보자. 파이선에서는 예전부터 Matplotlib 라이브러리가 폭넓게 사용되어 왔으나 최근 11년에 걸쳐 발전이 이루어진 Bitcoin을 비롯한 수많은 암호화폐의 발전이 이루어졌으며 Plotly 라이브러리가 특화되어 그래픽을 지원하고 있다.

 

Trading Cryptos part 1: How to get the Data and create interactive visualisations with Python and Plotly

https://medium.com/coinmonks/trading-cryptos-how-to-get-the-data-and-create-interactive-visualisations-with-python-and-plotly-f76424c29082

 

각 거래소별로 제공되는 앱을 사용하여 가격 변동 캔들 그래프를 실시간으로 볼 수 있으나 이를 사용자가 직접 작성한 파이선 코드로 대체해 보기로 한다.

실시간 캔들 그래프 작성을 위한 데이터는 글로벌 암호 화폐 거래소 중 가장 많은 종류의 암화화폐 코인들을 거래하면서 가장 많은 거래량을 보여주는 거래소로 알려진 바이낸스(Binance)의 오픈(public) API를 사용하기로 하자.

 

캔들 그래프 그래픽을 처리할 수 있도록 파이선 코드 편집기는 구글의 Colaboratory를 사용하도록 하며 첫 번째 셀에서 다음과 같이 한 줄 리눅스 설치 명령을 사용하여 plotly를 설치하도록 한다.

성공적으로 설치되었으면 plotly가 제공하는 캔들 그래픽 작성 명령 루틴을 편리하게 활용할 수 있다.

바이낸스 거래소의 기본적인 엔드포인트 즉 데이터 수집을 위한 창구는 https://api.binance.com 이다. 모든 엔드포인트들은 JSON 객체(데이터를 중괄나 브라켓으로 싼 형태)array(배열) 데이터를 순차상승(ascending order)형태 즉 시간 순으로 옛 데이터 먼저 최신 데이터 나중 순서로 회신해 준다. 아울러 모든 시간 관련 데이터는 millisecond 단위를 사용한다.

 

url 주소 박스에서 통신 데이터 문자 관찰이 가능한 GET 엔드포인트들에 대해서는 파라메터들이 query 문자열로 송신해야 한다.

켄들 데이터를 GET 할 수 있도록 엔드포인트를 다음과 같이 사용한다.

이 엔드포인트에 대한 query 문자열에 지정해야 하는 필수 필드는 해당 암호화폐 단위 및 간격(시간 프레임: , 시간 등)이다. 예를 들어 비트코인의 단위는“BTC”이며 이더리움의 경우는 “ETH”가 된다. 시간 간격의 기본 값은 500이지만 "limit"을 사용하여 이 값을 최대 1000까지 확장할 수 있다. 이번 예제에서는 1시간 간격으로 암호화폐(Etherium Classic:ETC)에 대한 값을 가져오게 될 것이다.

이렇게 GET 통신 명령을 이용해서 엔드포인트로부터 JSON 데이터들을 수신할 수가 있다. 회신된 JSON 형태의 데이터는 인간이 보기에는 불편하므로 Chrome에서 JSON Viewr를 설치하여 출력하면 다음과 같다. 시간정보,시가,고가,저가,종가,거래량,종가 시간 등의 정보를 포함하고 있음을 알 수 있다.

JSON Viewer에 출력된 캔들의 데이터의 시가, 고가, 종가, 저가는 상승하락에 따라 다음과 같은 형태를 보여준다.

헤더 영역에 라이브러리를 불러오자. pandas는 컬럼형 csv 데이터 파일을 읽는다. requests는 파이선에서 http 사용 지원 작업을 수행하며 jsonJSON객체를 파이선 객체로 또는 그 반대의 작업을 지원해 준다.

이미 웹 상에서 GET 통신 명령을 이용해서 엔드포인트로부터 JSON 데이터들을 수신할 수가 있었는데 이 작업 지원을 위해 엔드포인트에 대한 URL을 작성하는 함수를 준비하여 만들도록 하자. 즉 웹상의 url에 직접 써넣어도 되지만 파이선 코드에서는 다음과 같은 함수를 호출함으로서 동일한 효과를 볼 수 있다.

다음의 코드에서 BTC는 비트코인을 뜻한다. 다른 알트 코인을 출력하려면 예를 들어 이더리움 클래식을 출력하고자 하면 ETC 로 대체하면 된다.

다음과 같이 url_build() 함수를 사용 http GET 통신에 의해 엔드포인트로부터 JSON 데이터를 반환 받도록 하고 반환받은 데이터의 크기 즉 길이를 출력하자.

데이터를 pandas 로 첫 번째와 두 번째 컬럼 데이터의 shape을 출력해 보자.

pandas DataFrame df를 사용하여 종가를 라인 그래프로 출력해 보자. 이 출력 결과는 Plotly가 아닌 Colaboratory에 디폴트로 설치되어 있는 Matplotlib 라이브러리를 사용했음에 유의하자.

반환된 데이터 길이는 500개이며 12개 컬럼으로 이루어져 있음을 알 수 있다.

12개 컬럼 명을 사용하여 셸에 출력한 결과이다.

Plotly를 사용하여 상호작용이 가능한 암호화폐 가격 캔들형 그래프를 작도해보자. 상호작용은 Javascrit 방식으로서 커서를 캔들에 위치시키면 작은 대화 창이 나타난다.

오늘 날짜가 2021713일 오후 2시경이지만 미국 기준이므로 712일 저녁 8시 현재 ETC의 가격이 47.689$ 임을 알 수 있다.

가격 그래프에서 시즌 최고가를 기록했던 영역을 다음과 같이 줌(zoom) 해보자.

거래량 챠트를 하단에 작도한고 슬라이더를 사용하여 작도 범위를 조절해 보자. fig.update_layout() 명령에서 파라메터 xaxis_rangeslider_visible=True 로 설정한 후 코드를 실행한다. 그래프 하단의 거래량 챠트에서 슬라이더를 홀딩하여 움직여 보자.

 

#cryptograph_etc.ipynb

!pip install plotly  # plotly 설치 명령을 첫째 셀에서 실행

#-------------------------------------------------------------------------------------------------------

import pandas as pd  #나머지 전체 2번째 셀에서 실행

import requests 

import json

 

def url_build(symbol="ETCUSDT"interval="1m"):

 url_base = "https://api.binance.com"

 url_endpoint = "/api/v1/klines"

 url_final = url_base + url_endpoint + "?symbol={}&interval={}".format(symbol,interval)

 return url_final

 

response = requests.get(url_build())

response_dict = json.loads(response.text)

print("Standard values retrieved: "len(response_dict))

 

df = pd.DataFrame.from_dict(response_dict)

print("The len of the dataframe is: {} and we have {} columns".format(df.shape[0], df.shape[1]))



candle_columns = ["Open time",

 "Open",

 "High",

 "Low",

 "Close",

 "Volume",

 "Close Time",

 "Quote asset volume",

 "Number of Trades",

 "Taker buy base asset volume",

 "Taker buy quote asset volume",

 "Ignore."

 ]

df.columns = candle_columns

df.head(2)

 

df['Open time'] = pd.to_datetime(df['Open time'].astype('int'),unit='ms')

df[df.columns[1:5]] = df[df.columns[1:5]].astype("float")

df[df.columns[:5]].info()



import plotly.graph_objects as go

 

fig = go.Figure(data=[go.Candlestick(x=df['Open time'],

 open=df['Open'],

 high=df['High'],

 low=df['Low'],

 close=df['Close'])])

fig.update_layout(xaxis_rangeslider_visible=False,title="Our first Plotly Graph for Etherium Classic")

fig.show()

#--------------------------------------------------------------------------------------------------------------