bitFlyerのAPIでティッカーを自動取得する【仮想通貨】

python
1

この記事では、bitFlyerのティッカーをpythonで自動取得する方法についてご紹介します!
仮想通貨でうまくいく人は、程度の差はあれど取引や分析の自動化を行っています。

機械学習で分析するためにも、学習用のデータが不可欠です。
いつでも分析を始められるよう、日ごろからデータをしっかりとっておきましょう!

 

関連:ビットコインの過去データを取得しよう

前提条件

pythonの知識

この記事では、pythonによる手法をご紹介します。
もちろん知識ゼロから始めることも可能ですが、その場合はお手元に以下のような参考書をご用意することを強くお勧めします。

今回取得したデータを用いて、今後機械学習によって分析や予測する方法をご紹介していきますので、の機会にぜひpythonの勉強をしてみましょう!

関連:あなたに最適なpython独習の参考書は?各参考書の長所と短所をご紹介!

 

ティッカーを取得する

pybitflyerをインストール

今回用いるpybitflyerというライブラリをインストールします。
python環境が整っている方であれば、pip installによって簡単にインストールできるかと思います。

$ pip install pybitflyer

インストールできているかの確認は、対話モードなどでimportしてみることで可能です。

以下を実行してエラーが出なければ問題なくインストールされています。

$ python
> import pybitflyer

 

実際にティッカーを取得してみる

引き続き対話モードで操作していきましょう。

> import pybitflyer
> api = pybitflyer.API()

pybitflyer.APIクラスを宣言し、tickerにアクセスする準備をします。
APIクラスのtickerメソッドを用いることで、現在のティッカーを取得することができます。

> ticker = api.ticker(product_code="BTC_JPY")

上のように記述することで、ticker変数に現在のティッカー情報が格納されます。
product_code=”BTC_JPY”とある通り、ビットコイン-円のティッカーが取得されています。

例えばtickerの中身は以下のようになります。

> ticker
{'best_ask': 724500.0,
 'best_ask_size': 7.38031475,
 'best_bid': 724162.0,
 'best_bid_size': 0.50000013,
 'ltp': 724500.0,
 'product_code': 'BTC_JPY',
 'tick_id': 312224,
 'timestamp': '2018-10-17T17:52:34.433',
 'total_ask_depth': 2092.14324952,
 'total_bid_depth': 1851.60520878,
 'volume': 226254.72634137,
 'volume_by_product': 4564.49541348}

tickerは辞書形式になっていて、キーはそれぞれ以下の通りです。

  • best_ask:最高買価格
  • best_bid:最低売価格
  • best_ask_size:最高買価格数
  • best_bid_size:最低売価格数
  • ltp:最終取引価格
  • total_ask_depth:買注文総数
  • total_bid_depth:売注文総数
  • volume_by_product: 価格ごとの出来高

 

数分ごとに自動で取得して保存する

ソースコード

それでは、上の内容を用いてティッカーを5分ごとに読み込んで保存するプログラムを書いてみましょう。

処理自体は単純で、上で示したティッカー取得を指定秒数ごとに行い、ファイルに書き込んでいくものにします。
今回はtimestamp、best_ask、best_bid、ltpの四つを保存してみます。
他の情報を保存したい場合は、ソースコードを書き替えることで可能です(下の解説参照)。

以下のコードはそのまま使えますので、ためしにコピー&ペーストして試してみてください。

import pybitflyer
from datetime import datetime
from time import sleep

# APIクラスの宣言
api = pybitflyer.API()

# 起動時間でファイルを作成
filePath = datetime.now().strftime("%Y%m%d_%H%M%S")+'.txt'
f = open(filePath, 'a') # 追記モードでファイルに書き込めるようにする

# 保存するデータを選択
option = ['timestamp','best_ask','best_bid','ltp']
f.write(','.join(option)+'\n')
f.close() # 一度閉じる

# 取得間隔(秒)
interval = 60*5

print('準備完了')

while True:
  # ファイル書き込み準備
  f = open(filePath, 'a')

  # 取得
  ticker = api.ticker(product_code="BTC_JPY")

  # 保存用にコンマ区切りにする
  line = ','.join([str(ticker[op]) for op in option])
  print(line)

  # 書き込んで閉じる
  f.write(line+'\n')
  f.close()

  # 指定した秒数だけストップ
  sleep(interval)

上のコードを例えばcrawler.pyとして保存し、コマンドプロンプトやターミナルで実行すると、以下のような出力が得られます。

処理を止めたい場合は、ctrl+cでプログラムの中断をしてください。

$ python crawler.py
準備完了
2018-10-18T01:52:07.037,725984.0,725900.0,725984.0
2018-10-18T01:57:07.263,725964.0,725874.0,725964.0
2018-10-18T02:02:07.67,725779.0,725520.0,725778.0
2018-10-18T02:07:07.237,725600.0,725500.0,725600.0
2018-10-18T02:12:07.85,725738.0,725322.0,725309.0
2018-10-18T02:17:07.807,725724.0,725347.0,725706.0

左からコンマ区切りで、タイムスタンプ、最高買価格、最低売価格、最終取引価格が表示されていることを確認してください。

 

コードの解説

上に掲載したソースコードについての解説を行います。

 

・必要なライブラリのインポート

import pybitflyer
from datetime import datetime
from time import sleep

コードで使用するライブラリをインポートします。

pybitflyerは上で紹介したライブラリ、datetimeは現在時刻を取得できるライブラリで、起動時間を取得するために用います。

また、sleepは指定した秒数のあいだプログラムの処理を止めてくれます。

 

・APIクラスの宣言

# APIクラスの宣言
api = pybitflyer.API()

これは上で説明したサンプルの通りで、ティッカーを取得するためのクラスを宣言しています。

 

・書き込みファイルの作成

# 起動時間でファイルを作成
filePath = datetime.now().strftime("%Y%m%d_%H%M%S")+'.txt'
f = open(filePath, 'a') # 追記モードでファイルに書き込めるようにする

次に、取得したティッカー情報を保存するファイルを作成します。
保存ファイル名が被ると、せっかく保存した情報に上書きされてしまうなど事故の原因となるため、プログラムを起動した時間ごとにファイルを作ります。

 

・保存する内容を選択

# 保存するデータを選択
option = ['timestamp','best_ask','best_bid','ltp']
f.write(','.join(option)+'\n')
f.close() # 一度閉じる

option変数には、ティッカー情報のうち保存したい内容を記述します。
ここでは、タイムスタンプと最低売価格、最低売価格、最終取引価格の四つを取得するようになっています。

上に載せたキーを追加したり削除することで、この内容は替えることができます。

どの情報を取得しているかを一度ファイルに書き込み、ファイルを閉じます。

f.close()でファイルを閉じることで更新が行われるため、書き込みんだら必ずcloseしてください。

・間隔を指定してループする
# 取得間隔(秒)
interval = 60*5
print('準備完了')

残りは一気に解説します。

まず、何秒間隔で取得するかをinterval変数に指定します。
この秒数を弄ることで、どれくらいの感覚でデータを取るかが変わります。

ただbitFlyer APIは一分間のアクセスを200回までに制限しています。
intervalの値を0.3以下にすることは絶対にやめてください。

ここまでの処理で、準備は完了です。

 

・ループする

while True:
  # ファイル書き込み準備
  f = open(filePath, 'a')

  # 取得
  ticker = api.ticker(product_code="BTC_JPY")

  # 保存用にコンマ区切りにする
  line = ','.join([str(ticker[op]) for op in option])
  print(line)

  # 書き込んで閉じる
  f.write(line+'\n')
  f.close()

  # 指定した秒数だけストップ
  sleep(interval)

準備ができたら後は処理をループするだけです。

まず書き込み用のファイルを準備し、ティッカーを取得します。

取得されたティッカー情報から、optionに記述した必要項目を抜き出し、カンマ区切りにしてファイルに保存します。

さらにこのファイルを閉じたら1ループの処理は終わりです。

次の処理はintervalで指定した秒数後に行えばいいため、sleepによって処理を停止します。

まとめ

今回はbitFlyerから情報を自動取得する方法についてご紹介しました。
取引情報の自動取得はプログラミングの練習としてちょうどいいだけでなく、取得したデータ自体も今後使っていけるという点でとても有効です。
今後の記事では、今回取得した情報を用いて機械学習やディープラニングによる値の分析・予測を行う方法についてご紹介します。
機械学習
感情分析(Sentiment Analysis)とはどんなタスクか【自然言語処理タスク紹介2】

感情分析(感情分類、評判分析、センチメント分析、Sentiment Analysisなど)は、自然言 …

機械学習
固有表現抽出(NER)とはどんなタスクか【自然言語処理タスク紹介1】

自然言語処理には固有表現抽出と呼ばれるタスクがあります。 機械学習の授業や自然言語処理の研究を始めた …

機械学習
機械学習の検証データ(dev、valid)はなぜ必要か

機械学習の勉強を始めると「検証データ」や「devセット」「validセット」といった言葉を必ず目にし …