【Python】ビットコインのアービトラージ(裁定取引)の実装方法|仮想通貨自動売買ツール作成支援

こんにちは、Kosei(@kay_diacc2)です!

こんな方におすすめ
  • 暗号資産(仮想通貨)の自動売買に興味がある
  • Pythonでアービトラージ(裁定取引)を採用したビットコイン自動売買システムを作成したい
目次

アービトラージ(裁定取引)とは?

アービトラージ(裁定取引)とは、同一の価値を持つ商品の一時的な価格変化を利用して利益を得る取引方法を指します。割安な市場で商品を買った後すぐに割高な市場で商品を売ると、その価格差が利益になる取引です。

暗号資産(仮想通貨)にアービトラージを適用した場合、面白いことに、取引所間で常に価格差が生じていることが分かります。この価格差が出る仕組みを利用し、仮想通貨の自動売買ツールを作ることができます。

【本記事でコード公開中!】アービトラージシステムの動作イメージ

上動画は、取引所毎のビットコイン価格推移と価格差利益を可視化したツールの動作イメージを示してます。

動画からも暗号資産取引所間では常に価格差が生じていることが分かりますね。

本記事では上記動画のようなシステムの作成方法を解説します。具体的に「取引所間の仮想通貨価格推移グラフ」と「価格差利益の計算方法」をPythonプログラミングで実装します。加えて、仮想通貨の注文方法についても補足します。

アービトラージ採用の自動売買を実現|おすすめの暗号資産(仮想通貨)取引所

スクロールできます
取引所名最低取引量現物取引手数料*1入金手数料[円]入金手数料[BTC]出金手数料[円]送金手数料[BTC]信用取引API提供ccxt自動売買おすすめ
0.0001BTCMaker:-0.01%
Taker:0.05%
無料無料0円/
400円(大口出金)
無料×★★★★★
0.0001BTCMaker:-0.02%
Taker:0.12%
無料無料550円/
770円(3万円以上)
0.0006 BTC×★★★★☆
bitFlyer*20.001 BTC0.01〜0.15%0〜330 円無料220〜770 円0.0004 BTC★★★★☆
0.0001 BTC無料無料無料330 円無料××★★★★☆
0.0001 BTC無料無料無料330 円0.0005 BTC★★★★★
0.005 BTC無料無料無料407円0.0005 BTC×★★★★★
表:暗号資産取引所の比較表(最低取引量の単位はBTCで記載)
補足
  1. 現物取引手数料の対象通貨はBTC/JPY。手数料は約定数量 × 上記記載の割合[%]として算出可能。
  2. bitFlyerの取引手数料はLightningBTC現物の手数料を表示
  3. 期間限定で4/22〜6/30に口座開設&72時間以内入金を行うと、対象者全員に2,500円相当のビットコインプレゼントとのこと!

国内で代表的な暗号資産取引所の一覧表を上記に示します。

アービトラージ採用の自動売買システムを作成する場合、以下の条件を満たす取引所が特におすすめです。

  • APIを提供していること
  • 仮想通貨の取引手数料が安いこと
  • 仮想通貨の送金手数料が安いこと

アービトラージに限らず暗号資産(仮想通貨)の取引自動化を検討する場合、取引所のAPI利用は必須です。そのため、取引所がAPIを提供しているかどうか必ず確認しましょう!

アービトラージは、仮想通貨取引・送金を短期間に何回も行う特徴があります。取引所間で価格差の歪みが大きい日は、1日数十回以上の取引が発生する可能性大です。

したがって、アービトラージでの利益最大化を目指すには、取引手数料と送金手数料が低い取引所を選ぶことを推奨します。

以上の理由をもとに筆者がおすすめする取引所は以下になります。

アービトラージ採用の自動売買システムの具体的な作り方

アービトラージによる自動売買を実現する上で必要な機能を下記に示します。

  • 取引所の仮想通貨の価格を取得する機能
  • 取引所間の仮想通貨の価格差を計算する機能
  • 仮想通貨を購入・売却する機能
  • 仮想通貨を送金する機能

これら機能を組み合わせることにより以下のプロセスが全て自動化できます。

  1. 取引所Aのビットコイン価格が300万、取引所Bが301万と確認
  2. 取引所Aでビットコインを300万で購入
  3. 取引所Bでビットコインを301万円で売却
  4. 取引所A→取引所Bに1ビットコイン送金
  5. 取引所B→取引所Aに現金300万送金
  6. 価格差により1万円の利益を取得
  7. 1〜6を繰り返す

【補足】送金プロセス

「4.ビットコイン送金」と「5.現金の送金」は、アービトラージの自動売買システムを作成する上で実装しない場合もあります。理由は「送金手数料が抑えられるため」です。

ではどうやって送金機能を実装せずにシステムを作るかというと、2つの方法があります。

1つ目の方法は「各取引所に余力ある資金を保持しておく」方法です。これにより、例えば「取引所の残高が10万円以下になるまでは仮想通貨購入・売却に対応し、10万円を下回ると売却のみ取引する」というように、注文条件を細かくプログラムできるようになります。仮想通貨の売買タイミングに残高情報を考慮したプログラミングを適用することで、通貨送金機能なしのシステムが作成できるのです。ただし、この方法は取引資金を多く準備しなければならないという考慮も必要です。少額でアービトラージを始めたい方には推奨できない方法かもしれません。

2つ目の方法は「レバレッジ取引を活用する方法」です。1つ目の方法と同じ仕組みですが、こちらの場合は少額から取引が開始できるというメリットがあります。ただし、レバレッジ取引を活用する場合、建玉保有手数料やレバレッジ取引手数料などの別の手数料が別途かかることに注意が必要です。

【事前準備】暗号資産(仮想通貨)取引所APIの取得・Python開発環境構築

Pythonでアービトラージの自動売買システム作成のために、以下の事前準備が必要です。

  • 暗号資産(仮想通貨)取引所の口座開設
  • アービトラージ取引に必要なPythonライブラリをインストール

暗号資産(仮想通貨)取引所の口座開設

自動売買ツールの作成には取引所のAPIを用いる必要があり、APIを使うには取引所の口座開設が必須です。

そのため、口座開設が未済の方は事前に開設手続きを行いましょう。口座開設はスマホと本人確認書類さえあれば10分以内に手続き完了でき、即日口座開設および暗号資産取引が可能です。

今回ご紹介するシステムでは、GMOコイン・Coincheck・Huobi Japanの取引所APIを利用します。

これら3つの取引所を利用すれば後続で紹介するプログラミングコードはコピペで動作するよう設計しています。まずはアービトラージの取引を体験したい方は同じ取引所を使うことを推奨します。筆者おすすめの優良取引所でもあるため、使い勝手も良いこと間違いなしです。

口座開設とAPIの取得方法についてはそれぞれ以下をご参考下さい。

GMOコインの口座・API情報をお持ちでない方はこちら
Coincheckの口座・API情報をお持ちでない方はこちら
Huobi Japanの口座・API情報をお持ちでない方はこちら

Pythonライブラリをインストール

ccxt

ccxtという複数の仮想通貨取引所のAPI操作を容易化できるライブラリを活用します。ターミナルやコマンドプロンプト上に以下を記述してパッケージをインストールしましょう。

pip install ccxt

matplotlib

matplotlibとはグラフ可視化に役立つライブラリです。こちらも上記同様の方法でインストールしましょう。

pip install matplotlib

【実践】Pythonで仮想通貨(ビットコイン対応)のアービトラージを実現

それでは実際にPythonでアービトラージ採用の自動売買システムの作成方法を解説していきます。

Pythonライブラリ呼出コード

取引所APIを利用するためのライブラリとグラフ可視化用のライブラリを呼び出します。以下のコードを実行しましょう。

# API通信で利用
import json
import requests
import ccxt

# グラフの可視化で利用
from time import sleep
from itertools import count
import matplotlib.pyplot as plt
import matplotlib as mpl
from matplotlib.animation import FuncAnimation
from matplotlib import rcParams
rcParams["font.family"]     = "sans-serif"
rcParams["font.sans-serif"] = "Hiragino Maru Gothic Pro"
plt.style.use('fivethirtyeight')
mpl.use('TkAgg')

取引所情報(APIキー&シークレットキー)コード

次に示すコードを記述し、各取引所で取得したAPI情報(APIキーとシークレットキー)を入力しましょう。

""" ↓要修正↓ """

# APIキー&シークレットキー(GMO)
gmo_apiKey  = "GMOコインのAPIキーを入力"
gmo_secret  = "GMOコインのシークレットキーを入力"

# APIキー&シークレットキー(Huobi)
huobi_apiKey  = "Huobi JapanのAPIキーを入力"
huobi_secret  = "Huobi Japanのシークレットキーを入力"

# APIキー&シークレットキー(Coincheck)
coincheck_apiKey  = "coincheckのAPIキーを入力"
coincheck_secret  = "coincheckのシークレットキーを入力"

""" ↑要修正↑ """

# インスタンス
huobi     = ccxt.huobijp({'apiKey':huobi_apiKey,'secret':huobi_secret})
coincheck = ccxt.coincheck({'apiKey':coincheck_apiKey,'secret':coincheck_secret})

# 取引通過(ビットコイン以外を指定したい場合はここを修正)
gmo_symbol     = "BTC"
huobi_symbol   = "BTC/JPY"
coincheck_symbol = "BTC/JPY"

仮想通貨の板情報を取得コード

取引所毎の仮想通貨の買売価格を取得するコードを以下に示します。

# GMOコイン 板情報
def gmo_ticker(symbol):
    ita_prep = requests.get('https://api.coin.z.com/public/v1/ticker?symbol'+symbol)
    result = ita_prep.json()['data'][0]
    return result

# Huobi 板情報
def huobi_ticker(symbol):
    result = huobi.fetch_ticker(symbol=symbol)
    return result

# Coincheck 板情報
def coincheck_ticker(symbol):
    result = coincheck.fetch_ticker(symbol=symbol)
    return result

アービトラージの結果可視化コード

アービトラージによる価格差利益の算出結果を可視化するコードを示します。

# グラフ軸
index            = count() # x軸(カウント)
x                = []      # x軸
y_gmo_ask        = []      # gmo(買値)
y_gmo_bid        = []      # gmo(売値)
y_huobi_ask      = []      # Huobi(買値)
y_huobi_bid      = []      # Huobi(売値)
y_coincheck_ask  = []      # Coincheck(買値)
y_coincheck_bid  = []      # Coincheck(売値)

# グラフ可視化関数
def animate(i):
    # X軸
    x.append(next(index))
    # Y軸
    y_gmo_ask.append(float(gmo_ticker(gmo_symbol)["ask"]))                    # GMO買値
    y_gmo_bid.append(float(gmo_ticker(gmo_symbol)["bid"]))                    # GMO買値
    y_huobi_ask.append(float(huobi_ticker(huobi_symbol)["ask"]))              # huobi買値
    y_huobi_bid.append(float(huobi_ticker(huobi_symbol)["bid"]))              # huobi買値
    y_coincheck_ask.append(float(coincheck_ticker(coincheck_symbol)["ask"]))  # coincheck買値
    y_coincheck_bid.append(float(coincheck_ticker(coincheck_symbol)["bid"]))  # coincheck買値

    # アービトラージ(計算)
    buy       = [y_gmo_ask[-1],y_huobi_ask[-1],y_coincheck_ask[-1]]
    sell      = [y_gmo_bid[-1],y_huobi_bid[-1],y_coincheck_bid[-1]]
    buy_min   = min(y_gmo_ask[-1],y_huobi_ask[-1],y_coincheck_ask[-1])
    sell_max  = max(y_gmo_bid[-1],y_huobi_bid[-1],y_coincheck_bid[-1])
    kakakusa  = sell_max - buy_min

    # アービトラージ(買い取引所特定)
    if buy_min == buy[0]:
        buy_name = "GMOコイン"
    elif buy_min == buy[1]:
        buy_name = "Huobi Japan"
    elif buy_min == buy[2]:
        buy_name = "Coincheck"

    # アービトラージ(売り取引所特定)
    if sell_max == sell[0]:
        sell_name = "GMOコイン"
    elif sell_max == sell[1]:
        sell_name = "Huobi Japan"
    elif sell_max == sell[2]:
        sell_name = "Coincheck"

    # グラフ設定
    plt.cla()
    main_text = "買:" + buy_name + " 売:" + sell_name + " 価格差利益:" + str(int(kakakusa)) + "[円]"
    plt.title(main_text,color="red")
    plt.xlabel("Time")
    plt.ylabel("Bitcoin[BTC]")
    plt.plot(x,y_gmo_ask ,label="GMO[買]")
    plt.plot(x,y_gmo_bid ,label="GMO[売]")
    plt.plot(x,y_huobi_ask ,label="Huobi[買]")
    plt.plot(x,y_huobi_bid ,label="Huobi[売]")
    plt.plot(x,y_coincheck_ask ,label="Coincheck[買]")
    plt.plot(x,y_coincheck_bid ,label="Coincheck[売]")
    plt.legend(loc="upper left")
    plt.tight_layout()


# アニメーショングラフ適用
ani = FuncAnimation(plt.gcf(),animate,interval=1000)

# グラフ表示
plt.tight_layout()
plt.show()

ここまで記述できましたら一度動作確認を行ってみましょう!

ビットコインアービトラージ|Pythonコード全量

前述で紹介したPythonコードをまとめたものを以下に示します。

# API通信で利用
import json
import requests
import ccxt

# グラフの可視化で利用
from time import sleep
from itertools import count
import matplotlib.pyplot as plt
import matplotlib as mpl
from matplotlib.animation import FuncAnimation
from matplotlib import rcParams
rcParams["font.family"]     = "sans-serif"
rcParams["font.sans-serif"] = "Hiragino Maru Gothic Pro"
plt.style.use('fivethirtyeight')
mpl.use('TkAgg')



""" ↓要修正↓ """

# APIキー&シークレットキー(GMO)
gmo_apiKey  = "GMOコインのAPIキーを入力"
gmo_secret  = "GMOコインのシークレットキーを入力"

# APIキー&シークレットキー(Huobi)
huobi_apiKey  = "Huobi JapanのAPIキーを入力"
huobi_secret  = "Huobi Japanのシークレットキーを入力"

# APIキー&シークレットキー(Coincheck)
coincheck_apiKey  = "coincheckのAPIキーを入力"
coincheck_secret  = "coincheckのシークレットキーを入力"

""" ↑要修正↑ """

# インスタンス
huobi     = ccxt.huobijp({'apiKey':huobi_apiKey,'secret':huobi_secret})
coincheck = ccxt.coincheck({'apiKey':coincheck_apiKey,'secret':coincheck_secret})

# 取引通過(ビットコイン以外を指定したい場合はここを修正)
gmo_symbol     = "BTC"
huobi_symbol   = "BTC/JPY"
coincheck_symbol = "BTC/JPY"

# GMOコイン 板情報
def gmo_ticker(symbol):
    ita_prep = requests.get('https://api.coin.z.com/public/v1/ticker?symbol'+symbol)
    result = ita_prep.json()['data'][0]
    return result

# Huobi 板情報
def huobi_ticker(symbol):
    result = huobi.fetch_ticker(symbol=symbol)
    return result

# Coincheck 板情報
def coincheck_ticker(symbol):
    result = coincheck.fetch_ticker(symbol=symbol)
    return result


# グラフ軸
index            = count() # x軸(カウント)
x                = []      # x軸
y_gmo_ask        = []      # gmo(買値)
y_gmo_bid        = []      # gmo(売値)
y_huobi_ask      = []      # Huobi(買値)
y_huobi_bid      = []      # Huobi(売値)
y_coincheck_ask  = []      # Coincheck(買値)
y_coincheck_bid  = []      # Coincheck(売値)

# グラフ可視化関数
def animate(i):
    # X軸
    x.append(next(index))
    # Y軸
    y_gmo_ask.append(float(gmo_ticker(gmo_symbol)["ask"]))                    # GMO買値
    y_gmo_bid.append(float(gmo_ticker(gmo_symbol)["bid"]))                    # GMO買値
    y_huobi_ask.append(float(huobi_ticker(huobi_symbol)["ask"]))              # huobi買値
    y_huobi_bid.append(float(huobi_ticker(huobi_symbol)["bid"]))              # huobi買値
    y_coincheck_ask.append(float(coincheck_ticker(coincheck_symbol)["ask"]))  # coincheck買値
    y_coincheck_bid.append(float(coincheck_ticker(coincheck_symbol)["bid"]))  # coincheck買値

    # アービトラージ(計算)
    buy       = [y_gmo_ask[-1],y_huobi_ask[-1],y_coincheck_ask[-1]]
    sell      = [y_gmo_bid[-1],y_huobi_bid[-1],y_coincheck_bid[-1]]
    buy_min   = min(y_gmo_ask[-1],y_huobi_ask[-1],y_coincheck_ask[-1])
    sell_max  = max(y_gmo_bid[-1],y_huobi_bid[-1],y_coincheck_bid[-1])
    kakakusa  = sell_max - buy_min

    # アービトラージ(買い取引所特定)
    if buy_min == buy[0]:
        buy_name = "GMOコイン"
    elif buy_min == buy[1]:
        buy_name = "Huobi Japan"
    elif buy_min == buy[2]:
        buy_name = "Coincheck"

    # アービトラージ(売り取引所特定)
    if sell_max == sell[0]:
        sell_name = "GMOコイン"
    elif sell_max == sell[1]:
        sell_name = "Huobi Japan"
    elif sell_max == sell[2]:
        sell_name = "Coincheck"

    # グラフ設定
    plt.cla()
    main_text = "買:" + buy_name + " 売:" + sell_name + " 価格差利益:" + str(int(kakakusa)) + "[円]"
    plt.title(main_text,color="red")
    plt.xlabel("Time")
    plt.ylabel("Bitcoin[BTC]")
    plt.plot(x,y_gmo_ask ,label="GMO[買]")
    plt.plot(x,y_gmo_bid ,label="GMO[売]")
    plt.plot(x,y_huobi_ask ,label="Huobi[買]")
    plt.plot(x,y_huobi_bid ,label="Huobi[売]")
    plt.plot(x,y_coincheck_ask ,label="Coincheck[買]")
    plt.plot(x,y_coincheck_bid ,label="Coincheck[売]")
    plt.legend(loc="upper left")
    plt.tight_layout()


# アニメーショングラフ適用
ani = FuncAnimation(plt.gcf(),animate,interval=1000)

# グラフ表示
plt.tight_layout()
plt.show()

【補足】仮想通貨のAPI注文とPythonでの実装方法

本記事ではアービトラージ採用の自動売買システムを構築する上で欠かせない取引所間の仮想通貨価格推移グラフ機能価格差利益の計算機能を中心に解説しました。

最終的なアービトラージシステムを実現するには「仮想通貨を購入・売却する機能」が不可欠です。この機能は下記に示す記事をご覧いただくと簡単に実装できるよう解説していますため是非合わせてご覧下さい。その他にも残高照会や注文照会方法について言及しています。

GMOコイン

Coincheck

Huobi Japan

【仮想通貨・ビットコイン】自動取引実践法・その他優良情報

最後までご覧いただきありがとうございました。当サイトでは仮想通貨・ビットコインにおける多様な自動取引手法の解説記事を多数取り扱っております。

取引所別:APIの取得手順と使い方の解説記事

スクロールできます
対応言語記事名
Python【GMOコイン】 APIで仮想通貨取引の自動化
Python【Huobi Japan】 APIで仮想通貨取引の自動化
Python【bitbank】 APIで仮想通貨取引の自動化
Python【Coincheck】APIで仮想通貨取引の自動化
Python【BITPOINT】APIで仮想通貨取引の自動化

テクニカル分析を採用した仮想通貨取引の解説記事

スクロールできます
対応言語記事名指標
共通自動売買の種類・自作時のポイント全て
Pythonリアルタイムチャート分析基礎トレンド
Python移動平均線トレンド
Pythonゴールデンクロス・デッドクロストレンド
Pythonアービトラージ(裁定取引)時間・値幅
Pythonボリンジャーバンドオシレータ
PythonMACDオシレータ
PythonRSIオシレータ
【トレンド】:値動きが上昇・下降どちらのトレンドなのか判断に有効
【オシレータ】:現在の相場に対する買われすぎ・売られすぎの判断に有効

その他仮想通貨自動トレード解説記事

スクロールできます
対応言語記事名
Python【データ収集】仮想通貨の過去データを大量取得する方法
Python【初心者向け】ccxtを活用した仮想通貨の自動取引
Node.js【初心者向け】ccxtを活用した仮想通貨の自動取引

最後に

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

本記事をシェア!
URLをコピーする
URLをコピーしました!
目次
閉じる