【Python3】MACDによるビットコインの自動売買botの作り方【GMOコイン編】

この記事では、Python を使った仮想通貨(今回は Bitcoin です)の自動売買 bot の作り方を解説します。
前回の記事ではコインチェックのAPIを使って、ボリンジャーバンドに従って自動で仮想通貨を購入するコードを公開しました。

【コピペOK】仮想通貨をPythonで自動売買する方法を初心者向けに解説

2020年12月7日
今回は他の人気のテクニカル指標であるMACDを用いて、 GMOコインで自動売買する方法を解説します。

この記事のゴールは、
仮想通貨の価格の観察をしばらく行った後、MACDの買いシグナルが出た瞬間に買い注文を出すコードを作成する
ことです。

例によってサンプルコードを掲載しているので、これをコピペするだけでも一応はbotを動かすことができます。
(アルゴリズムを洗練させたり、エラー処理をしっかり書いたりしてから実運用することを推奨します)

ビットコインの自動売買を行うまでの流れ

まず始めに、ゼロからビットコインの自動売買を行うまでの流れを簡単に説明します。
自動売買を始めるまでの流れ
1 仮想通貨の取引所に口座開設する
2 API キーを発行する
3 コードを書いて動かす
今回はたまたま GMO コインでの自動売買 bot を作りますが、どこの取引所を使おうとビットコインの自動売買を行うまでの手順は大体同じです。
(すでに自動売買 bot 動かした経験があるという方は、1と2は飛ばしてコード部分だけを見ていただいても結構です)

1と2に関しては誰がやっても同じなので、淡々と手順通りやっていけば OK です。
ポイントは3の「コードを書いて動かす」の部分ですね。

今回公開するコードでは、メジャーなテクニカル指標の一つであるMACDを単純に使用することで、仮想通貨購入のタイミングを判定しています。
しかし、コード中にコメントで示した部分を改造することで、深層学習を組み込んだボットにしてみたり全く別のテクニカル指標を使ってみたりと色々な発展が可能です。

MACDとは?

補足としてMACD について知らない人の為に、簡単にこの指標の意味を解説しておきます。
MACDは株価やFXのレートが上昇トレンドなのか下降トレンドなのかを判定するためのテクニカル指標です。

二つのMACDとシグナルという2つの指標の大小関係から、買いなのか売りなのか判定します。
(MACDという指標にまたMACDという部品を使っているようで、ややこしいですね)

MACDについて詳しく知っておきたい方は、下のサイトが分かりやすいと思います。
https://aibashiro.jp/contents/yg00015/


さてそれでは、実際のbot作成作業に入っていきましょう。

GMOコインに口座開設し、APIキーを発行するまで

まずは口座開設APIキーの発行です(既に完了している方は飛ばしていただいて OK です)。
APIって何ぞ?という方へ
APIとは、 GMO コインのサーバーを我々のプログラムから操作するための窓口のようなものだと考えてください。
APIを動かすには、2種類のパスワードのようなもの(APIキー)をあらかじめ発行しておいて、プログラム実行時に入力する必要があります。

口座開設

GMOコインの口座を持っていない人は、まずは下のリンクから口座開設してください。

無料でGMOコインの口座を開設する

遷移先のページでメールアドレスを入力すると、すぐさま認証用メールが届きます。
届いた認証用メール内のURLをクリックして、メール認証を完了してください。
個人情報の確認に移れます。

個人情報の確認

メール認証後、ログインしたページ内で個人情報の確認を行います。
必要な本人確認のステップ
・電話番号認証
・住所氏名などの入力
・本人確認書類(免許証など)のアップロード
本人確認書類の提出は、複数角度からの撮影やリアルタイム認証などを求められてなかなかに面倒でした笑

提出後、数日待つと審査結果が届きます。
無事に審査が終わると、口座開設コードがメールに記載されています。
ログインして口座開設コードを入力しましょう(下画像参照)
これで、ようやくAPI キーの発行を行うことができます。

APIキーの発行

さて API キーの発行です。 まずは普通にログインしてください。
PCの場合、左側のメニューの API のところをクリックします(下画像参照)。
すると API キーの新規作成という画面が立ち上がると思います。
ここではAPIラベルの設定や、 API の用途を設定することができます。
APIラベルは、自分がわかりやすいものであれば何でもいいです。
僕は適当に「APIキーその1」としておきました。
APIの機能についても、口座からの出金などの危なそうな機能は初めから提供されていないので、僕はすべての機能にチェックを入れておきました。

ビットコイン自動売買bot作成

さて、いよいよビットコイン自動売買 bot の作成に入りましょう。
先ほど API キーの発行がすんだことで、 API を使えるようになりました。

しかし直接APIを使うよりも、先人が開発してくれた API ラッパーを使用する方が開発のコストが格段に下がります。
ここでのラッパーとは、「APIを使いやすくするライブラリ」と考えておけばOKです。
Pythonの場合、有志の方が作ってくれた API ラッパーが pip で簡単にインストールできるので、非常に便利です。

APIラッパーを使う

GMOのAPI ラッパーをインストールするには、ターミナルや Windowsのコマンドプロンプトで下のように打ち込むだけです。
pip3 install -U git+https://github.com/MtkN1/gmocoiner.git
取り敢えずこれでAPIラッパーが使えるようになります。
ラッパーの使い方が分からなくなった時は、その都度元のgithubリポジトリを参照すると良いでしょう。
せっかくターミナルを立ち上げたので、pandas(データ分析用のPythonライブラリ)がまだインストールされていない人はついでにインストールしておきましょう。
pip3 install pandas
ここまでで準備は全て完了しました。

コード本体

さていよいよ自動売買botの本体です。
まずは全体を載せておきます。
from gmocoiner import GMOCoin
import json
import time
import pandas as pd


#セキュリティの問題で、APIキーはコードに直接書かない方が良い
api_key = input("APIキーを入力してください")
secret = input("APIシークレットを入力してください")

#だいたい何秒くらいbotを作動させるか
working_time = 1800

#interval_sec秒ごとに価格データを取得し、売買するか判定する
interval_sec = 30

#MACDのパラメーター(短期移動平均の期間、長期移動平均の期間、シグナルの計算に用いるMACDの期間)
short_duration = 9
long_duration = 26
signal_duration = 9

gmo = GMOCoin(api_key, secret, late_limit=True, logger=None)

#初めの何回か(デフォルトでは40回)は取引をせずに価格データをただ集める
#この辺はボリンジャーバンドの記事(https://in-base.com/crypt-auto-trading-coincheck)の時と同じ
def price_data_collecting(how_many_samples=40):
    print("まずは今から"+str(how_many_samples*interval_sec)+"秒間、価格データを収集します。")
    price_list=[]
    for i in range(how_many_samples):
        price_list.append(float(gmo.ticker(symbol='BTC_JPY').json()["data"][0]["last"]))
        time.sleep(interval_sec)

    print("収集が完了しました。")
    return price_list

#初めのサンプル価格データの収集
sample_data=price_data_collecting()

#空のデータフレーム作ってさっき集めたデータを入れる
df=pd.DataFrame()
df["price"]=sample_data

for i in range(int(working_time/interval_sec)):

    #直近価格を取得し、先程のdfに加える
    price = float(gmo.ticker(symbol='BTC_JPY').json()["data"][0]["last"])
    df=df.append({'price': price}, ignore_index=True)

    #MACD関連の計算を行う(この辺を書き換えれば、自分の好きなアルゴリズムで自動売買が可能になる)
    df["short_SMA"] = df["price"].rolling(window=short_duration).mean()
    df["long_SMA"] = df["price"].rolling(window=long_duration).mean()
    df["short_EMA"] = df["short_SMA"]*(1-1/(short_duration+1))+df["price"]/(short_duration+1)
    df["long_EMA"] = df["long_SMA"]*(1-1/(long_duration+1))+df["price"]/(long_duration+1)
    df["MACD"]=df["short_EMA"]-df["long_EMA"]
    df["signal"]=df["MACD"].rolling(window=signal_duration).mean()

    #MACDがsignalを下から突き抜ける時(=MACD-signalが負から正に変わるとき)がゴールデンクロス(=買いシグナル)と考える
    df["MACD-signal"] = df["MACD"]-df["signal"]
    I_should_buy = df.iloc[-2]["MACD-signal"]<0 and df.iloc[-1]["MACD-signal"]>0

    if I_should_buy:
        order_resp=gmo.order("BTC_JPY","BUY","MARKET","0.01").json()
        print("ゴールデンクロスを検出したので、成り行きで0.01ビットコインの買い注文を出します。")
        print("GMOからの応答:"+str(order_resp))
    else:
        print("何もしません。")

    #先頭行を削除してdfの長さを一定に保つ(長時間の運用時のメモリ対策)
    df=df.drop(df.index[0])
    time.sleep(interval_sec)

コードの動きの解説

今回のコードの動きを説明しておきますね。

プログラムが起動した直後は、今の相場の状況が全く分かっていません。
そこでしばらくは何もせずに価格データを集めます。
デフォルトでは30秒ごとにビットコインの価格を40回(つまり1200秒間)収集します。

サンプル価格の収集が終わったら、forループに入ります。
ループ内では、新たに価格を収集する度にMACD関連の指標を計算して、今ビットコインの購入を行うべきなのかどうかを考えます。
直近収集した価格時点で、MACDがシグナルを下から突き抜けている場合(=ゴールデンクロス)買いのチャンスだと判断して、成り行きでの買い注文を行います。

日本円を入金してコードを回すと、タイミングによっては実際に買い注文が出るはずです。
(逆に言うとお金を入れずにコードを回しても何も起きません)

pandasのデータフレームをいじっているところ(MACD関連の計算をしているところ)を変更することで自分なりのアルゴリズムで動くbotを作ることができます。

ということで今回は GMO コインで作動する bot を作ってみました。
下の記事でコインチェックで作動する bot(こちらはボリンジャーバンドを使っています)も作っているので興味がある方は是非チェックしてみてください。

【コピペOK】仮想通貨をPythonで自動売買する方法を初心者向けに解説

2020年12月7日

【保存版】仮想通貨の取引所APIを徹底比較。自動売買に最適な口座はココ!

2020年12月26日
スポンサーリンク

SNSシェアお願いします!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA