シストレどうですか

  Algorithmic Trading for Dummies

仮想通貨 API 解説編 その4 ー GMOコインのAPIを使って情報を取得する

前回の流れでGMOコインもPublic APIがあるので試してみます。

jantzen.hatenablog.com


APIドキュメント


マニュアルを解読

日本の会社ですから当然ですが、日本語のマニュアルなのでさらっと流していきます。
(逆に言うと英語のマニュアルはないようです。)

api.coin.z.com

概要

https://api.coin.z.com/docs/#outline

エンドポイントはいつもの通りPublic APIを使いますので”https://api.coin.z.com/public”。
アクセスの制限についてはPublic APIについての記載がありませんのでよくわかりません。ただPublic WebSocket APIの場合の1秒間に1回とあり、また”その他として当社システムへ負担をかけている可能性がある”と判断された場合は制限させていただく場合があるとの事です。

Public API

https://api.coin.z.com/docs/#public-api

APIキーなしにアクセスできるエンドポイントはPublic APIの部分になります。

例として最新レートの取得ですが、引数や戻り値の説明と指定できる値もすべて表示されており、また右端にはプログラミング言語別のサンプルがでていますので、大変わかりやすい内容となっています。

f:id:jantzen:20220116104833j:plain


サンプルプログラム


ではいつものように実際に試してみます。
マニュアルにRequest exampleもありますので丸ごとコピーで動きます。

またサンプルをコーディングするにあたり情報の取得(GET)を行うだけですのでエンドポイントを呼び出した際に発生するエラーの例外処理は特に行いません。

取引所ステータス (GET /public/v1/status)

前回と同様にサーバーが動いているか確認してみます。

import requests
  
endPoint = 'https://api.coin.z.com/public'
path     = '/v1/status'
  
response = requests.get(endPoint + path)
  
print(response.json())
print(response.json()['data']['status'])

戻り値

{'status': 0, 'data': {'status': 'OPEN'}, 'responsetime': '2022-01-13T22:51:43.629Z'}
OPEN

OPEN以外のステータスもマニュアルに記載があります。MAINTENANCE, PREOPEN

最新レートの取得 (GET /public/v1/ticker)

次は取引できる最新レートの取得をしてみます。
数も少ないのですべての銘柄を出力してみます。

import requests
  
endPoint = 'https://api.coin.z.com/public'
path     = '/v1/ticker'
  
response = requests.get(endPoint + path)
r = response.json()['data']
j = 0
for i in r:
  print("symbol: %s ask: %s bid: %s" %(r[j]['symbol'], r[j]['ask'], r[j]['bid']))
  j += 1

戻り値

symbol: BTC ask: 4928649 bid: 4925650
symbol: ETH ask: 379000 bid: 378880
symbol: BCH ask: 44190 bid: 43991
symbol: LTC ask: 16850 bid: 16801
symbol: XRP ask: 88.724 bid: 88.723
symbol: XEM ask: 13.64 bid: 13.608
symbol: XLM ask: 30.172 bid: 30.1
symbol: BTC_JPY ask: 4925738 bid: 4925394
symbol: ETH_JPY ask: 378777 bid: 378505
symbol: BCH_JPY ask: 44184 bid: 44030
symbol: LTC_JPY ask: 16870 bid: 16816
symbol: XRP_JPY ask: 88.684 bid: 88.549
symbol: XYM ask: 22.3 bid: 22.256
symbol: MONA ask: 129.999 bid: 128.519

マニュアル通り、現物取引9種類・レバレッジ取引5種類の計14種類ですね。

KLine情報の取得 (GET /public/v1/klines)

いわゆるろうそく足のデータですね。KlineのKは何を意味しているのでしょうか?
私の中でKLineと言えば川崎汽船というイメージですが・・・。

例としてBTCの2021年の日足を出してみます。

import requests
import json
    
endPoint = 'https://api.coin.z.com/public'
path     = '/v1/klines?symbol=BTC&interval=1day&date=2021'
  
response = requests.get(endPoint + path)
print(json.dumps(response.json(), indent=2))

これを実行するとマニュアル通りのフォーマットの値が戻りました。
日足の場合は年指定ですので該当の年の1年分のデータが戻ってくるようです。ですから"date=2022"でリクエストすると2022年の1月1日から今日までの値が戻ります。今日までの1年間のような場合は2回リクエストして2年分を結合しないといけないですね。
同様に1時間足だと"date=20220101"のように1日分しか指定できないので1月1日の24本分のデータが返ってきます。

ちなみにopenTimeはUTC時間になっていますので2021年指定の場合でも初めのデータが2020年12月31日から始まりますが、日本時間の6時が基準のようなので日本時間に変換すると2022年1月1日6:00:00から始まり該当年だけのデータになります。

ろうそく足グラフの描写

いつものようにmplfinanceを使ってろうそく足のグラフも書いてみます。

import requests
import pandas as pd
import mplfinance as mpf
        
#KLine情報の取得
endPoint = 'https://api.coin.z.com/public'
path     = '/v1/klines'
params = {
          'symbol': 'BTC',
          'interval': '1day',        
          'date' : 2021
        } 
response = requests.get(endPoint + path, params)
  
#データフレームの編集
df = pd.DataFrame(response.json()['data'])  
df = df.astype(float)
#UNIX時間(ミリ秒)を日本時間に変換
df['openTime'] = pd.to_datetime(df['openTime'].astype('datetime64[ms]'), utc=True).dt.tz_convert('Asia/Tokyo')
#DataFrameの時刻用の列をDateTimeインデックスに変換
df.set_index('openTime', inplace=True)
#Y軸を万円単位にする
df = df / 10000
  
#チャートの表示
mpf.plot(df,type='candle',  title='\nBTC-1day\n(2021)', ylabel='Price (10,000yen)', style='yahoo')

実行すると以下のようなグラフが表示されました。

f:id:jantzen:20220116101654j:plain:w400

グラフを表示させるとBTCの様に100万単位の桁数ですとY軸が指数表示されてしまうので値を10,000で割って万円単位表示にしてあります。

ろうそく足グラフの描写ーその2

1時間足以下のデータは1日分の指定してかできないようですので、From-Toで指定した期間のろうそく足を取得するプログラムを作成してどうなるか試してみます。
またこの連続した呼び出しを行うことによりサーバー側から拒否されるかどうかも確認してみます。

以下の例はBTCの1時間足のデータを2021年7月15日から2022年1月15日までの半年間分取得する場合です。

#KLine情報の取得(期間指定)
import requests
import pandas as pd
import mplfinance as mpf
from datetime import datetime, timedelta
  
endPoint = 'https://api.coin.z.com/public'
path     = '/v1/klines'
symbol = "BTC"
interval= "1min"
#期間の指定
from_date = datetime(2021,7,15)
to_date = datetime(2022,1,15)
#日数計算
period = to_date - from_date 
loop = period.days + 1

#エンドポイントの呼び出し
df = pd.DataFrame()
for i in range(loop):
    
  date = (from_date + timedelta(days=i)).strftime('%Y%m%d')
  params = {
            'symbol': symbol,
            'interval': interval,        
            'date' : date
          } 
  response = requests.get(endPoint + path, params)
  df = df.append(response.json()['data'])  
  
#データフレームの編集
df = df.astype(float)
#UNIX時間(ミリ秒)を日本時間に変換
df['openTime'] = pd.to_datetime(df['openTime'].astype('datetime64[ms]'), utc=True).dt.tz_convert('Asia/Tokyo')
#DataFrameの時刻用の列をDateTimeインデックスに変換
df.set_index('openTime', inplace=True)
#Y軸を万円単位にする
df = df / 10000
#チャートの表示
title = "\n" + symbol + "-" + interval + "\nFrom-To: " + from_date.strftime('%Y/%m/%d') + " - " + to_date.strftime('%Y/%m/%d')
mpf.plot(df,type='candle',  title=title, ylabel='Price (10,000yen)', style='yahoo')

実行すると問題なくグラフ表示までできました。

f:id:jantzen:20220117102821j:plain:w400

同じプログラムを使って、同じ期間で1回のデータ量のさらに多い1分足も試してみましたが問題なく取得する事ができました。


まとめ


今回もいくつかのPublic APIを試してろうそく足のグラフを表示させてみました。

GMOコインのAPIドキュメントは、指定できる引数の値やリクエスト/レスポンスの例がエンドポイント毎に明示されているのでとてもわかりやすいです。
KLine(ろうそく足)情報の取得で指定できる日付が1日分または1年分しかありませんが、好きな期間を指定できるプログラムを組んで該当期間分の日付を指定してリクエストすれば問題なくデータが取得できます。
日本の取引所なのでアルトコインの情報は少ないですが円貨で価格を取得できるので日本円ベースでテクニカル分析するような場合のデータ収集時にとても便利なAPIです。