よつぴいてひやふつと射る

化学メーカー勤務の弱小技術職がチラシの裏風に雑然と書いていきます

Bitcoinの自動取引システムっぽいものを作る1

今更ながら、Bitcoinで金儲けをしたいという邪な欲望が芽生えてきました。
早速口座をいくつか開設して、ぽちぽちしてみたところ、ランダムに増えたり減ったりするだけだったので自動取引っぽいものを作りたいな、作れたらな、という記事です。
この分野には先人が何人もいてブログ記事もたくさんあるのでそれらを参考にして作るn番煎じです。

何はともあれ価格の時系列取得

使ったもの

bitFlyer LightningのAPIをPythonから使えるパッケージ「pybitflyer」を作りました - おおかみ山

とりあえず、1分足の取得場所が探した限りはなかったので、ティック情報を取得することに。
BitflyerのAPIは、マニュアルを見たけど何言ってるか理解できなかったので、先人のライブラリを使わせていただきました。感謝。
下のブログの記事も見ながらライブラリのコードも見ながら勉強中です。
11月, 2017 | いろいろてすと中

import pybitflyer
import json
import sqlite3
import time
from logging import getLogger, StreamHandler, FileHandler, DEBUG, INFO

logger = getLogger(__name__)
handler = StreamHandler()
handler.setLevel(INFO)
handler_f = FileHandler(filename='logger.log')
handler_f.setLevel(INFO)
logger.addHandler(handler)
logger.addHandler(handler_f)


class BTFlyer():
    def __init__(self):
        self._api = pybitflyer.API(api_key='キー',
                                   api_secret='シークレット')
        self._conn = sqlite3.connect('D:\\BTdata\\bitflyer\\ticker.db')
        self._cur = self._conn.cursor()

    def close(self):
        self._cur.close()
        self._conn.close()

    def get_ticker(self, inst):
        print('getting ticker data:' + inst)
        table_name = 'tick_data_' + inst
        sql = '''CREATE TABLE IF NOT EXISTS ''' + table_name + ''' (
        best_ask real,
        best_ask_size real,
        best_bid real,
        best_bid_size real,
        ltp real,
        product_code text,
        tick_id int,
        timestamp text,
        total_ask_depth real,
        total_bid_depth real,
        volume real,
        volume_by_product real,
        PRIMARY KEY(tick_id)
        )'''  
        self._cur.execute(sql)

        while True:
            try:
                data = json.dumps(self._api.ticker(product_code=inst))
            except Exception as e:
                print(e)
                logger.info(e)

            data_dict = json.loads(data)
            tuple_of_ticker_data = (
                data_dict['best_ask'],
                data_dict['best_ask_size'],
                data_dict['best_bid'],
                data_dict['best_bid_size'],
                data_dict['ltp'],
                data_dict['product_code'],
                data_dict['tick_id'],
                data_dict['timestamp'],
                data_dict['total_ask_depth'],
                data_dict['total_bid_depth'],
                data_dict['volume'],
                data_dict['volume_by_product'])
            sql = '''REPLACE INTO ''' + table_name + '''
                    ('best_ask',
                     'best_ask_size',
                      'best_bid',
                      'best_bid_size',
                      'ltp',
                      'product_code',
                      'tick_id',
                      'timestamp',
                       'total_ask_depth',
                       'total_bid_depth',
                       'volume',
                       'volume_by_product')
                    VALUES(?,?,?,?,?,?,?,?,?,?,?,?)'''
            self._cur.execute(sql, tuple_of_ticker_data)
            print('got ticker on {0} bid {1}, ask {2}'.format(data_dict['timestamp'],
                                                              data_dict['best_bid'],
                                                              data_dict['best_ask']))
            self._conn.commit()
            time.sleep(1)  # アクセス規制 に引っかからないように


if __name__ == '__main__':
    try:
        btf = BTFlyer()
        btf.get_ticker('FX_BTC_JPY')
    except:
        btf.close()

これで1秒ごとにSQLiteにティック情報が書き込まれるので、後はそれを読むだけ。

問題は板情報をどうするか…
SQLiteには多分入らないよね…