バイナンス(BINANCE)APIで仮想通貨の自動売買botを自作しよう【初心者向け】

プログラミング 仮想通貨

あなた

あなた
「仮想通貨取引所のAPIを使って自動売買をしてみたいな。でも、国内取引所だと取り扱ってる銘柄が少なすぎるし、アルトコインがたくさん揃ってるバイナンスで自動売買できないかな?」

そんな疑問にお答えします。

自動売買に興味があっても、国内取引所では主にビットコインとかイーサリアムが中心。他に取り扱うアルトコインの銘柄も少ないですよね。

でも、海外取引所のバイナンスを使えば、超マイナーコインでもない限りはほぼ全ての銘柄で自動売買が可能です。

あなたが自動売買したい銘柄は何ですか?バイナンスで色んな銘柄を自動売買できるPythonプログラムを作ってみましょう。

ご注意
本記事は、プログラミングでAPIを活用する知識を学ぶことを目的としています。バイナンスでの仮想通貨の取引をおすすめしているわけではありません。この記事や本サイトの情報を参考に仮想通貨のプログラムを動かす場合は、全て自己責任でお願いいたします。免責事項に記載の通り、本サイトの情報を参考にして発生したいかなる損害も責任を負いません。

この記事で分かること

  • バイナンスAPIを使った仮想通貨の自動売買botの作り方
  • 自動売買botプログラムの仕組み

バイナンス(BINANCE)APIで仮想通貨の自動売買botを自作する前に

バイナンスAPIで自動売買botを作る

バイナンスで自動売買してみたい!っていうあなた、もしかすると国内取引所の取り扱っている仮想通貨の銘柄数が少ないのが不満ですか?

確かに少ないんですよね。しかも、ビットコイン(BTC)とかイーサリアム(ETH)以外のマイナーな銘柄になってくると、取引量も少ない。

取引量が少ないということは、売買の発生するタイミングも少なくなります。すなわち、せっかく自動売買botプログラムを動かしても、チャンスそのものが少ないわけですね。

だからこそ、海外取引所のバイナンス。世界一の仮想通貨取引所なので、取引量も世界一。取り扱っているアルトコインの数もたくさん。自動売買するにはもってこいの取引所です。

バイナンス(BINANCE)を使う前に国内取引所でウォーミングアップ

仮想通貨の自動売買が初めてであれば、まず国内取引所のAPIを使ってウォーミングアップしてみるのもアリですよ。

どの仮想通貨取引所のAPIもできることは大体同じなので、先に国内取引所のAPIから使い始めるとこんなメリットがあります。

  • すぐに取引開始できる(海外取引所へ送金する手間がない)
  • 自動売買のメリット&デメリットを安全に体験できる
  • 後からバイナンスAPIを使ったPythonプログラムを見ても理解が早くなる

これから自動売買botプログラムを試してみたい人には、割といいことだらけ。事実、私もまずは国内取引所から試しました。

いきなりバイナンスから始めなくても、安心&安全に始めることができますね。

例えば以下の記事では、国内取引所のAPIを使った仮想通貨の自動売買botを紹介しています。最初の一歩として、参考にしてみてください。

バイナンス(BINANCE)APIを使った仮想通貨自動売買botの仕組み

バイナンスAPIの自動売買botの仕組みを理解する

まず最初に、バイナンスAPIを使った自動売買botプログラムの仕組みを理解していきます。

このような流れで理解しながら作っていきましょう。

  • バイナンスAPIの使い方を理解する
  • バイナンスAPIを使った自動売買botプログラムを理解する
  • 自動売買botプログラムを実際に動かしてみる

一つずつ掘り下げていきます。

バイナンスの口座を持っていない方

まだバイナンスの口座を持っていない方は、バイナンスのサイトで事前に開設しておくのを忘れずに。

口座の開設には時間がかかります。先にサクッと申請をしておけば、後からすぐにバイナンスでの自動売買botを動かすことができます。

バイナンスで口座を開設する(公式サイトリンク)

Pythonプログラミングをしたことがない方

今回作ってみるバイナンスAPIを使った自動売買botプログラムは、Pythonというプログラミング言語を使います。

まだPythonを使ったことがない!プログラミングが初めて!っていう人は、コチラのPython入門記事を参考にしてみてくださいね。

プログラミングって怖い!なんて思ったあなた、やってみると分かりますが思った以上に簡単ですよ。

バイナンス(BINANCE)APIの使い方を理解する

最初のステップは、バイナンスAPIの使い方の理解から。

この記事で一つずつステップを踏みながら詳細を解説しているので、熟読してみてください。自動売買に必要なAPIキーの発行方法も網羅して解説してあります。

これを読めば、バイナンスAPIの使い方が簡単に理解できること間違いなし。

あなた

あなた
「内容の理解はいいから、まずPythonプログラムをコピペして動かしたい!」

そんな場合は、もちろんそのまま読み進めてもらっても大丈夫です。でも、可能であれば後からでも読んでおくのがオススメ。

なぜなら、バイナンスAPIを使った仮想通貨取引の仕組みを理解しておくと、自動売買botプログラムそのものも理解しやすくなるから。

プログラムで何が起こっているのか?を自分で理解できていると、安心して自動売買botを動かすことができますからね。

バイナンス(BINANCE)APIを使った仮想通貨自動売買botのプログラムを理解する

バイナンスAPIの自動売買botの仕組みを理解する

次に、バイナンスAPIを使った自動売買botプログラムを理解していきます。

プログラムの全体像がこちら。なるべくシンプルにしました。


import time
import pandas as pd
from binance.client import Client

API_KEY = 'XXX'
SECRET_KEY = 'XXX'
binance = Client(API_KEY, SECRET_KEY, {"timeout": 20})

ticker = 'ADA'          # 取引したい銘柄
currency = 'USDT'       # USDT建て
interval = 60*1         # チャート足(60*1 は 1分足)
duration = 20           # 移動平均サイズ
trading_amount = 100    # 一回の売買で取引する金額(ドル)

symbol = ticker + currency
df = pd.DataFrame()

def get_ex_rate(history):
    history.reverse()
    for i in range(len(history)):
        if history[i]['isBuyer'] == True:
            return float(history[i]['price'])

while True:
    time.sleep(interval)

    ticker_info = binance.get_ticker(symbol=symbol)
    df = df.append({'price': float(ticker_info['lastPrice'])}, ignore_index=True)

    if len(df) < duration:
        continue

    df['SMA'] = df['price'].rolling(window=duration).mean()
    df['std'] = df['price'].rolling(window=duration).std()
    df['-2sigma'] = df['SMA'] - 2*df['std']
    df['+2sigma'] = df['SMA'] + 2*df['std']

    ticker_balance = binance.get_asset_balance(asset=ticker)
    position = round(float(ticker_balance['free']), 0)

    if position:
        history = binance.get_my_trades(symbol=symbol)

        if df['price'].iloc[-1] > df['+2sigma'].iloc[-1] \
                and get_ex_rate(history) < df['price'].iloc[-1]:

            order = binance.order_market_sell(symbol=symbol, quantity=position)
            message = 'sell ' + str(position) + ticker + ' @' + ticker_info['lastPrice']
            print(message)

    else:
        if df['price'].iloc[-1] < df['-2sigma'].iloc[-1]:
            amount = round(trading_amount / float(ticker_info['lastPrice']), 0)

            order = binance.order_market_buy(symbol=symbol, quantity=amount)
            message = 'buy ' + str(amount) + ticker + ' @' + ticker_info['lastPrice']
            print(message)

    df = df.iloc[1:, :]

全部で60行くらい。たったこれだけで、バイナンスの仮想通貨自動売買ができちゃうんです。

各セクションに分けて一つずつ解説していくので、この自動売買botの仕組みを理解しちゃいましょう。

appendメソッドが非推奨になりました

pandas1.4以降のバージョンよりappendメソッドが非推奨となり、実行すると"The frame.append method is deprecated..."というWarningが出るかと思います。

以下の記事で紹介したソースは、その代替メソッドとなるconcatを使って同様の計算をしています。ぜひカスタマイズの参考にしてみてください。

必要なライブラリをインポート

最初は、必要なライブラリのインポートから。

import time
import pandas as pd
from binance.client import Client

1行目のtimeは、定期的にプログラムを動作させるための time.sleep を使うためです。

2行目のpandasは、ボリンジャーバンドの計算用。今回の自動売買botプログラムでは、ボリンジャーバンドという指標を使っています。

ボリンジャーバンドって何?
-> 統計学を応用したテクニカル指標のひとつ。ボリンジャーバンドの+/-2σ(標準偏差)の範囲内に収まる確率は約95.4%になる。
引用:マネックス証券

統計学上予測される約95.4%の確率の値動きから外れたタイミング、すなわちレアな価格変動があったタイミングを狙って自動売買をさせるわけですね。

そして3行目のbinance.clientは、バイナンスAPIを使うためのライブラリのインポートです。

APIキーからバイナンスAPIを扱うインスタンス作成

続いて、バイナンスAPIを取り扱うインスタンスを作成します。

API_KEY = 'XXX'
SECRET_KEY = 'XXX'
binance = Client(API_KEY, SECRET_KEY, {"timeout": 20})

ここは見たままの理解でOK。API_KEYにはあなたのAPIキーを、SECRET_KEYにはあなたのシークレットキーを入れます。

APIキーの発行は、バイナンスAPIの解説記事を参考にしてみてくださいね。

3行目で、APIキーやシークレットキーの情報をもとに、あなたのバイナンス口座にアクセスできるインスタンスを作っています。

取引したい銘柄とトレード条件を設定する

ここでは、取引したい銘柄と条件を設定します。

ticker = 'ADA'          # 取引したい銘柄
currency = 'USDT'       # USDT建て
interval = 60*5         # チャート足(60*5 は 5分足)
duration = 20           # 移動平均サイズ
trading_amount = 100		# 一回の売買で取引する金額(ドル)

tickerは、あなたの取引したい銘柄を入れます。この例ではカルダノADAコインですが、ビットコインならBTC、イーサリアムならETH、みたいに変更できます。

currencyは、自動売買に使う通貨。ここではUSDTを設定していますが、ビットコイン建てで買うならBTC。簡単ですね。

intervalは、自動売買を判断する間隔。ここでは5分足に設定してあります。1時間足にしたい場合は、60*60(60秒 x 60 = 1時間)にするなど、自由に設定できます。

durationは、ボリンジャーバンドを把握するための移動平均という計算に使います。大体 20 - 25 あたりの設定が多いですね。ちなみに、バイナンスでの初期値は21でした。

最後にtrading_amount。これは一度に自動売買する金額で、この例では一回の自動売買を100ドル(1万円強)にしてあります。ひとまず制限しておけば安心。

ただ、この取引金額を低く設定しすぎるとこんなデメリットもあるので要注意です。

  • そもそも取引できない(取引所の定める最小発注数量に満たない)
  • 自動売買した差益より取引手数料の方が高くなる(損する)

最小発注単位は、バイナンス公式サイトに記載されています。例えばBTC/USDTなら、0.000001BTC or 0.01USDT or 10USDT、が最小発注数量。

USD(S)Marketsのタブから見れるので、あなたの取引したい銘柄に合わせて最小取引数量に注意してくださいね。

また、バイナンスの手数料は、バイナンス公式サイトに記載の通り取引金額の0.1%。(本記事執筆時点)

例えば、このプログラムの例の通り100ドル(1万円強)自動売買したなら、0.1ドル(10円強)が手数料です。自動売買する金額を小さくしすぎて、手数料より自動売買の差額の方が小さくならないようにだけ、気をつけておきましょう。

自動売買中に処理するデータを設定する

このセクションは、自動売買中の計算処理に使うデータを設定しています。

symbol = ticker + currency
df = pd.DataFrame()

symbolは、自動売買のペアを保存しておくペア。BTCUSDT、みたいな文字列を作っています。

dfは、データフレーム(DataFrame)。ここに、価格情報やボリンジャーバンドの情報を入れます。計算部分の詳細は、後ほど登場。

取引履歴から購入レートを検索する関数を作る

このセクションは、取引履歴を渡して購入レートを算出する関数です。売買条件を判断する時に呼び出します。

def get_ex_rate(history):
    history.reverse()
    for i in range(len(history)):
        if history[i]['isBuyer'] == True:
            return float(history[i]['price'])

引数(history)に、バイナンスAPIで取得できる過去の取引履歴リストを渡します。

そして、その取引履歴リストを reverse() で反転して、最新の取引情報をリストの先頭にもってきます。目的は、検索時間を減らすため。最新の取引から検索した方が早いですからね。

あとは for でリストをサーチして、一番最後に購入(isBuyerがTrue)した時の価格を拾って返しています。

なお、BINANCE APIを活用する目的のためにわざとこの関数を使っていますが、より簡単なプログラムにするなら買い注文が約定した時にそのレートを変数に格納して使い回すだけでもOKです。

定期的に処理を実行して価格情報を収集する

続いて、このセクション。ここでは、一定間隔で処理を起こして価格情報を収集しています。

while True:
    time.sleep(interval)

    ticker_info = binance.get_ticker(symbol=symbol)
    df = df.append({'price': float(ticker_info['lastPrice'])}, ignore_index=True)

    if len(df) < duration:
        continue

1-2行目、While True で処理を止めずに回しつつ、interval に設定した間隔を待ってから後に続くプログラムを動かします。この辺は簡単ですね。

2-3行目、ticker_info にバイナンスAPI経由でsymbol(BTCUSDT等)の情報を取得して、その中にある価格情報をdf(データフレーム)に追加。

最後の if len(df) の条件判断は、移動平均を計算できる長さ(duration)に価格情報が貯まるまで、先に進まないようにしています。

ボリンジャーバンドを計算する

このセクションでは、ボリンジャーバンドを計算しています。分からない場合は、読み流してもオッケー。

df['SMA'] = df['price'].rolling(window=duration).mean()
df['std'] = df['price'].rolling(window=duration).std()
df['-2sigma'] = df['SMA'] - 2*df['std']
df['+2sigma'] = df['SMA'] + 2*df['std']

1行目は、duration の回数分だけ貯めた価格情報から平均を計算しています。

2行目は、標準偏差。詳細は割愛しますが、価格の平均値に対して過去の値動きがどれくらいばらついてるか?の指標です。

3-4行目は、ボリンジャーバンドの上限と下限の幅を計算しています。平均(1行目)から偏差(2行目)の2倍を足したり引いたりしているだけ。

sigma(σ,シグマ)というのは標準偏差のことで、その+/-2倍の幅という意味です。このボリンジャーバンドの情報を、後のセクションで解説する自動売買の条件判断に使います。

おさらいしておくと、この+/-2σの範囲内に収まる確率が統計学上では約95.4%、でしたね。

保有ポジションを確認する

このセクションでは、あなたの保有しているポジションをチェックしています。

ticker_balance = binance.get_asset_balance(asset=ticker)
position = round(float(ticker_balance['free']))

1行目は、あなたが自動売買している銘柄(ticker)の情報を、あなたの口座情報から取得しています。

そして2行目で、自動売買している銘柄をあなたが今どれだけ持っているかを確認。

名前の通り、自動売買している銘柄のポジションを持っているか?の判断に使います。

条件が揃ったタイミングで売り注文を出す

ここから、自動売買をするセクションです。まずは売る方から。

if position:
		history = binance.get_my_trades(symbol=symbol)

		if df['price'].iloc[-1] > df['+2sigma'].iloc[-1] \
						and get_ex_rate(history) < df['price'].iloc[-1]:

				order = binance.order_market_sell(symbol=symbol, quantity=position)
				message = 'sell ' + str(position) + ticker + ' @' + ticker_info['lastPrice']
				print(message)

1行目のifの条件では、自動売買している銘柄のポジションがあるのか?をチェック。

そもそもポジションがない(まだ買ってもいない)状態では、売ることもできませんからね。

2行目では、過去の取引履歴を取得。そして3行目以降にifの条件分岐がきますが、この2つの条件判断をしています。

  1. 最新価格が、ボリンジャーバンドより上振れたか?
  2. 最新価格が、購入時レートより高いか?
    (取引履歴のhistoryからget_ex_rateで取得)

ここが、まさに自動売買を狙うタイミング。大きな値動きがあって、かつその価格が前に買った時の価格より高くなっているか?を確認しています。

ここまでの条件が揃った上で、4行目以降の売り注文を実行。あなたが自動売買している銘柄(symbol)を、あなたの保有ポジション(position)で成行売りです。

5-6行目では、オーダー結果を簡単に出力して確認できるようにしています。「Sell 10BTC @30000」みたいな表示になります。

条件が揃ったタイミングで買い注文を出す

今度は、買う方のセクションです。

else:
		if df['price'].iloc[-1] < df['-2sigma'].iloc[-1]:
				amount = round(trading_amount / float(ticker_info['lastPrice']), 0)

				order = binance.order_market_buy(symbol=symbol, quantity=amount)
				message = 'buy ' + str(amount) + ticker + ' @' + ticker_info['lastPrice']
				print(message)

まず if の条件分岐は、最新の価格がボリンジャーバンドより下振れたか?の確認です。

最新価格がボリンジャーバンドの底値よりも下落したタイミングであえて買う、という条件。すなわち「逆張り」ってやつです。

3行目のamountは、最新の価格情報と、あなたの購入したい金額(trading_amount)から、注文する量を計算しています。

そして、4行目が実際の買い注文。成行で欲しい量を買い切ってます。5-6行目は、そのオーダー結果の出力ですね。

価格やボリンジャーバンドの情報を更新する

最後のセクションは、価格情報とボリンジャーバンドを入れているデータフレームの更新。

df = df.iloc[1:, :]

ぱっと見はややこしいですが、一番古い情報を一つ消して上書きしています。メモリを一つズラして上書きしたイメージ。

そして一つ空いたメモリに、また最新の価格情報と計算したボリンジャーバンドの情報を入れていく感じです。

バイナンス(BINANCE)APIを使った仮想通貨自動売買botを動かす

バイナンスAPIの自動売買botの仕組みを理解する

ここまで理解したら、あとは動かすのみ。

以下の項目は、あなたが取引したい銘柄やタイミングに合わせて調整してみてください。

ticker = 'BTC'          # 取引したい銘柄
currency = 'USDT'       # USDT建て
interval = 60*5         # チャート足(60*5 は 5分足)
duration = 20           # 移動平均サイズ
trading_amount = 100		# 一回の売買で取引する金額(ドル)

それから、プログラムを動かす前に必要なライブラリをインストールしておきましょう。この2つだけです。

pip install pandas
pip install python-binance

python環境を汚したくない人は、仮想環境を立てるのを忘れずに。仮想環境って何?っていう方は、以下の記事を参考にどうぞ。

最後に、プログラムを main.py というファイルにコピペして、以下のコマンドで実行です。

python3 main.py

これで自動売買スタート!以下の条件でテストしてみたところ、ちゃんと動いていることも確認できました。

  • 銘柄 :カルダノADAコイン
  • 取引量:100ドル
  • 間隔 :1分足
buy 42.0ADA @2.37400000
sell 42.0ADA @2.38500000
...

安かったのでADAコインにしてみましたが、利益はざっくり30円ほど笑。でも、ちゃんと動いていますね!

なお、筆者が実際に自作の自動売買botを3日間ほど運用してみた結果も以下の記事にまとめてあります。

この記事ではビットバンクのAPIを使っています。ボリンジャーバンドを使って自動売買するとどういう結果になるのか?ひとつの参考にしてみてください。

自動売買botを止めずに動かし続けるにはどうしたら良い?

あなた

あなた
「パソコンで動かしたのはいいけど、パソコン切ったら自動売買botって止まっちゃう?」

その通りです。一番簡単な方法はパソコンをつけっぱなしにして放置。例えば、不活用のPCとかを使ってもいいですね。

ただ、どうせならVPS(サーバー)で動かしておくともっと楽ですよ。月額500円前後で運用できるので、自動売買botをきっかけに運用してみるのはいかがでしょうか?

自動売買botをVPS(サーバー)で動かす方法は、この記事にまとめてあります。参考にしてみてくださいね。

バイナンス(BINANCE)APIで仮想通貨自動売買botを極めよう

仮想通貨自動売買botを極めよう

この記事では、バイナンスのAPIを使った仮想通貨の自動売買botを紹介しました。

とてもシンプルなプログラムですが、このプログラムをベースにして色々と応用も可能です。

本記事ではボリンジャーバンドを自動売買の条件判断に活用しましたが、他にもゴールデンクロス/デッドクロスといった参考になる指標はたくさんあります。

あなたの試してみたい自動売買の方法、自己責任で拡張して色々チャレンジしてみてくださいね!