見出し画像

10分以内にbifFlyerの自動売買Bot作成

ものまねが上手くなりたいと思っているあなた。

僕はものまねが好きだ! ものまねをやっていると 知識を簡単に勉強できる。

これからBot系開発の知識を一緒に勉強して行きましょう。

Discordトレード交流会
https://discord.gg/NhShPBaxPb

残りの人生の時間は短いし。 後悔しないようにBot自動売買手法を勉強しましょう。

前提
・CCXTライブラリを使う

ccxtというライブラリが複数の取引所に対応しているらしく、さっそく使ってみたいと思います。

公式ページは以下
https://github.com/ccxt/ccxt

ccxtはJavascriptとPHPも対応しているとのことですが、今回はPythonを利用してます。

まずはインストール

pip install ccxt

とりあえず取引所一覧を取得していきます。

import ccxt
print(ccxt.exchanges) # print a list of all available exchange classes

結果:

['_1broker', '_1btcxe', 'acx', 'allcoin', 'anxpro', 'bibox', 'binance', 'bit2c', 'bitbay', 'bitcoincoid', 'bitfinex', 'bitfinex2', 'bitflyer', 'bithumb', 'bitlish', 'bitmarket', 'bitmex', 'bitso', 'bitstamp', 'bitstamp1', 'bittrex', 'bitz', 'bl3p', 'bleutrade', 'braziliex', 'btcbox', 'btcchina', 'btcexchange', 'btcmarkets', 'btctradeua', 'btcturk', 'btcx', 'bxinth', 'ccex', 'cex', 'chbtc', 'chilebit', 'cobinhood', 'coincheck', 'coinexchange', 'coinfloor', 'coingi', 'coinmarketcap', 'coinmate', 'coinsecure', 'coinspot', 'cryptopia', 'dsx', 'exmo', 'flowbtc', 'foxbit', 'fybse', 'fybsg', 'gatecoin', 'gateio', 'gdax', 'gemini', 'getbtc', 'hitbtc', 'hitbtc2', 'huobi', 'huobicny', 'huobipro', 'independentreserve', 'itbit', 'jubi', 'kraken', 'kucoin', 'kuna', 'lakebtc', 'liqui', 'livecoin', 'luno', 'lykke', 'mercado', 'mixcoins', 'nova', 'okcoincny', 'okcoinusd', 'okex', 'paymium', 'poloniex', 'qryptos', 'quadrigacx', 'quoinex', 'southxchange', 'surbitcoin', 'therock', 'tidex', 'urdubit', 'vaultoro', 'vbtc', 'virwox', 'wex', 'xbtce', 'yobit', 'yunbi', 'zaif', 'zb']

わずか2行で取得。簡単でいいですね。
日本の取引所であるbitflyer, zaif, coincheck, quoinexなどもあって良い感じです!

そして、bitflyerのaskとbitを取得してみます。

bitflyer market price {'bid': 1148500.0, 'ask': 1148993.0, 'spread': 493.0}
askは売り単価の情報、bitは買う単価の情報です。

import ccxt
bitflyer = ccxt.bitflyer()
orderbook = bitflyer.fetch_order_book ('BTC/JPY')
bid = orderbook['bids'][0][0] if len (orderbook['bids']) > 0 else None
ask = orderbook['asks'][0][0] if len (orderbook['asks']) > 0 else None
spread = (ask - bid) if (bid and ask) else None
print (bitflyer.id, 'market price', { 'bid': bid, 'ask': ask, 'spread': spread })

結果:

bitflyer market price {'bid': 1128500.0, 'ask': 1128993.0, 'spread': 493.0}

ではaskとbitが取れたので今後はそれを比較して裁定取引可能かどうかの判断と最適な取引所の判定をしてみます。

import ccxt
exchange_list = ['bitflyer','zaif']
ask_exchange = ''
ask_price = 0
bid_exchange = ''
bid_price = 0
for exchange_id in exchange_list:
   exchange = eval('ccxt.' + exchange_id + '()')
   orderbook = exchange.fetch_order_book ('BTC/JPY')
   bid = orderbook['bids'][0][0] if len (orderbook['bids']) > 0 else None
   ask = orderbook['asks'][0][0] if len (orderbook['asks']) > 0 else None
   if ask < ask_price:
       ask_exchange = exchange_id
       ask_price = ask
   if bid > bid_price:
       bid_exchange = exchange_id
       bid_price = bid

print (ask_exchange, 'で', ask_price, '円で買う')
print (bid_exchange, 'で', bid_price, '円で売り')
print (bid_price - ask_price, '円の利益。')

結果:

bitflyer で 1106620.0 円で買って
zaif で 1142330.0 円で売れば
35710.0 円の利益!

これから実際のアカウントで操作する場合はAPIのKEYを導入することが必要です。

APIとは「Application Programming Interface(アプリケーション・プログラミング・インターフェイス)」の略語であり、「ある1つの機能に特化したプログラムで共有可能なもの」や「ソフトウェアの機能を共有する仕組み」のことです。

このAPIはしばしばWeb上に公開され、外部(Web)から呼び出して利用します。様々な分野・用途でAPIが公開されていますが、ほとんどが無料で利用することが可能です。

bitFlyerからは以下の4つのAPIが公開されています。

1.bitFlyer Lightning
2.chainFlyer API
3.bitFlyer Lightning API Playground
4.Echo API

今回はbitFlyer Lightningを利用します。

bitFlyer LightningではHTTP APIとRealtime APIの2種類を提供しています。 

HTTP APIではbitFlyerが用意する様々なライブラリを用いて様々な情報を読み出せるAPIになります。Realtime APIとはWebSocketを使ったリアルタイムデータのAPIになっています。

今回はHTTP APIを利用します。

bitFlyerが提供するHTTP APIはAPIキーによる認証が不要であるHTTP Public APIと認証が必要なHTTP Private APIに二分されます。

主に機能としては以下のように分類されます。

Public API
関数名    機能
markets   マーケットの一覧
board    板情報を取得
ticker    tickerを取得
executions 約定履歴の取得
getboardstate 板の状態
gethealth   取引所の状態
getchats     チャットの発言一覧


Private API
関数名 機能
getbalance 資産残高を取得
getcollateral 証拠金の状態を取得
getcoinins 仮想通貨預入履歴
getcoinouts 仮想通貨送付履歴
getbankaccounts 銀行口座一覧取得
getdeposits 入金履歴
withdraw 出金
getwithdrawals 出金履歴
sendchildorder 新規注文を出す
cancelchildorder 注文をキャンセルする
sendparentorder 新規の親注文を出す(特殊注文)
cancelparentorder 親注文をキャンセルする
cancelallchildorders 全ての注文をキャンセルする
getchildorders 注文の一覧を取得
getparentorders 親注文の一覧を取得
getexecutions 約定の一覧を取得
getbalancehistory 残高履歴を取得
getcollateralhistory 証拠金の変動履歴を取得
gettradingcommission 取引手数料を取得

ccxtは各取引所がどのような共通の関数に対応しているかは、「.has」で調べることができます。

▽ 取引所で対応している共通関数を調べるためのコード

import ccxt
bitflyer = ccxt.bitflyer()
method_list = bitflyer.has
for key,value in method_list.items() :
	if value == True:
		print( key )

Bitflyerでは以下の共通の関数に対応していることがわかります。

共通の関数一覧


cancelOrder():注文をキャンセルする


createOrder():新規の注文を行う

fetchBalance():口座情報を取得する

fetchOrderBook():板情報を取得する

private_get_position():ポジション情報を取得する


fetchTicker():Ticker情報を取得する

fetch_open_orders() :注文一覧情報を取得する

APIの概要を了解した上に自分のAPIキーとシークレットキーを取得

APIキー取得の流れを確認していきましょう。

①まずはbitFlyerのホームページにジャンプし、インターフェース左にある「bitFlyer Lightning」をクリックしましょう。

画像1

②それでは画面左上の三本線のアイコンをクリックしましょう。

画像2

3.そのタブの中から「API」をクリックして下さい。

画像3

そうするとbitFlyer LightningのAPI設定画面に推移します。

ここからAPI設定が可能になります。

では、画面下部の「新しいAPIキーを追加」をクリックします。

画像4

APIキーのラベルやこの発行するAPIキーの所有権限を付与します。

画像5

APIキーの確認

画像6

zaifのAPIは上記と同じです。

今回の取引手法紹介:

裁定取引(アービトラージ)とは、同一の価値を持つ商品の一時的な価格差(歪み)が生じた際に、割高なほうを売り、割安なほうを買い、その後、両者の価格差が縮小した時点でそれぞれの反対売買を行うことで利益を獲得しようとする取引のこと。

取引手法の例

裁定取引(アービトラージ)だと以下のような事をプログラム的に瞬間的に実行します。
人間が介在できる時間はほぼ無く取引所での価格差の利益はほぼプログラムが得ていると考えられます。

片道(資金の移動を手動)
取引所Aで、70万円 で 1 btc 売れる
取引所Bで、69万円 で 1 btc 買える
取引所A、取引所Bで同時に 1 btc を取引する
btc と 円 の資金を元の取引所に出金・送金する
実質 1万円 儲かった
「1」に戻る
メリット:わかりやすい
デメリット:資金の移動が面倒

そして、コードを修正

import ccxt

exchanges = {
   "bitflyer": {
       "apiKey": "",
       "secret": ""
   },
"zaif": {
       "apiKey": "",
       "secret": ""
   },
}
amount = 0.001
ask_exchange = ''
ask_price = 0
bid_exchange = ''
bid_price = 0
# 取引所のaskとbidを取得
for exchange_id in exchanges:
   exchange = eval('ccxt.' + exchange_id + '()')
   orderbook = exchange.fetch_order_book('BTC/JPY')
   bid = orderbook['bids'][0][0] if len(orderbook['bids']) > 0 else None
   ask = orderbook['asks'][0][0] if len(orderbook['asks']) > 0 else None
   if ask < ask_price:
       ask_exchange = exchange_id
       ask_price = ask
   if bid > bid_price:
       bid_exchange = exchange_id
       bid_price = bid
# 裁定取引取引手法
#買い
ask_price = int(ask_price/5)*5
exchange = eval('ccxt.' + ask_exchange + '()')
exchange.apiKey = exchanges[ask_exchange]["apiKey"]
exchange.secret = exchanges[ask_exchange]["secret"]
exchange.create_limit_buy_order ('BTC/JPY', amount, ask_price)
#売り
bid_price = int(bid_price*5)/5
exchange = eval('ccxt.' + bid_exchange + '()')
exchange.apiKey = exchanges[bid_exchange]["apiKey"]
exchange.secret = exchanges[bid_exchange]["secret"]
exchange.create_limit_sell_order ('BTC/JPY', amount, bid_price)
print(ask_exchange, 'で', ask_price, '円で', amount, '買う')
print(bid_exchange, 'で', bid_price, '円で', amount, '売り')
print((bid_price - ask_price)*amount, '円の利益!')

以上

追加ご紹介海外の取引所


よろしくお願いいたします。



この記事が参加している募集

最近の学び

この記事が気に入ったらサポートをしてみませんか?