今回はJSON形式のデータについて理解を深めましょう。

JSONのフォーマットや見方に関する情報を紹介しながら進めたいと思うのですが、ここではシステムトレードでよく使う情報を例にしてご紹介していきます。

以前ご紹介したcryptowatch APIの基本的な使い方(リクエストのイメージ等)を踏まえた上でお話を進めますので、必要に応じて予習をお願い致します。

JSON形式とは?

JSONは「JavaScript Object Notation」の略でデータの形式です。本来はJavaScriptで使用される事を想定していた様ですが、PythonやRubyでも問題無く使用ができます。なので名前はあまり気にしなくてもOKです。

現在、WebAPIではよく使われるデータ形式ですので、扱い方をここでしっかりと覚えておきましょう。

さて、さっそくJSON形式のデータを見てみましょう。以下のデータ見ると、入れ子構造になっており、正直見にくいですよね。。。

JSONの例

{“result”:{“86400”:[[1519862400,1140860,1188000,1098770,1104460,451.6083,515504300],[1519948800,1100740,1174593,1094020,1165220,329.48325,370953570],[1520035200,1165070,1186250,1144000,1160600,161.37102,187889220],[1520121600,1171490,1215727,1170790,1212529,254.82202,304617820],[1520208000,1210001,1213180,1170000,1208010,246.41983,292873570],

まずは、これをもう少し見やすくして、内容をひも解いてみましょう。冒頭でもお伝えした通り、せっかくAPIを活用したシステムトレード用のプログラムを作成中ですので、トレードに必要なデータを例にして説明しますね。

JSON形式のデータから必要なデータのみを抽出する

ではさっそく、cryptowatchより取得したデータをサンプルに使ってみます。※先ほどのデータもcryptowathのものです。

cryptowatchに以下のリクエストを投げてみましょう。

■リクエスト

https://api.cryptowat.ch/markets/bitflyer/btcjpy/ohlc?periods=86400&after=1519862400

リクエスト結果は先ほどもお伝えした通り非常に見にくいものになっているはず。なので、JSON形式のデータは、改行とインデントによって解析の時は見やすくする事が多いです。例えば以下の様に。

こうして見てみると、少しは分かりやすくなったのではないでしょうか。先ほどもお話した様に入れ子構造になっていて、resultはデータ全体を意味しています。”86400″は日足のデータですから、日足のデータ全てを表わしています。

そして、順番に並んでいる値(”1519862400″、”1519948800″で始まる[]で囲まれた値)がOHLCのローソク足(日足)の情報になります。[]で囲まれた部分が1日分の情報になっています。

このデータはJSON形式の中ではわりとシンプルな部類になりますので、しっかりと覚えておきましょう。

Pythonでデータを取得してみよう

ではPythonを使って、実際にデータを取得してみましょう。以下の様なコードでデータを取得してみます。

■Pythonコード

■Pythonコードの説明

このPythonコードの処理は非常に簡単です。少しだけ解説をしていきます。

・import requests ・・・ requestsというライブラリを使用するというコードです。

・response = requests.get(“https://api.cryptowat.ch/markets/bitflyer/btcjpy/ohlc?periods=86400&after=1519862400”) ・・・ cruptowatchから取得したデータをresponseという変数に代入しています。

・data = response.json() ・・・ responseのデータをJSON形式でパースしています。

・print( data[“result”] ) ・・・ JSON形式で取得したデータのキー”result”の値を画面表示します。pythonに限らず、printという関数は画面表示を行うと思ってOKです。

これを実行すると以下の通り”result”の情報が取得できます。※jupyterを使って実行しています。

■結果

この結果に改行とインデントを加えて前半部分だけ並べてみますね。

{‘86400’:
[[1519862400, 1140860, 1188000, 1098770, 1104460, 451.6083, 515504300],
[1519948800, 1100740, 1174593, 1094020, 1165220, 329.48325, 370953570],
[1520035200, 1165070, 1186250, 1144000, 1160600, 161.37102, 187889220],

resultの中身が取得できている事が分かるでしょうか。

日足データ全ての取得

では、今度はさらにデータの絞り込みを行います。

■Pythonコードの変更点

printの部分を以下の様に変更してみましょう。

print( data[“result”][‘86400’] )

■結果

すると、以下の様に’86400’のvalueが出力されています。ちょっと分かりにくいですか?笑

確かにこの例では少し分かりにくいかもしれません。先頭部分は”result”で指定した場合と対して変わらないからです。

日足(1日分)のデータを取得

では、日足(1日分)だけのデータを取得してみます。

■Pythonコードの変更点

printの部分を以下の様な形に変更したらどうでしょうか。

print( data[“result”][‘86400’] [0])

■結果

結果を見てみると、以下の様になります。

この様なデータが取得できましたね。

[1519862400, 1140860, 1188000, 1098770, 1104460, 451.6083, 515504300]

これは、日足1個分(つまり1日分)のOHLCデータになります。ようやく必要なローソク足のデータが取得できました。

各値の細かい値についてはこちらをご参考にして下さい。これを参考にすると、この情報は以下を表わしています。

1519862400 ⇒ 2018/03/01 09:00:00

1140860  ⇒ ビットコインの始値 114万860円

1188000 ⇒ ビットコインの高値 118万8000円

1098770 ⇒ ビットコインの安値 109万8770円

1104460 ⇒ ビットコインの終値 110万4460円

451.6083 ⇒ 出来高

日足の始値を取得

実際にローソク足を形成するために必要なOHLCの値まで直接取得してみましょう。

■Pythonコードの変更点

例えば、3月1日の始値(open)を取得したい場合は以下のprintを以下の様に変更します。

※配列のIndexは[1]になります。※Indexは0から開始するため、0は日付のデータ、1が始値となるはずです。

print( data[“result”][‘86400’] [0][1])

■結果

想定通り、始値である1140860を取得する事ができました。同じ考え方で、高値、安値、終値も取得する事が可能です。Indexを変更してあげれば良い話です。

JSON形式のデータから必要な情報を取得できた!

この様な形でJSON形式のデータから、必要な情報を取得する事ができます。これらの情報を収集して並べればチャートを描画するのも簡単ですし、移動平均線などを描画する事もできます。

JSON形式のデータの扱いに慣れていない方は、配列構造が深くなると、なんだこれ?と思われる方もいるのですが、カラクリを理解してみれば理解できるはずです。

使い方さえ分かればJSON形式のデータの扱いも簡単なのです。実際にcryptowatchから取得したデータを分解してみて、扱い方もなんとなく分かっていただけたのではないでしょうか?

cryptowatchには様々な情報がストックされていて、APIによってそれらの情報を引き出す事ができるのですが、他の情報についても扱う時の方法は非常に簡単です。