bitFlyerでビットコイン先物の価格情報を取得してみる
bitFlyerでは、ビットコインの先物を取引できます。
現在(2017/05/09)だと、「BTCJPY12MAY2017」と「BTCJPY19MAY2017」の2種類になります。
1週間先(今週)と2週間先(来週)の金曜日が満期日の先物になります。
APIで使用するには、product_codeに「BTCJPY12MAY2017」もしくは「BTCJPY19MAY2017」を使用すればOKです。
今回は、これを使って、ビットコイン現物と2種類の先物の価格情報(Ticker)を取得します。
後々グラフで表示したいので、とりあえずMySQLのデータベースにINSERTするところまでを目指します。
では、早速ソースです。
ビットコイン現物と先物価格情報を取得(bitFlyer APIを使用)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
# -*- coding: utf-8 -*- """ Created on Thu Mar 9 12:14:31 2017 @author: ichizo """ import bitflyerApi from datetime import datetime import pymysql markets_path = '/v1/markets' """ dbh = pymysql.connect( host='localhost', user='root', password='', db='bitcoin', charset='utf8', cursorclass=pymysql.cursors.DictCursor ) """ def get_product_code_list(): api = bitflyerApi.bitflyerApi() market_list = api.get_api_call(markets_path).json() print(market_list) pc_list = [] for market in market_list: if market['product_code'] != 'FX_BTC_JPY' and market['product_code'] != 'ETH_BTC': if 'alias' in market: pc = {'product_code':market['product_code'], 'alias':market['alias']} else: pc = {'product_code':market['product_code'], 'alias':market['product_code']} pc_list.append(pc) return pc_list def insert_data(data): sql = "INSERT INTO bitflyers (product_code, alias, timestamp, \ best_bid, best_ask, best_bid_size, best_ask_size, \ total_bid_depth, total_ask_depth, ltp, \ volume, volume_by_product, created) \ VALUES ( \ '%s', '%s' ,'%s', '%s', '%s', '%s', '%s', \ '%s', '%s', '%s', '%s', '%s', '%s')" \ % (data['product_code'], data['alias'], data['timestamp'], 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'], data['created']) print(sql) """ stmt = dbh.cursor() stmt.execute(sql) dbh.commit() stmt.close() dbh.close() """ if __name__ == '__main__': pc_list = get_product_code_list(); print(pc_list) api = bitflyerApi.bitflyerApi() now = datetime.now().strftime("%Y-%m-%d %H:%M:%S") for pc in pc_list: channel = 'lightning_ticker_' + pc['product_code'] result = api.pubnub_call(channel) print(result) result['timestamp'] = result['timestamp'][:26].replace('T',' ') result['alias'] = pc['alias'] result['created'] = now insert_data(result) |
とりあえず、SQL(INSERT文)を発行するところまでは実装しました。
PyMySQLの部分をコメントアウトしていますが、Python上でMySQLが扱えれば動くはずです(多分)。
今、手元に環境がないため、MySQLにデータが入るところまでは確認できていません。
近いうちにVPSでも契約しようかと思います。
今回実装したPythonプログラムでは、以前開発したAPIを扱うプログラムを使用していますので、そのソースも載せておきます。
必要なライブラリ等は以前の記事をご覧ください。
bitFlyer API
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 |
# -*- coding: utf-8 -*- """ Created on Thu Mar 9 12:00:27 2017 @author: ichizo """ from pubnub.pnconfiguration import PNConfiguration from pubnub.pubnub import PubNub, SubscribeListener import json import requests import time import hmac import hashlib import util class bitflyerApi: def __init__(self): self.api_key = 'APIキー' self.api_secret = 'APIシークレットキー' self.api_endpoint = 'https://api.bitflyer.jp' def get_api_call(self,path): method = 'GET' timestamp = str(time.time()) text = timestamp + method + path sign = hmac.new(bytes(self.api_secret.encode('ascii')), bytes(text.encode('ascii')), hashlib.sha256).hexdigest() request_data=requests.get( self.api_endpoint+path ,headers = { 'ACCESS-KEY': self.api_key, 'ACCESS-TIMESTAMP': timestamp, 'ACCESS-SIGN': sign, 'Content-Type': 'application/json' }) return request_data def post_api_call(self,path,body): body = json.dumps(body) method = 'POST' timestamp = str(time.time()) text = timestamp + method + path + body sign = hmac.new(bytes(self.api_secret.encode('ascii')), bytes(text.encode('ascii')), hashlib.sha256).hexdigest() request_data=requests.post( self.api_endpoint+path ,data= body ,headers = { 'ACCESS-KEY': self.api_key, 'ACCESS-TIMESTAMP': timestamp, 'ACCESS-SIGN': sign, 'Content-Type': 'application/json' }) return request_data """ channel: 'lightning_ticker_BTC_JPY' """ def pubnub_call(self,channel): 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(channel).execute() my_listener.wait_for_connect() bf_result = my_listener.wait_for_message_on(channel) bf_data = bf_result.message pubnub.unsubscribe().channels(channel).execute() my_listener.wait_for_disconnect() return bf_data def get_board(self): api = bitflyerApi() result = api.pubnub_call('lightning_board_snapshot_BTC_JPY') bids = util.util.dict_to_pd(result['bids'],'bf',False) asks = util.util.dict_to_pd(result['asks'],'bf',True) return bids,asks def get_balance(self): api = bitflyerApi() result = api.get_api_call('/v1/me/getbalance').json() data = {} for row in result: if (row['currency_code'] == 'JPY'): data['jpy_amount'] = float(row['amount']) data['jpy_available'] = float(row['available']) elif (row['currency_code'] == 'BTC'): data['btc_amount'] = float(row['amount']) data['btc_available'] = float(row['available']) return data def order(self,data): api = bitflyerApi() result = api.post_api_call('/v1/me/sendchildorder',data).json() return result |
データがたまったら、グラフで表示させる部分も実装してみようかと思います。
これらのデータで色々とできそうで、これから楽しみです!