Python ビットコイン

PythonでビットコインTickerデータを取得してデータベースに保存してみる

スポンサードリンク

Contents

ビットコインのAPIが公開されているので利用してみようと思い立つ

今流行りのビットコインですが、
APIを用意している取引所も多く、
これを利用してビットコインの
Tickerデータを取得するというのをやってみます。

私が利用しているビットコインの取引所は
おそらく今一番有名なbitFlyerです。

bitFlyer ビットコインを始めるなら安心・安全な取引所で

FXのAPIも公開されている

bitFlyerでは、ビットコインの現物取引
(仮想通貨の売買を現物取引というのも変な気がしますが)
のほかにビットコインのFX取引ができます。

現物取引だと買いから入るしかありませんが、
FXだと外為取引と同様に売りから入ることもできます。

あと、こちらも証拠金取引で
10倍までレバレッジをかけることもできます。
(bitFlyerの場合)

ただでさえ価格変動の激しいビットコインに
10倍のレバレッジをかけるのもどうかと思いますが、
とにかく最大10倍までかけることができます。

FXのTicker APIも公開されていますので、
現物のビットコインと合わせて取得してみることにします。

ビットコインAPIを使ってTickerを取得するプログラムを作ってみる

bitFlyerでは、PubNubを利用してリアルタイムの更新情報を配信しているので、これを利用させてもらいます。

事前準備その1・データベースを用意

事前準備として、取得したデータを保存する
データベースを作成しておきます。

今回はPython + Sqliteを使用します。

では、早速Pythonのソースです。

# -*- coding: utf-8 -*-

import sqlite3

DB = 'bitflyer.db'

if __name__ == '__main__':
    conn = sqlite3.connect(DB)
    cur = conn.cursor()

    sql = "create table btcfx (bc_total_bid_depth, bc_total_ask_depth, bc_ltp, \
            bc_tick_id, bc_volume, bc_best_bid, bc_best_ask_size, \
            bc_volume_by_product, bc_product_code, bc_timestamp, \
            bc_best_bid_size, bc_best_ask, \
            fx_total_bid_depth, fx_total_ask_depth, fx_ltp, \
            fx_tick_id, fx_volume, fx_best_bid, fx_best_ask_size, \
            fx_volume_by_product, fx_product_code, fx_timestamp, \
            fx_best_bid_size, fx_best_ask, \
            diff_bid, diff_ask, created);"
    cur.execute(sql)

    conn.commit()
    conn.close()

bitflyer.dbというデータベースに対して
btcfxというテーブルを作成しておきます。

事前準備その2・PythonでPubNubを使えるようにする

PubNubでは、Pythonから使いやすいように
ライブラリを用意してくれていますので、
これをインストールしておきます。

pip install 'pubnub>=4.0.8'

これだけです。

※PubNubのドキュメントはこちら

APIでbitcoin情報を取得してデータベースに保存する

では、いよいよプログラム本体です。

# -*- coding: utf-8 -*-
"""
Created on Fri Mar  3 15:24:33 2017

@author: ichizo
"""
from pubnub.enums import PNStatusCategory
from pubnub.pnconfiguration import PNConfiguration
from pubnub.pubnub import PubNub, SubscribeListener
import sqlite3
import time
import datetime

DB = 'bitflyer.db'


if __name__ == '__main__':

    pnconfig = PNConfiguration()
    pnconfig.subscribe_key = "sub-c-52a9ab50-291b-11e5-baaa-0619f8945a4f"
    pnconfig.ssl = False
     
    pubnub = PubNub(pnconfig)
    
    my_listener = SubscribeListener()
    pubnub.add_listener(my_listener)
     
    pubnub.subscribe().channels(['lightning_ticker_BTC_JPY', 'lightning_ticker_FX_BTC_JPY']).execute()
    my_listener.wait_for_connect()
    print('connected')
    
    i = 0
    while i < 360:
        
        conn = sqlite3.connect(DB)
        cur = conn.cursor()

        result = my_listener.wait_for_message_on('lightning_ticker_BTC_JPY')
        print(result.message)
        bc_data = result.message
        print(bc_data['best_bid'])
        
        fx_result = my_listener.wait_for_message_on('lightning_ticker_FX_BTC_JPY')
        print(fx_result.message)
        fx_data = fx_result.message
        print(fx_data['best_bid'])

        sql = "INSERT INTO btcfx (bc_total_bid_depth, bc_total_ask_depth, bc_ltp, \
            bc_tick_id, bc_volume, bc_best_bid, bc_best_ask_size, \
            bc_volume_by_product, bc_product_code, bc_timestamp, \
            bc_best_bid_size, bc_best_ask, \
            fx_total_bid_depth, fx_total_ask_depth, fx_ltp, \
            fx_tick_id, fx_volume, fx_best_bid, fx_best_ask_size, \
            fx_volume_by_product, fx_product_code, fx_timestamp, \
            fx_best_bid_size, fx_best_ask, \
            diff_bid, diff_ask, created) \
            VALUES ('%s','%s','%s','%s','%s','%s','%s','%s','%s','%s',\
            '%s','%s','%s','%s','%s','%s','%s','%s','%s','%s',\
            '%s','%s','%s','%s','%s','%s','%s')" \
            % (bc_data['total_bid_depth'], bc_data['total_ask_depth'], bc_data['ltp'], \
            bc_data['tick_id'], bc_data['volume'], bc_data['best_bid'], bc_data['best_ask_size'], \
            bc_data['volume_by_product'], bc_data['product_code'], bc_data['timestamp'], \
            bc_data['best_bid_size'], bc_data['best_ask'], \
            fx_data['total_bid_depth'], fx_data['total_ask_depth'], fx_data['ltp'], \
            fx_data['tick_id'], fx_data['volume'], fx_data['best_bid'], fx_data['best_ask_size'], \
            fx_data['volume_by_product'], fx_data['product_code'], fx_data['timestamp'], \
            fx_data['best_bid_size'], fx_data['best_ask'], \
            bc_data['best_bid'] - fx_data['best_bid'], bc_data['best_ask'] - fx_data['best_ask'], datetime.datetime.now())

        print(sql)
        cur.execute(sql)
        conn.commit()
        conn.close()
        i = i + 1
        
        time.sleep(60)

    pubnub.unsubscribe().channels(['lightning_ticker_BTC_JPY', 'lightning_ticker_FX_BTC_JPY']).execute()
    my_listener.wait_for_disconnect()
    
    print('unsubscribed')

PubNub Subscribe Keyは、
bitFlyerで公開されているものを利用します。

本当は、Pythonを待機状態にしておいて
PubNubから更新情報が来たら
データを登録するみたいなことを
やりたかったのですが、
やり方がわからず挫折しました。

で、sleepを60秒間隔で入れて
1分おきのビットコインの価格情報を
取得するようにしました。

現物とFXの両方を連続して取得して
同じレコードに放り込んでいます。

同じレコードの現物とFXが揃っていたら
色々できるかもと考えてのことです。

これからビットコインの取引を始めようかと考えている方、
ビットコインFXに興味のある方はbitFlyerがおススメです。

bitFlyer ビットコインを始めるなら安心・安全な取引所で

-Python, ビットコイン
-, ,

© 2024 FX・ビットコイン・オプションのシステムトレード開発と取引録 Powered by AFFINGER5