bitFlyer APIからビットコインの価格情報を取得して保存したい~プログラム紹介

テクニカル分析には過去の価格情報が欠かせません。

現在運用中のトレードプログラムは、
bitFlyer FX上で動かしています。

このトレードプログラムとは別で、
毎分1回bitFlyer FXからビットコインの
価格情報を取得してデータベースに保存しています。

テクニカル分析に用いるために、
取得した価格情報はデータベースへ保存し続けています。

今回は、価格情報を取得して保存しているプログラムをご紹介します。

データベース構築

プログラムの開発に入る前に
データを保存する箱を用意しておきます。

MySQLを使用しています。

CREATE TABLE `ticks` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `tick_id` int DEFAULT NULL,
  `exchange_id` int DEFAULT NULL,
  `product_code` varchar(20) DEFAULT NULL,
  `alias` varchar(20) DEFAULT NULL,
  `best_bid` decimal(15,8) DEFAULT NULL,
  `best_ask` decimal(15,8) DEFAULT NULL,
  `best_bid_size` decimal(12,8) DEFAULT NULL,
  `best_ask_size` decimal(12,8) DEFAULT NULL,
  `total_bid_depth` decimal(15,8) DEFAULT NULL,
  `total_ask_depth` decimal(15,8) DEFAULT NULL,
  `ltp` decimal(15,8) DEFAULT NULL,
  `volume` decimal(15,8) DEFAULT NULL,
  `volume_by_product` decimal(15,8) DEFAULT NULL,
  `timestamp` datetime DEFAULT NULL,
  `created_at` datetime DEFAULT CURRENT_TIMESTAMP,
  `updated_at` datetime DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `index_ticks_on_exchange_id` (`exchange_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

tick情報取得・保存プログラム

次に、bitFlyer FXからtick情報を取得、
保存するプログラムをご紹介します。

import bitflyerApi
import pymysql
import configparser
import os
import sys

config = configparser.ConfigParser()
config.read(os.path.dirname(os.path.abspath(__file__)) + "/config.ini")

argvs = sys.argv
account_id = argvs[1]
exchange_id = 1

db_host = config.get('db', 'host')
db_user = config.get('db', 'user')
db_pass = config.get('db', 'pass')
db_name = config.get('db', 'name')

product_code = 'FX_BTC_JPY'

dbh = pymysql.connect(
         host=db_host,
         user=db_user,
         password=db_pass,
         db=db_name,
         charset='utf8',
         cursorclass=pymysql.cursors.DictCursor
    )


def get_ticks_sql(data):
    trading_time = data['timestamp']
    sql = "INSERT INTO ticks ( product_code, alias, \
            timestamp, tick_id, exchange_id, best_bid, best_ask, best_bid_size, \
            best_ask_size, total_bid_depth, total_ask_depth, \
            ltp, volume, volume_by_product) VALUES ('%s', '%s', \
            '%s', %s, %s, %s, %s, %s, \
            %s, %s, %s, \
            %s, %s, %s) " % (data['product_code'], data['product_code'], \
            trading_time[:19],data['tick_id'], exchange_id, data['best_bid'], data['best_ask'], data['best_bid_size'],  \
            data['best_ask_size'], data['total_bid_depth'], data['total_ask_depth'], \
            data['ltp'], data['volume'], data['volume_by_product'])
    return sql

def insert_data(sql):

    stmt = dbh.cursor()
    stmt.execute(sql)
    dbh.commit()

    stmt.close()

if __name__ == '__main__':
    api = bitflyerApi.bitflyerApi(account_id)
    result = api.get_ticker(product_code)

    sql = get_ticks_sql(result)
    insert_data(sql)

読み込んでいるbitflyerApiは、
bitFlyer APIを呼び出す自作のプログラムです。

以下の記事で紹介していますのでご参考ください。

bitFlyer APIから注文する方法~プログラム例

2018年10月10日

config.iniは、bitflyerApiでも用いているもので、
ここにDB接続情報を記載しています。

下記のように記載します。

[db]
host = ホスト名
user = 接続ユーザー名
pass = 接続パスワード
name = DB名

まとめ

get_ticks.pyを実行するたびに
ticksテーブルにデータが保存されます。

クーロンで1分間に1回実行されるように
設定しておけば毎分の価格情報を保存することが可能です。