シストレどうですか

  Algorithmic Trading for Dummies

仮想通貨 API 解説編 その5 ー Liquid by QuoineのAPIを使って情報を取得する

ついでのついでですのでLiquid by QuoineもPublic APIがあるので試してみます。


APIドキュメント


マニュアルを解読

今回も日本国内で取引できる会社ですので日本語のマニュアルがあります。
(英語のマニュアルも用意されています。)

https://document.liquid.com 日本語
https://developers.liquid.com 英語

API制限

https://document.liquid.com/limit

アクセスの制限についてはPublicもPrivateも関係なく5分間に最大600リクエストの呼び出し制限です。 一部のエンドポイントは それよりも厳しい制限がかかっているものもあります。Public APIでは板情報の取得が 5分間に300回までと半分に制限されています。

もう少し細かい説明がブログページにもありました。

blog.liquid.com

Public API

https://document.liquid.com/rest-api-public

APIキーなしにアクセスできるエンドポイントはPublic APIの部分になります。 マーケット情報・板情報・約定情報(全体)の3つのデータを取得できるようですが、いつも試しているろうそく足情報の取得はできないようですね。

ろうそく足の情報が取れないのは残念だと思ったのですが、ろうそく足が取得できないのはなんかおかしいと思い英語版のAPIドキュメントをよく見てみたらこちらの方にはろうそく足の取得用のエンドポイントの説明がありました。
https://developers.liquid.com/public-rest-api/product-data#chart-data-k-line

サーバーのステータスについては別の項で説明があり、エンドポイント用のURLも別に用意されています。

status.liquid.com

例としてマーケット情報の取得ですが、エンドポイントの例や引数、戻り値の説明が簡単に書かれています。 parameterの説明が簡単なのでproduct idの一覧がわかりませんが、idを指定しないとすべて戻るようですので、これがあれば指定できるidもわかりますのでのちほど試してみます。

f:id:jantzen:20220202094800j:plain


サンプルプログラム


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

取引所ステータス (GET https://status.liquid.com/api/v2/summary.json)

前回と同様にサーバーが動いているか確認してみます。
内容についてはPublic APIとは違う場所に説明がありますのでそちらをみてみます。
https://status.liquid.com/api/

結構説明が細かくなされていてサーバーのステータスの確認をするにも他社と比べてかなり細かい情報がとれるようになっているようですが、今回はPublic APIを使うだけなのでPublic API用のサーバーのステータスの部分のみを出力してみます。

import requests
      
URL = "https://status.liquid.com/api/v2/summary.json"
response = requests.request("GET", URL)
r = response.json()
  
print(r['components'][1]['name'], ":", r['components'][1]['status'])

戻り値

REST API and Exchange : operational

マーケット情報の取得 (GET https://api.liquid.com/products)

次はマーケット情報の取得ということで最新レートの取得をしてみます。
マニュアルの例ではプロダクトIDを指定していますが、IDをつけないでリクエストするとすべての銘柄が出力されるので、どんなIDがあるか調べるためにもすべて出力してみます。
下の例では、データ量が多いので円貨で取引可能な仮想通貨のみを表示してみました。

import requests
     
#マーケット情報
URL = "https://api.liquid.com"
endpoint = "/products"
  
url = URL + endpoint
response = requests.request("GET", url)
r = response.json()
  
for i in r:
  if i['quoted_currency'] == "JPY": # and i['disabled'] == False:
    print(i['id'], i['currency_pair_code'], i['base_currency'], i['quoted_currency'])

戻り値

709 GYENJPY GYEN JPY
846 XLMJPY XLM JPY  
847 LTCJPY LTC JPY  
848 BATJPY BAT JPY  
436 ONTJPY ONT JPY  
41 BCHJPY BCH JPY   
29 ETHJPY ETH JPY   
83 XRPJPY XRP JPY   
5 BTCJPY BTC JPY    
50 QASHJPY QASH JPY 

10種類のコードが出てきました。
これでコードがわかりましたので次のエンドポイントで使ってみます。

また、プロダクトID一覧についてはFAQ・サポートのリンクから取り扱い通貨ペアの一覧の中にIDも表示されていましたので、ここからでもわかります。 https://support-jp.liquid.com/hc/ja/articles/360032764511

サンプルで出したものよりリンク内の一覧のほうが数が少ないですが、テストなので気にしないでおきます。

板情報取得 (GET https://api.liquid.com/products/{id}/price_levels)

今回はろうそく足情報の代わりに板情報を取得してみます。(デフォルト値では売買それぞれ20個ずつ取得可能。)
マーケット情報エンドポイントで使えるコードがわかったので、今回はイーサリアム(id:29)の板情報を取得してみます。

import requests
import json
    
#板情報取得 
ID = 29    #イーサリアム
URL = "https://api.liquid.com"
endpoint = "/products/%s/price_levels" %ID
  
url = URL + endpoint
response = requests.request("GET", url)
r = response.json()
  
print(json.dumps(r, indent=2))

戻り値

{
  "buy_price_levels": [
    [
      "292907.00000",
      "0.00873734"
    ],
    [
      "292906.00000",
      "0.90700000"
    ],
           ≀(省略)
    [
      "291746.00000",
      "10.00000000"
    ],
    [
      "291716.00000",
      "10.00000000"
    ]
  ],
  "sell_price_levels": [
    [
      "293283.00000",
      "1.06000000"
    ],
    [
      "293359.00000",
      "1.98000000"
    ],
           ≀(省略)
    [
      "295288.00000",
      "1.95065096"
    ],
    [
      "295379.00000",
      "3.58000000"
    ]
  ],
  "timestamp": "1643412988.525327012"
}

売り買い別の価格と数量を20個ずつ取得する事が出来ました。

板情報を表にする

いつものようにグラフも書いてみようかと思いましたが、板情報なので表(テーブル)を作成してみます。 ただmplfinanceですと表が書けそうにないので今回はplotlyで試してみます。

表の形式は真ん中に価格を置いて左右に売買数量を表示するような表を作ってみたいと思います。
また単純な表だと面白くないので最終取引価格を加えてみたり色を付けたりもしてみます。

import requests
import pandas as pd
import plotly.graph_objects as go
    
#最終取引価格の取得
ID = 29 #ETH
URL = "https://api.liquid.com"
endpoint = "/products/%s" %(ID)
url = URL + endpoint       #マーケット情報
response = requests.request("GET", url)
r = response.json()
last_traded_price = float(r['last_traded_price'])    #最終取引価格
base_currency = r['base_currency']  #換算通貨
symbol = r['symbol']    #通貨コード
  
#板情報取得
endpoint = "/products/%s/price_levels" %ID
url = URL + endpoint
response = requests.request("GET", url)
r = response.json()
  
#取得した板情報をデータフレームで編集
df_buy = pd.DataFrame(r['buy_price_levels'], columns=['Price' ,'B_Volume'])
df_buy['Color'] = 'lightgreen'  #買=緑
df_sell = pd.DataFrame(r['sell_price_levels'], columns=['Price' ,'S_Volume'])
df_sell['Color'] = 'lightpink' #売=赤
  
#売買別のデータフレームを結合
df = pd.concat([df_buy, df_sell])
df = df[['S_Volume', 'Price', 'B_Volume', 'Color']]
df = df.astype({'B_Volume':float,  'Price':float, 'S_Volume':float})
df.sort_values(by=['Price'], ascending=False, inplace=True)
  
#数量が10以上の場合は色付け
df['B_Color'] = 'black'
df.loc[df['B_Volume'] >= 10, 'B_Color'] = 'red'
df['S_Color'] = 'black'
df.loc[df['S_Volume'] >= 10, 'S_Color'] = 'red'
  
#数値の編集  
df = df.round(2)
df.fillna('', inplace=True)    #NaNを消す
  
#テーブルの作成・表示処理 (plotly)
title = "<b>{0} 最終取引価格: {1}{2:,d}</b>" .format(base_currency, symbol, int(last_traded_price))
fig = go.Figure(
          layout=dict(width=500, title=title),
          data=[go.Table(
                  columnwidth = [150,200,150],
                  header=dict(
                    values=['売数量', '価格(円)', '買数量'],
                    fill_color='orange',
                    line_color='white',
                    font_size=14,
                    font_color='white',
                    align='center'
                  ),
                  cells=dict(
                    values=[df['S_Volume'], df['Price'], df['B_Volume']],
                    fill_color=['whitesmoke', df['Color'], 'whitesmoke'],
                    line_color='white',
                    font_color=[df['S_Color'], 'black', df['B_Color']],
                    font_size=14,
                    format = [[None], [','],[None]],
                    align=['right','center','left']
                  )
                )
          ]
      )
  
fig.show()

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

f:id:jantzen:20220204164520j:plain:w400

LIQUIDのマーケット情報画面と比較してみました。どんどん情報が変わってしまうので完全一致でスクショが取れませんでしたがほぼ内容が一致していることが確認できました。

f:id:jantzen:20220204165008j:plain:w500


まとめ


APIドキュメントの内容としては、前回のGMOコインより簡素にまとめられていますが、少し慣れている人であれば問題なく理解できると思います。
ただ、ろうそく足の取得情報が英語版にしか掲載されていない等日本語版だと一部のエンドポイントしか説明がなかったのが少し残念でした。日本国内では使えないエンドポイントは省略してあるとかなのでしょうか? (日本語があるとこっちしか読まない人多いと思うので。)
また同じエンドポイントでも英語版のほうがちょっとだけですがより詳しく解説していますので、英語版を主体に参照したほうがわかりやすいと思いました。
英語版のPublic APIの説明部分は、以下のリンクになります。

developers.liquid.com

また、エンドポイントからの戻り値も他社と同じようにシンプルなものですので、表やグラフなどに変換することも容易にできると思います。

Publicでアクセスできる機能という範囲でしか試していませんが、他社と大きく違うのはサーバーの状態が細かくモニタリングできるようになっている事でしょうか。
ホームページ内にもサーバーの状態が見れるページがあり、過去3か月間のサーバーダウンの状況もわかります。

status.liquid.com

最後に、先日FTX社に買収されるというニュースがありましたが、国内のユーザーはQuoine側のプラットフォームに移管されるようなので、近い将来APIの機能も更に拡充されるかもしれませんね。