【再出発】貧乏だし文系だけどpythonで自動売買bot作りたい5日目

こんにちは!

貧乏文系が、pythonで自動売買botを作る試み5日目。
前回は、取得したbitflyerの価格データをpythonで取り扱いやすい形に整形して取得しました。

今回は、「取得した価格データに個々にアクセスする」ということをしていきます。

取得した価格データに個々にアクセスする

まず、振り返りで、前回作ったプログラムを一度動かします。
ちなみに少しコーディングを変更しました。
得られる結果は変えていません。

import requests

“””
requests.get(“URL”, params = クエリ情報)の形でクエリを指定が可能
URLを変数url、クエリ情報をqueryに格納
クエリ情報は、{“クエリパラメータ1” : “クエリパラメータ1の値”}で指定し、複数ある場合はカンマで区切る
“””

url = “https://api.cryptowat.ch/markets/bitflyer/btcfxjpy/ohlc”
query = {“before”: “1546268400”, “periods”: “86400”}

data = requests.get(url, params = query).json()

print(data)

結果

このままだと何となく価格が入っているのは分かりますが、情報量が多すぎて何から手をつけていいのかわかりません。
なので、まずは、これらのデータの中から欲しい情報だけピンポイントで表示させるということをやります。

前提として、取得したデータがどんな構造になっているかを書きます。
.json()を指定して、web APIから返されたJSONフォーマットのデータをpythonで取り扱いやすいように整形すると辞書型のデータになっています。

辞書型{‘キー’ : ‘値1′ ,’値2’ }というように、あるキー項目に値が紐づいている形式

具体的に、実際に取得できたデータに目を向けると、

{‘result’: {‘86400’: [[1535846400, 782545, 813329, 782495, 805516, 223013.39, 176398140000.0], [1535932800, 805513, 826500, 796701, 824175, 314656.34, 256175240000.0], ・・・中略・・・[1578960000, 907046, 908438, 895623, 896877, 13407.36449523, 12091356728.820717]]}, ‘allowance’: {‘cost’: 1880870, ‘remaining’: 3995382365, ‘remainingPaid’: 0, ‘upgrade’: ‘Upgrade for a higher allowance, starting at $15/month for 16 seconds/hour. https://cryptowat.ch/pricing’}}

という内容になっているのですが、日本語を交えてどんな要素で構成されているか書き換えると、

{‘result’:{‘期間‘:[[UNIX時間,始値,高値,安値,終値,BTCベースの出来高,JPYベースの出来高],[前と同じ形式],…[前と同じ形式]]},’allowance’:{その他情報}}

というデータ構造になっています。
もう少し言葉で補足すると、大きく2つのキー項目”result”と”allowance”があります。
その”result”に紐づいたデータの中に、”期間”(例示では86400)をキー項目にしてローソク足データが格納されている形です。

つまり、キー項目が複数ある複雑な辞書型をしています。

このうち、実際に必要なのは[UNIX時間,始値,高値,安値,終値,BTCベースの出来高,JPYベースの出来高]で表されるローソク足データなので、これを抽出します。

基本的な抽出方法として、多重構造になっている場合は外側から絞りをかけていきます。
また、辞書型の場合はキー項目が何かを明示してあげる必要があります。

順番にやっていきます。

まず一番大外にあるキー”result”、”allowance”のうち、ローソク足データはキー”result”側に紐づいているので、最初の絞りとして”result”というキーを指定します。
最初に載せたコードの中で、取得したデータは変数dataに格納されているので、絞り方はdata[“result”]という指定の仕方になります。

コードで示すとこんな感じ。

import requests

url = “https://api.cryptowat.ch/markets/bitflyer/btcfxjpy/ohlc”
query = {“before”: “1546268400”, “periods”: “86400”}

data = requests.get(url, params = query).json()

print(data[“result”])

すると得られる結果は以下。

{‘86400’: [[1535846400, 782545, 813329, 782495, 805516, 223013.39, 176398140000.0],…中略… [1546128000, 427943, 434800, 400490, 410301, 291615.26178214, 124432637974.39743], [1546214400, 410560, 426880, 406250, 423122, 267306.35691987, 111701534565.93756]]}

まずは、キー”allowance”とそれに紐づいたデータが表示されなくなりました。

次に、一段階目の絞りをかけたデータの中で、一番大外のキーにあたる”期間”で絞りをかけます。

私が載せているコードは、最初からクエリ情報として日足「86400」を指定しているので、一種類の期間データしかありませんが、これを指定していなければ分足や週足等様々な期間が取得されるので、キーでどの期間なのかを明示する必要があるのです。

コードで示すとこんな感じ。

import requests

url = “https://api.cryptowat.ch/markets/bitflyer/btcfxjpy/ohlc”
query = {“before”: “1546268400”, “periods”: “86400”}

data = requests.get(url, params = query).json()

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

すると得られる結果は以下。

[[1535846400, 782545, 813329, 782495, 805516, 223013.39, 176398140000.0], [1535932800, 805513, 826500, 796701, 824175, 314656.34, 256175240000.0], …中略…, [1546214400, 410560, 426880, 406250, 423122, 267306.35691987, 111701534565.93756]]

ようやく同じ形式のローソク足データがカンマで区切られている状態で表示できるようになりました。

以降は、キー項目がないので、[]で囲まれたローソク足データを一つの塊とみなして、「何個目のローソク足データの塊を見たいのか」というのを順番で指定していきます。
例として先頭のローソク足だけを抽出します。

コードで示すとこんな感じ。

import requests

url = “https://api.cryptowat.ch/markets/bitflyer/btcfxjpy/ohlc”
query = {“before”: “1546268400”, “periods”: “86400”}

data = requests.get(url, params = query).json()

# 辞書型やリスト型でデータの位置を指定するときは、0から数えるのに注意。0が一番先頭を指します。
print(data[“result”][“86400”][0])

すると得られる結果は以下。

[1535846400, 782545, 813329, 782495, 805516, 223013.39, 176398140000.0]

とうとう先頭のローソク足データだけを抽出できました。

後は同じ要領で、ローソク足の中の順番を指定してあげれば、終値や始値など、好きなデータだけを表示することが出来ます。
一応最後までやると、[UNIX時間,始値,高値,安値,終値,BTCベースの出来高,JPYベースの出来高]の順番に並んでいるローソク足の中で、2番目に位置している始値だけを取り出します。
数え方は0からスタートするので、始値だけを取りたければ[1]と指定することになります。

コードで示すとこんな感じ。

import requests

url = “https://api.cryptowat.ch/markets/bitflyer/btcfxjpy/ohlc”
query = {“before”: “1546268400”, “periods”: “86400”}

data = requests.get(url, params = query).json()

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

すると得られる結果は以下。

782545

とうとう最小単位のデータを表示させることができました!

これまで指定したコードを踏まえると、

  1. キー”result”に紐づくデータを抽出
  2. キー”期間”に紐づくデータを抽出
  3. 何番目のローソク足データの塊かを指定して、任意の順番に位置するローソク足データの塊を抽出
  4. 個々のローソク足データの中の何番目の要素かを指定して、任意の順番に位置する要素を抽出

という順番でデータを抽出しました。

こんな風に指定してあげると、複雑な構造をしていた価格データから個々のデータを取り出してあげることができます。

個々のデータを取り扱えるようにはなりましたが、このままではUNIX時間が何時を指しているのか分からないし、ローソク足データのうちどれが始値でどれが終値なのかが直感的に理解できません。

なので、次回は人間が直感で理解しやすい形にデータを変形したいと思います。

差し支えなければ、twitterをフォローして頂けますと嬉しいです。

それでは~。

%d人のブロガーが「いいね」をつけました。