こんにちは、DXCEL WAVEの運営者(@dxcelwave)です!
- 仮想通貨自動売買ツールの概要が知りたい!
- Pythonで一連のビットコイン自動売買ツールを作成したい!
【仮想通貨】ビットコイン自動売買とは
ビットコイン自動取引とは、通貨情報参照・決済・送金等の取引関連操作をプログラムで代替することを指します。ビットコイン自動売買ツールは、暗号資産取引所が提供するAPIサービスの活用を通じて実装することができます。
ビットコイン自動取引ツールの活用により、手動操作による手間削減はもちろんのこと、仮想通貨収益化プロセスの効率化も大幅に期待できます。当サイトでは上記のように、ビットコイン自動売買に関する特集記事を多数配信しております。
【仮想通貨】ビットコイン自動売買ツールを構築概要
上図フローチャートに従うビットコイン自動売買ツールの作成方法を本記事で解説します。ツール作成に際して、開発言語はPythonを活用します。
上記フローチャートを題材とした具体的な実装方法やプログラム設計思想はこちらの記事で詳しく解説してます。併せてご覧下さい。
ビットコイン自動取引ツールの仕組み・プログラム設計方法|仮想通貨自動売買実践#7
ビットコイン自動売買に興味がある方向けに「ビットコイン自動売買ツールの仕組み」「独自にカスタマイズできるようになる設計方法」について解説します。
暗号資産取引所のAPIサービス
後述で解説するビットコイン自動売買ツールは、コインチェックAPIを活用して実装しているため、コインチェックの口座開設者が本記事の対象読者になります。
コインチェックの口座開設およびAPI情報の取得は無料です。また、以下の記事でAPI情報の取得方法を丁寧に解説しています。未取得の方はこの記事を読み進める前にご確認下さい。
ビットコインチャート分析手法
本記事で紹介するビットコイン自動売買ツールには、ボリンジャーバンドというチャート分析手法を採用します。ボリンジャーバンドとは、移動平均線と上下に3本ずつの標準偏差(±1σ、±2σ、±3σ)からなる計7本の線で表わされるメジャーなインジケーターです。
ボリジャーバンドの概要が知りたい方・Pythonプログラムの実装方法について詳しく知りたい方は、こちらの記事をご覧ください。
【Python×仮想通貨】ボリンジャーバンドを活用した自動売買
テクニカル分析を採用した仮想通貨の自動売買に興味がある方向けに、Pythonによるボリンジャーバンドを用いたリアルタイム分析手法について解説します。
ビットコイン買いサイン・売りサインの検知方法
本記事解説のビットコイン自動売買ツールでは、次のようなビットコイン買い・売りサイン検知方法を採用しています。
買いサイン | ・ビットコイン価格がボリンジャーバンド-2σを下回った瞬間 |
売りサイン | ・売り利確:ビットコイン購入時の価格より+3%上昇した瞬間 ・売り損切:ビットコイン購入時の価格より-5%下落した瞬間 |
【事前準備】Pythonライブラリをインストール
Pythonをもとにビットコイン情報を取得する場合、次のようなライブラリを活用します。事前にインストールしておきましょう。
ccxt|仮想通貨情報を取得する際に有効
pip install ccxt
pandas|取得した仮想通貨データの加工・整形に有効
pip install pandas
TA-Lib|テクニカル分析結果を算出するためのライブラリ
Ta-Libはテクニカル分析に役立つライブラリです。以下の手順に従いインストールしましょう。
共通
最も簡単な方法はAnaconda
をインストールしてTa-Libを使用する方法です。
① Anacondaをインストール
② Anacondaプロンプトを開き、以下を実行
conda install -c conda-forge ta-lib
Mac OSの方はこちら
①Ta-Lib本体をインストール
brew install ta-lib
②Ta-Lib Pythonパッケージをインストール
pip install TA-Lib
【Python】ビットコイン自動売買ツールを構築実践
それでは実際にPythonでビットコイン自動売買ツールの作成する方法について解説していきます。
Coincheck APIをもとにプログラムを実装するため、CoincheckのAPIキーおよびシークレットキーはお手元にメモを残しておきましょう。
【コード共通】初期設定・関数作成
まず第一にプログラムの骨格となる「Pythonライブラリ」「API情報」「自動売買関数」を定義します。
ライブラリ定義・APIキー&シークレットキーの定義
PythonライブラリとAPI情報(APIキー・シークレットキー)を定義します。以下コードのAPI情報
部分を実際に入手したAPIキーとシークレットキー情報に書き換えた上でPythonコードの前段に配置しましょう。
初期設定ではビットコインの売買数量単位をamount=0.005[BTC]
と設定しています。より大きな取引を実行したい場合、amountの数量を変更しましょう。
# ===================================================
# ⓪ 初期設定(取引設定値)
# ===================================================
# ライブラリ
import talib
import ccxt
import pandas as pd
from time import sleep
# ビットコイン自動売買初期設定
symbol = "BTC/JPY" # 購入通貨
amount = 0.005 # 購入数量[BTC]
# API情報
API_KEY = "APIキーを入力"
SECRET_KEY = "シークレットキーを入力"
# Coincheck取引所のオブジェクト
coincheck = ccxt.coincheck({'apiKey':API_KEY,'secret':SECRET_KEY})
関数定義
続いて、前述のコード直下に以下のコードを配置します。ビットコイン自動取引に利用する主要関数「残高照会」「ビットコイン売買」「チャート分析」をここに定義しております。
# ===================================================
# ⓪ 初期設定(関数)
# ===================================================
# 日本円残高情報を取得
def balance_jpy():
JPY = float(coincheck.fetch_balance()["info"]["jpy"])
return JPY
# ビットコイン売買
def order(buy_sell,amount):
order = coincheck.create_order(
symbol = "BTC/JPY", # 取引通貨
type = "market", # 成行注文
side = buy_sell, # 購入 or 売却
amount = amount, # 取引数量
)
return order
# チャート分析
def bb_band():
# コインチェック価格取得
btc_price_list.append(float(coincheck.fetch_ticker(symbol="BTC/JPY")["ask"]))
# ボリンジャーバンド引数情報
period = 20 # データ取得期間
bbup = 2 # upper-band:標準偏差
bbdwn = 2 # down-band:標準偏差
ma_type = 0 # 移動平均の種類(0:単純移動平均)
# ボリンジャーバンド指標獲得
bb_up, bb_middle, bb_down = talib.BBANDS(pd.Series(btc_price_list), # 価格データ
timeperiod=period, # データ取得期間
nbdevup=bbup, # upper-band:標準偏差
nbdevdn=bbdwn, # down-band:標準偏差
matype=ma_type) # 移動平均の種類(0:単純移動平均)
# 買いサインの検出
# ビットコイン価格 < -2σを満たす時とする
if btc_price_list[len(btc_price_list)-1] < bb_down[len(bb_down)-1]:
result = "購入サイン検知"
else:
result = "チャート分析中"
return result
ビットコインの残高情報取得
ビットコイン注文前に「そもそもビットコイン売買可能な残高が存在するのか?」を判断するプログラムが必要になります。資金不足に伴うビットコイン注文時のエラーを避けるためです。以下、該当のコードを示します。
# ===================================================
# ① 残高と最新価格を取得 → ビットコインの購入可否を判断
# ===================================================
# 初期残高
initial_balance = balance_jpy()
# 日本円残高が今回購入予定のビットコイン価格×数量を上回っているか確認
balance_dif = int(initial_balance - (float(coincheck.fetch_ticker(symbol="BTC/JPY")["last"]) * amount))
# 残高判定
if balance_dif > 0:
message = "ビットコイン購入可能"
else:
message = "ビットコイン購入不可"
print("余裕資金: {}[円]".format(balance_dif))
print(message)
sleep(1)
ビットコイン価格情報を取得|チャート分析|買いサイン検知
ビットコインチャート分析用のプログラムを構築します。以下、ボリンジャーバンドをチャート分析手法に採用し、その指標を買いサインに用いたプログラムを示します。
# ===================================================
# ② ビットコイン価格情報を取得
# ③ チャート分析 :ボリンジャーバンドを採用
# ④ 買いサイン検知:ビットコイン価格 < -2σ を満たす場合「買いサイン」と定義
# ===================================================
if message == "ビットコイン購入可能":
# ビットコイン購入サイン
buy_sign = False
# ビットコイン価格
btc_price_list = []
# 購入サインを検知するまでチャート分析を繰り返し
while buy_sign == False:
# ボリンジャーバンド
chart_analytics = bb_band()
print(chart_analytics)
# 購入サイン確認
if chart_analytics == "購入サイン検知":
buy_sign = True
print("チャート分析完了!")
ビットコインを購入注文
ビットコインを実際に買い注文するコードを示します。ここで、注文方法は成行注文を採用しています。
# ===================================================
# ⑤ ビットコインを購入注文(成行)
# ===================================================
if message == "ビットコイン購入可能":
buy_order = order("buy",amount)
ビットコインの価格情報取得|チャート分析を実行|売りサイン検知
前述でビットコイン購入後、再びチャート分析を行い、ビットコイン売買利益を獲得するためのプログラムを以下に示します。ビットコイン売りサインには「利確売り」と「損切り」の2つを採用しています。
# ===================================================
# ⑥ ビットコイン価格情報を取得
# ⑦ チャート分析
# ⑧ 売りサイン検知
# - 購入時の価格 3%増加 → 利確売り
# - 購入時の価格 5%減少 → 損切り
# ===================================================
if message == "ビットコイン購入可能":
# ビットコイン購入時の価格
btc_price_buy = float(buy_order["info"]["rate"])
sell_sign = False
while sell_sign == False:
# 最新のビットコイン売却価格
btc_price_bid = float(coincheck.fetch_ticker(symbol="BTC/JPY")["bid"])
# 利益計算
profit = ((btc_price_buy - btc_price_bid)/btc_price_bid)*100
print("想定利益: {}[%]".format(profit))
# 売却サイン検知
if profit > 3:
print("売りサイン検知")
sell_sign = True
if profit < -5:
print("損切りサイン検知")
sell_sign = True
# 待機時間
sleep(1)
ビットコインを売却
前述のプログラムで売りサイン検知後にビットコインを売却するためのプログラムを以下に示します。
ビットコイン売却時の注文方法も成行注文を採用しています。
# ===================================================
# ⑨ ビットコインを売却注文(成行)
# ===================================================
if message == "ビットコイン購入可能":
sell_order = order("sell",amount)
sleep(1)
⑩ビットコインの売買利益を計算
一連のビットコイン自動売買プロセスから得られた損益を計算するプログラムを以下に示します。
損益は、プログラム動作初期で取得した残高データとビットコイン売却後に再取得した残高データの差分をもとに計算しています。
# ===================================================
# ⑩ ビットコイン売買利益計算
# ===================================================
# 残高取得
last_balance = balance_jpy()
# 損益
profit_or_loss = last_balance - initial_balance
# 出力
print("獲得利益: {}円".format(profit_or_loss))
【コードまとめ】Pythonによるビットコイン自動売買
最後にこれまで示したビットコイン自動売買のコード全量を以下に掲載します。
# ===================================================
# ⓪ 初期設定(取引設定値)
# ===================================================
# ライブラリ
import talib
import ccxt
import pandas as pd
from time import sleep
# ビットコイン自動売買初期設定
symbol = "BTC/JPY" # 購入通貨
amount = 0.005 # 購入数量[BTC]
# API情報
API_KEY = "APIキーを入力"
SECRET_KEY = "シークレットキーを入力"
# Coincheck取引所のオブジェクト
coincheck = ccxt.coincheck({'apiKey':API_KEY,'secret':SECRET_KEY})
# ===================================================
# ⓪ 初期設定(関数)
# ===================================================
# 日本円残高情報を取得
def balance_jpy():
JPY = float(coincheck.fetch_balance()["info"]["jpy"])
return JPY
# ビットコイン売買
def order(buy_sell,amount):
order = coincheck.create_order(
symbol = "BTC/JPY", # 取引通貨
type = "market", # 成行注文
side = buy_sell, # 購入 or 売却
amount = amount, # 取引数量
)
return order
# チャート分析
def bb_band():
# コインチェック価格取得
btc_price_list.append(float(coincheck.fetch_ticker(symbol="BTC/JPY")["ask"]))
# ボリンジャーバンド引数情報
period = 20 # データ取得期間
bbup = 2 # upper-band:標準偏差
bbdwn = 2 # down-band:標準偏差
ma_type = 0 # 移動平均の種類(0:単純移動平均)
# ボリンジャーバンド指標獲得
bb_up, bb_middle, bb_down = talib.BBANDS(pd.Series(btc_price_list), # 価格データ
timeperiod=period, # データ取得期間
nbdevup=bbup, # upper-band:標準偏差
nbdevdn=bbdwn, # down-band:標準偏差
matype=ma_type) # 移動平均の種類(0:単純移動平均)
# 買いサインの検出
# ビットコイン価格 < -2σを満たす時とする
if btc_price_list[len(btc_price_list)-1] < bb_down[len(bb_down)-1]:
result = "購入サイン検知"
else:
result = "チャート分析中"
return result
# ===================================================
# ① 残高と最新価格を取得 → ビットコインの購入可否を判断
# ===================================================
# 初期残高
initial_balance = balance_jpy()
# 日本円残高が今回購入予定のビットコイン価格×数量を上回っているか確認
balance_dif = int(initial_balance - (float(coincheck.fetch_ticker(symbol="BTC/JPY")["last"]) * amount))
# 残高判定
if balance_dif > 0:
message = "ビットコイン購入可能"
else:
message = "ビットコイン購入不可"
print("余裕資金: {}[円]".format(balance_dif))
print(message)
sleep(1)
# ===================================================
# ② ビットコイン価格情報を取得
# ③ チャート分析 :ボリンジャーバンドを採用
# ④ 買いサイン検知:ビットコイン価格 < -2σ を満たす場合「買いサイン」と定義
# ===================================================
if message == "ビットコイン購入可能":
# ビットコイン購入サイン
buy_sign = False
# ビットコイン価格
btc_price_list = []
# 購入サインを検知するまでチャート分析を繰り返し
while buy_sign == False:
# ボリンジャーバンド
chart_analytics = bb_band()
print(chart_analytics)
# 購入サイン確認
if chart_analytics == "購入サイン検知":
buy_sign = True
print("チャート分析完了!")
# ===================================================
# ⑤ ビットコインを購入注文(成行)
# ===================================================
if message == "ビットコイン購入可能":
buy_order = order("buy",amount)
# ===================================================
# ⑥ ビットコイン価格情報を取得
# ⑦ チャート分析
# ⑧ 売りサイン検知
# - 購入時の価格 3%増加 → 売却
# - 購入時の価格 5%減少 → 損切り
# ===================================================
if message == "ビットコイン購入可能":
# ビットコイン購入時の価格
btc_price_buy = float(buy_order["info"]["rate"])
sell_sign = False
while sell_sign == False:
# 最新のビットコイン売却価格
btc_price_bid = float(coincheck.fetch_ticker(symbol="BTC/JPY")["bid"])
# 利益計算
profit = ((btc_price_buy - btc_price_bid)/btc_price_bid)*100
print("想定利益: {}[%]".format(profit))
# 売却サイン検知
if profit > 3:
print("売りサイン検知")
sell_sign = True
if profit < -5:
print("損切りサイン検知")
sell_sign = True
# 待機時間
sleep(1)
# ===================================================
# ⑨ ビットコインを売却注文(成行)
# ===================================================
if message == "ビットコイン購入可能":
sell_order = order("sell",amount)
sleep(1)
# ===================================================
# ⑩ ビットコイン売買利益計算
# ===================================================
# 残高取得
last_balance = balance_jpy()
# 損益
profit_or_loss = last_balance - initial_balance
# 出力
print("獲得利益: {}円".format(profit_or_loss))
【Python×ビットコイン】自動売買ツール作成に挑戦ロードマップ
Pythonによるビットコイン自動売買をこれから始めたい方向けに、体系化した自動売買実践記事を配信しております。以下No順に記事をご覧いただくことでビットコイン自動売買ツールが自作できるようになるでしょう!
当サイトでは上記以外にも仮想通貨・ビットコイン自動売買に関する記事を多数配信しております。