ビットコインの日次の価格データを取得する
今回はビットフライヤーからビットコインの価格を取得してみたいと思います。ビットフライヤーはAPIが用意されているのですが、APIだとリアルタイムの情報しか取れないので、1年単位のデータを入手したいという時には使えません。なのでCryptowatchというサイトから取得することになります。
1日足で、2017/01/01以降のチャートを取得したい時は以下のような感じです。
見たら分かると思いますが、periodsで日次データか分足(1時間足なら3600、5分足なら300など)にするかの調整ができ、afterは取得したい期間の始めのUnixtimeを指定するだけです。
Pythonでビットコインの価格データを取得する
PythonでこのAPIをつかう場合はrequestsというライブラリーを使うと便利です。requestsはPythonのみだとインストールする必要がありますが、Anacondaだとデフォルトでインストールされているかと思います。
###ライブラリのインストール
import requests
import json
###ビットフライヤーの価格データを取得する
import requests
r=requests.get('https://api.cryptowat.ch/markets/bitflyer/btcjpy/ohlc?periods=86400&after=1483196400')
rに<Response [200]> と返ってきていれば、価格データの取得自体は成功しています。今回取得したビットコインの価格データは、rという変数にJSONというファイル形式で保存されているわけですが、jsonデータの中身はそのままpythonで見ることはできないので、関数を使って変換する必要があります。
pythonでJSONデータを表示する
pythonではjsonデータはテキストデータ(.text)にしてjson.loads()という関数でリストに変換できます。
#データをjsonに変換する
r2=json.loads(r.text)
<結果>
{‘allowance’: {‘cost’: 1746301, ‘remaining’: 7993329326}, ‘result’: {‘86400’: [[1495324800, 232660, 242460, 231962, 242460, 231.863, 0], [1495411200, 243915, 343303, 236510, 254214, 309.532, 0], [1495497600, 256994, 276003, 256994, 276002, 4.94, 0], [1495584000, 284989, 284989, 275603, 275603, 0.002, 0], [1495670400, 302146, 302146, 300000, 301050, 1.05, 0], [1495756800, 303000, 340000, 270002, 270002, 17.01, 0], [1495843200, 349998, 349998, 194003, 281061, 21.613, 0], [1495929600, 269998, 269999, 210000, 269999, 2.1200001, 250001], [1496016000, 269999, 279999, 210045, 210046, 7.623, 269999], [1496102400, 270000, 280000, 265202, 280000, 3.321, 270412], [1496188800, 270007, 280999, 270000, 277383, 1.271, 275965], [1496275200, 250000, 260000, 245653, 260000, 0.012, 260000], [1496361600, 289900, 289999, 277986, 289999, 5.106, 289869], [1496448000, 280000, 280000, 270000, 279999, 14.802, 0], [1496534400, 298000, 298000, 272000, 291967, 0.702, 0], [1496620800, 280000, 299999, 280000, 299999, 2, 0], [1496707200, 299998, 300000, 272000, 300000, 11.159, 0], [1496793600, 309000, 323454, 309000, 322030, 47.822956, 0], [1496880000, 319220, 320060, 289507, 293681, 41.727978, 0], [1496966400, 292301, 309700, 289550, 308850, 10.303012, 0], [1497052800, 308696, 319998, 301024, 319998, 5.2129993, 0],
こんな感じでビットコインの価格を取得できます。データの形は分かりにくいですが、{allowance:[~~~],result:[~~~]}みたいなjsonで返ってきます。
とりあえず今回欲しいのはresultの中の価格データなので、要らない部分をそぎ落とし必要な部分だけを抜き取ります。(これがデータ集めで非常にめんどくさい・・・)
>>>r3=r2[‘result’]とすれば、r3で{‘86400’: [[1495324800, 232660,~以下のデータが抽出できます。次は>>>r4=r3[‘86400’]とでもすれば、[[1495324800, 232660,~の部分が抽出できます。(短くまとめるときは、r2[‘result’][‘86400’]で省略できます。)
###ビットフライヤーの価格データを取得する import requests r=requests.get('https://api.cryptowat.ch/markets/bitflyer/btcjpy/ohlc?periods=86400&after=1483196400') r2=json.loads(r.text) bitcoindata=r2['result']['86400']
<結果>
[[1495324800, 232660.0, 242460.0, 231962.0, 242460.0, 231.863, 0.0], [1495411200, 243915.0, 343303.0, 236510.0, 254214.0, 309.532, 0.0], [1495497600, 256994.0, 276003.0, 256994.0, 276002.0, 4.94, 0.0], [1495584000, 284989.0, 284989.0, 275603.0, 275603.0, 0.002, 0.0], [1495670400, 302146.0, 302146.0, 300000.0, 301050.0, 1.05, 0.0],
これでタイムスタンプと価格が格納された二次元配列が手に入ります。またタイムスタンプが気持ち悪い人は日付に変換しましょう。
from datetime import datetime import time bitcoindate=[] bitcoinprices=[] for i in bitcoindata: date=int(i[0]) loc =datetime.utcfromtimestamp(date) bitcoindate.append(loc) bitcoinprices.append(i[1]) pricedata=pd.DataFrame({"date":bitcoindate,"price":bitcoinprices}) pricedata
これで↓みたいなデータフレームが作れます。
まあこんな感じですが、Cryptowatchはどちらかというと、高頻度データの取り扱いよりで、数年分のアルトコインの日時データを取得する場合は、他の仮想通貨価格サイトから取得するのがオススメだと思います。
コメント