見出し画像

ビットコインの価格データを取得する

無料で取得できるデータを漁るのが趣味なデータアナリストですが、この度ビットコインの価格データが(ほぼほぼ)無料で取得できると知ったのでここに作業録をまとめます。

膨大かつ長期的な範囲で、なおかつ整形された状態でデータが欲しい

仮想通貨の価格情報自体は仮想通貨取引所が毎日発表してますし、Googleで「ビットコイン 日本円」と検索すればチャートがすぐに表示されます。

しかしデータアナリストとしては、

①当日だけでなく長期にわたる価格データが欲しい
②整った形で欲しい
③ビットコイン以外のデータも欲しい
④日本円での価格データが欲しい
⑤無料で欲しい

というくそわがまま仕様でデータが欲しいところ。

調べたところ、CryptoWatchからAPI経由でデータを取得するのが、上記仕様を満たす最速の道のようです。

CryptoWatchとは、海外の仮想通貨取引所の「Kraken」によって運営されているチャートウェブサイトで、上記リンク先を一眼見ればわかる通り、なかなか多種多様かつ高機能なチャートを揃えています。

サイト自体の完成度もなかなか高いですが、データアナリストとして特に魅力的なのが、「長期間にわたる価格データをAPI経由で無料取得できること」。

CryptoWatchは世界中の取引所の価格データを収集しているようで、各取引所で、BTC/JPYがいくらであったかが、1分足から取得可能です。

ということで早速やってみました。

まずは何も考えずAPIを投げる

まずは見様見真似でやってみました。

使用言語はpython(jupyter notebook)です。

import requests
import json
import numpy as np
import pandas as pd
from datetime import datetime

#チャートの単位を設定
#ここでは日足で取得

periods = ["86400"]

#クエリパラメーターを設定

query = {"periods": ','.join(periods), "before": "", "after": ""}

#BTCJPYの日足取得
btcjpy = json.loads(requests.get("https://api.cryptowat.ch/markets/bitflyer/btcfxjpy/ohlc", params=query).text)
res = btcjpy["result"]

結果

スクリーンショット 2021-08-29 17.54.15

json形式でたくさんデータが入っていますね。

データはそれぞれ

{'result':{'86400(日足)':[[ datetime(UNIXTIME),  'Open', 'High','Low','Close','Volume','QuoteVolume']}}

となっています。

APIをつぶさに調べる

getメソッドのところで投げたURLを見てみましょう。

"https://api.cryptowat.ch/markets/bitflyer/btcfxjpy/ohlc"

公式ドキュメントを見てみると、"https://api.cryptowat.ch/"より以降に情報を付加していくことで、欲しい情報が手に入るようです。

今回はbitFlyerのBTCJPY価格の取得を試みました。これを行うためには、/markets/bitflyerで市場を指定し、/btcfxjpyで欲しい通貨ペアを指定します。

公式ドキュメントのMarketsの解説ページによると、

A market is a pair listed on an exchange. For example, btceur on exchange kraken is a market.
(Marketは取引で提示されるペアのことだよ。例えば、krakenで取引されるBTCEURはMarketだよ。)

とあります。分かるような分からないような。。。

また、/ohlcと指定することでOHLC(始値、高値、安値、終値)が取得できます。

OLHC以外にも、/price、/summary、/orderbook、/tradesなどがありますが詳細は割愛。こちらのドキュメントを参照してください。

また今回は、リクエストを投げる前にクエリを設定しています。

#チャートの単位を設定
#ここでは日足で取得

periods = ["86400"]

#クエリパラメーターを設定

query = {"periods": ','.join(periods), "before": "", "after": ""}

periodsの箇所では、取得するチャートの期間の単位を日足に設定しています。

ちなみに1分足なら60、5分足なら300です。つまり秒数での指定です。

取得できる単位一覧はこちらで確認できます。

加えて、クエリパラメーターの箇所では、集計期間をbefore、afterをunix timestamp形式で指定することで設定できます(今回は空欄)。

たった数行書いただけで日次のBTCJPYが取得できました。最高。

Allowanceの確認

上記クエリ経由でデータを取得するのは現時点(2021/8/29)ではほぼ無料です。

なぜ「ほぼ」と書いたかというと、実際は「無料枠」を使っているに過ぎないからです。

公式ドキュメントのRate Limitにはこのような記載があります。

Free/Anonymous accounts are limited to the equivalent of 10 Cryptowatch Credits worth of API calls per 24-hour period. 
(中略)
Some API requests cost more than others, so these cost more allowance. Your allowance is reset 24 hours after your first request.
(無料/匿名アカウントが使えるAPIの制限は、24時間ごとに10 Cryptowatch Credits相当までだよ。いくつかのAPIは他のものよりコストがかかるよ。その場合はallowanceもより多く消費されるよ。みなさんのallowanceは最初のAPIリクエストから24時間ごとにリセットされるよ)

allowanceとは平たく言えば無料枠みたいなものです。APIを使用するたびにallowanceが減少していきますが、24時間経てばリセットされます。

使用するAPIによって消費される無料枠も異なります。

公式ドキュメントに記載の現時点(2021/08/29)での消費credits(allowance)は下記の通りです。

スクリーンショット 2021-08-29 18.48.40

さて、先ほど投げたapiによってどれほどallowanceが減少したのか確認してみましょう。

btcjpy["allowance"]

結果

スクリーンショット 2021-08-29 18.52.09

無料/匿名アカウントに割り振られた10クレジットの内、0.015クレジットは消費してしまいました。残すところ9.985クレジットです。

HFTでもしない限り、十分なクレジット数だと思います。

余談:CryptoWatchは何で儲けているのだろう...

CryptoWatchは上記APIだけでなく、チャートツールとしても中々優秀に見受けられます。

これだけのデータ収集・維持・可視化・API提供を行うのはかなりコストのかかる仕事だと思うのですが、果たして採算は合っているのでしょうか。。。余計なお世話ですが。。。

価格表を見ても、CryptoWatch内における基本的な取引すら無料のように見えます(私自身は使っていないので正確なところは分かりません)。

おそらく、某ay某ayみたいに、最初は赤字覚悟で無料顧客を獲得しつつ、競合がほぼ死滅し、かつ顧客離反リスクも小さいと判断したら有料化する戦略なんでしょうか。

それとも、高頻度取引を行うbotterやヘビーユーザーの獲得に成功しているんでしょうか。。。

謎は深まるばかりです。。。

せっかくなのでtableau de 可視化

せっかくなので、取得したデータをtableauで可視化してみました。

CryptoWatchをそのまま使うでもなく、matplotlibを使うでもなく、わざわざtableauでイチから可視化してしまうあたり、車輪の再発明感は否めません。

でも私はtableauが好きなので。

天下のクラスメさんのこちらのページを参考に可視化しました。

スクリーンショット 2021-08-29 19.14.58

うはっ。いいですね〜〜〜。絵になりますね〜〜〜。アートだわー。NFTで出品しちゃおうかな。

せっかく日次の良質なデータを手に入れたので、次は時系列分析の勉強(というより大学院で学んだことの復習)をしようと思います。

では。

この記事が気に入ったらサポートをしてみませんか?