bitFlyerFXの板情報を1秒おきに取得し、CSV・DBに保存し、Pandasデータフレームとして出力するPython3スクリプト

目次

はじめに
本noteが提供するコード情報
CSV保存版 (csv_board.py)
DB (SQLite3) 保存版 (db_board.py)
おまけ:板情報の可視化 (display_board.py)

はじめに

トレードbot作成の戦略構築・バックテスト・検証に、約定履歴に加え、板情報が必要になるケースがあります。bitFlyerのAPIにより約定履歴は1ヶ月分が提供されているのですが、板情報は現在時点でのデータしか提供されていません。そのため、板情報は自前で取得・蓄積する必要があります。

本noteが提供するコード情報

本noteでは、REST APIを用いて1秒おきに板情報を取得し、CSVもしくはDB(SQLite3)へと保存し、Pandasのデータフレームとして出力するためのPython3スクリプトを提供します。CSV版・DB版、どちらも50行ほどのコードです。また、おまけとして、JSON RPCを用いて板情報をコンソール上で可視化するためのスクリプトも掲載しています。

また、約定履歴の取得についても別のnoteにて紹介しています。

CSV保存版 (csv_board.py)

※こちらはQiitaの記事、板情報分析入門~ビットコインの板情報を入手し解析してみた~を参考にしています(誤り修正・コメント追記を行った以外はほぼそのままです)。

標準以外のライブラリはrequests, pandasさえインストールされていれば動きます。

#!/usr/bin/python3
import requests
import json
from datetime import datetime as dt
import time
import pandas as pd
import os

base_url = 'https://api.bitflyer.jp/v1/board?product_code='
pair = 'FX_BTC_JPY'
data = requests.get(base_url + pair, timeout=5)
SLEEP_T = 1 # スリープ秒数
DEPTH = 100 # 取得する板の深さ

def get_board(): # boardデータ取得関数
    data = requests.get(base_url + pair, timeout=5)
    board = json.loads(data.text) # JSONデータを辞書データへ変換
    dict_data = {'time': dt.now()} # 現在時刻の取得
    dict_data.update({'mid_price': board['mid_price']})
    dict_data.update({'ask_price_{}'.format(i): board['asks'][i]['price'] for i in range(DEPTH)})
    dict_data.update({'ask_size_{}'.format(i) : board['asks'][i]['size']  for i in range(DEPTH)})
    dict_data.update({'bid_price_{}'.format(i): board['bids'][i]['price'] for i in range(DEPTH)})
    dict_data.update({'bid_size_{}'.format(i) : board['bids'][i]['size']  for i in range(DEPTH)})
    return pd.Series(dict_data) # 辞書データをPandas Seriesへ変換

def get_btc_board(): # 1秒待ってのループ処理
    init_time = dt.now() # 現在時刻の取得
    end_time = dt.now() # 現在時刻の取得
    print('START /', init_time)
    main_list = [] # Pandasデータフレームの元となるリストを初期化
    while (end_time - init_time).seconds < 3600: # データ保存の時間[s] # 1hで1つのdfを作成
        try:
            dict_data = get_board() # JSONデータをPandas Seriesへ変換
            main_list.append(dict_data) # Pandas Seriesをリストへ追加
        except Exception as e:
            print('exception: ', e.args)
        time.sleep(SLEEP_T)
        end_time = dt.now() # 現在時刻の取得
    df_data = pd.concat(main_list, axis=1).T # Pandas Seriesのリストを結合・転置し、キー名をデータフレームの列名とする
    df_data.to_csv('./data/bitflyerfx_hourly_board_day_{}_init_{}_{}_end_{}_{}.csv'.format(init_time.day, init_time.hour, init_time.minute, end_time.hour, end_time.minute))
    print('END /', end_time)

if __name__ == '__main__':
    if not os.path.exists('./data'):
        os.mkdir('./data') # dataディレクトリが無ければ作成する
    while True:
        try:
            get_btc_board()
        except Exception as e:
            print('exception: ', e.args)

コメントをできるだけ丁寧に記述したため、コメントとコードを追っていただければ、挙動は理解していただけると思います。

以下、DB保存部分・pandasデータフレーム出力部分は有料パートとなります。※note売上は良質な情報を発信している方のnote購入・サポートに充てさせていただきます。

この続きをみるには

この続き:3,671文字

bitFlyerFXの板情報を1秒おきに取得し、CSV・DBに保存し、Pandasデータフレームとして出力するPython3スクリプト

AKAGAMI 卍

500円

この記事が気に入ったら、サポートをしてみませんか?気軽にクリエイターを支援できます。

note.user.nickname || note.user.urlname

最後まで読んでいただき、どうもありがとうございます。頂いたサポートは、良質な情報を発信している方のnote購入・サポートに充てさせていただきます。

スキありがとうございます。今後ともよろしくお願いいたします。
30

AKAGAMI 卍

仮想通貨

1つのマガジンに含まれています
コメントを投稿するには、 ログイン または 会員登録 をする必要があります。