【Python】ビットコイン自動取引ツールの作成方法|仮想通貨自動売買実践#8

こんにちは、DXCEL WAVEの運営者(@dxcelwave)です!

こんな方におすすめ!
  • 仮想通貨自動売買ツールの概要が知りたい!
  • Pythonで一連のビットコイン自動売買ツールを作成したい!
目次

【仮想通貨】ビットコイン自動売買とは

ビットコイン自動取引とは、通貨情報参照・決済・送金等の取引関連操作をプログラムで代替することを指します。ビットコイン自動売買ツールは、暗号資産取引所が提供するAPIサービスの活用を通じて実装することができます。

【参考】ビットコイン自動売買のメリットを学ぶ

ビットコイン自動取引ツールの活用により、手動操作による手間削減はもちろんのこと、仮想通貨収益化プロセスの効率化も大幅に期待できます。当サイトでは上記のように、ビットコイン自動売買に関する特集記事を多数配信しております。

【仮想通貨】ビットコイン自動売買ツールを構築概要

上図フローチャートに従うビットコイン自動売買ツールの作成方法を本記事で解説します。ツール作成に際して、開発言語はPythonを活用します。

上記フローチャートを題材とした具体的な実装方法やプログラム設計思想はこちらの記事で詳しく解説してます。併せてご覧下さい。

暗号資産取引所のAPIサービス

後述で解説するビットコイン自動売買ツールは、コインチェックAPIを活用して実装しているため、コインチェックの口座開設者が本記事の対象読者になります。

コインチェックの口座開設およびAPI情報の取得は無料です。また、以下の記事でAPI情報の取得方法を丁寧に解説しています。未取得の方はこの記事を読み進める前にご確認下さい。

ビットコインチャート分析手法

本記事で紹介するビットコイン自動売買ツールには、ボリンジャーバンドというチャート分析手法を採用します。ボリンジャーバンドとは、移動平均線と上下に3本ずつの標準偏差(±1σ、±2σ、±3σ)からなる計7本の線で表わされるメジャーなインジケーターです。

ボリジャーバンドの概要が知りたい方・Pythonプログラムの実装方法について詳しく知りたい方は、こちらの記事をご覧ください。

ビットコイン買いサイン・売りサインの検知方法

本記事解説のビットコイン自動売買ツールでは、次のようなビットコイン買い・売りサイン検知方法を採用しています。

買いサイン・ビットコイン価格がボリンジャーバンド-2σを下回った瞬間
売りサイン・売り利確:ビットコイン購入時の価格より+3%上昇した瞬間
・売り損切:ビットコイン購入時の価格より-5%下落した瞬間

【事前準備】Pythonライブラリをインストール

Pythonをもとにビットコイン情報を取得する場合、次のようなライブラリを活用します。事前にインストールしておきましょう。

ccxt|仮想通貨情報を取得する際に有効

pip install ccxt

pandas|取得した仮想通貨データの加工・整形に有効

pip install pandas

TA-Lib|テクニカル分析結果を算出するためのライブラリ

以下、ご自身のOSに合ったインストール方法をご覧ください。

【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順に記事をご覧いただくことでビットコイン自動売買ツールが自作できるようになるでしょう!

Noビットコイン自動売買を実践!自作を目指したロードマップ
参考ビットコインとは?ビットコイン投資のメリット
参考仮想通貨の自動売買とは?・仕組み・自作方法
#1初めてのビットコイン自動売買・環境構築チュートリアル
#2初めてのビットコイン自動売買・Python開発環境の構築方法
#3【Python】ビットコイン価格の取得方法
#4【Python】ビットコイン残高情報の取得方法
#5【Python】ビットコインの成行・指値注文
#6【Python】ビットコインの取引履歴を取得
#7ビットコイン自動売買のプログラム設計方法
#8【Python】ビットコイン自動取引ツールの作成方法

当サイトでは上記以外にも仮想通貨・ビットコイン自動売買に関する記事を多数配信しております。

この記事が気に入ったら
フォローしてね!

本記事をシェア!
目次