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

・仮想通貨の自動売買botを作りたいけどやり方が分からない

・将来的に自分でアルゴリズムを考えてビットコインを自動で取引したい

・今後、裁定取引(アービトラージ)なども試してみたい

・ディープラーニング等を取り入れた仮想通貨の自動売買に興味がある
という方を対象に記事を書いていきます。

この記事を読めば、誰でもPythonで書かれた自動売買プログラムを動かせるようになります。
というかコードをすべて無料公開してるので、コピペするだけでも今すぐ自動売買 bot を動かせます。

さらに、コードはプログラミング初心者でも改造しやすいものにしておきました。
自分でディープラーニングを使った仕様に変えたり、裁定取引をやったりと色々と発展もできます。

なお、この記事でのコードは仮想通貨の中でもビットコインを対象にしています。
また今回のコードは、コインチェックの口座を開設していないと使えません。
コインチェックを使う理由
・API がプログラムから扱いやすい

・ビットコインの取引所の売買手数料が無料(これ重要)

・マネックスグループの傘下に入ってセキュリティがしっかりしてきた
まだ開設していない人は、まず下のリンクからコインチェック口座を開設してください。
(遷移後のページの指示に従えば、30分以内に自動売買に必要な API キー発行までできるはずです。)

無料でコインチェック口座を開設する

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

2020年12月26日

下準備その1:pythonをインストール

まずは今回使うプログラミング言語の Python をインストールしてください。
順調にいけば、5分もかからずにインストール出来るでしょう。
(参考:Pythonのインストール方法)

一応言っておくと、使うのは Python 3系です。
既にPythonインストール済みだよ!という人はここはスルーしてオッケーです。

下準備その2:coincheck口座を開設

(既にコインチェックの口座を持ってる人はここは飛ばして OK です)
まず、冒頭で貼ったリンクからメールアドレスとパスワードを登録してください。
その後届く認証メールを踏み、以下の作業を終えてください。
やるべき作業
・利用規約(いっぱいある)に同意

・電話番号認証

・本人確認書類提出(セルフィーとか何枚か画像提出する必要あり。少しめんどい)
本人確認書類が承認されることで入金が可能になります。
ちなみに承認されるのを待たなくても、次のステップである「APIキーの発行」は可能です。
とりあえず、先にやってしまいましょう。

自動売買用のAPIキーを発行する

APIキーとは、取引所に
・今の仮想通貨の価格を教えてくれ

・この値段で買い注文を出してくれ
といった命令を出す時に必要になる、パスワードのようなものです。

ビットコインの自動売買 bot を動かすためにはアクセスキーシークレットキーの二つが必要になります。
これらの取得方法を説明しますね。
コインチェックのAPIキーの取得方法
①まずはコインチェックの管理画面から設定画面に移行してください(たぶん歯車のマークを押せば行けます)

②設定画面の「APIキー」をクリック

③画面の指示に従って、Googleの認証アプリをスマホにインストール

④このアプリで認証し、APIキーを発行する(「新たにAPIキーを追加する」から設定)
成功すると下のスクショのように、 API キーが取得できているはずです。
成功した状態:APIキーが表示されている(アクセスキーは重要な情報なので隠している)

これで Python からプログラムで取引所に命令を出す準備が大方整いました。
本人確認書類の承認が来れば、入金が可能になり実際に自動売買を始められます。

待ち時間の間に、記事のこれ以降の部分を読んだり、プログラムの一部を自分で動かしたりして本番に備えてください。
ちなみに僕は、万が一にAPIキーが流失した場合に備えて、④のときにビットコインの送金や日本円の出金は出来ないように設定しておきました笑

自動売買に必要なpythonライブラリをインストール

さて次は、自動売買 bot 動かすために必要なライブラリをインストールしておきましょう。
まずはcoincheck用のpythonライブラリのインストールです。
とは言っても普通にpipで入ります。

Macの人はターミナルで、Windows の人はコマンドプロンプトまたは powershell で下のように一行打ち込むだけです。
pip3 install coincheck
なお、このライブラリについての説明は主に下のリンクから読むことができます。 迷った時は、ここを読めばだいたい解決します。

coincheckライブラリについてのドキュメント

同様に、(まだ入って無ければ)pandasなどもインストールしておいてください。
pip3 install pandas
pandasとは
pythonで有名なデータ分析ライブラリ。特に金融関係のデータ解析で非常に良く使う
こちらも一行でインストール完了ですね。

Pythonコード本体。コピペで今すぐ自動売買botが動きます

さて肝心の Python コードの本体です。
今回のプログラムがやることは以下の通りです。
今回のコードの動き
・まず、しばらくは売買せず10秒ごとにBTC価格を観察(これを約250秒間続ける)

・それ以降は、今までと比べて価格がめっちゃ下がってたら買い注文を入れる(デフォルトでbotは約300秒間動きます)
これだけです。シンプルですね。

価格がめっちゃ下がった時に注文を入れると言いましたが、今回はボリンジャーバンドと呼ばれるものを使っています。

簡単に言うと、過去20回観察した価格データと比較して、現在の価格が標準偏差で2σ区間以上低いなら買うということです。
要は今の価格が偏差値30以下なら、買いのチャンスだろうと判断するということですね。

コード中にコメントで示した部分を書き換えることで、自分の好きな売買アルゴリズムに変更することもできます。
今流行りの(?)ディープラーニングのアルゴリズムに変えると良い bot ができるかもしれませんね。
また、他の取引所でも API キーを発行すれば、価格差を利用する裁定取引(アービトラージ)のコードにも発展していけるでしょう。

以下がコードの全体になります。
from coincheck import market,order
import time
import pandas as pd


access_key = input("APIのアクセスキーを入力してください")
secret_key = input("APIのシークレットキーを入力してください")

#約何秒間botを起動させるか
working_time = 300

#何秒ごとに価格データを確認するか
interval_sec = 10

#初めの何回か(デフォルトでは25回)は取引をせずに価格データをただ集める
def price_data_collecting(how_many_samples=25):
    print("まずは今から"+str(how_many_samples*interval_sec)+"秒間、価格データを収集します。")
    price_list = []
    for i in range(how_many_samples):
        price_list.append(m1.ticker()["last"])
        time.sleep(interval_sec)

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


m1 = market.Market()
o1 = order.Order(secret_key=secret_key,access_key=access_key)

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

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


#ボリンジャーバンドの期間。20とすることが多い
#今回の場合、要するに過去20個の価格サンプルの内、今の価格の偏差値が30以下の場合に買い注文をいれるということ
duration = 20
sigma =2


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

    #最新の価格を取ってくる
    price_now = m1.ticker()["last"]
    df = df.append({'price': price_now,}, ignore_index=True)

    ##この辺りのロジックを書き換えれば、自分の好きなアルゴリズムで自動売買botが作れる
    #移動平均と標準偏差を計算
    df["SMA"] = df["price"].rolling(window=duration).mean()
    df["std"] = df["price"].rolling(window=duration).std()

     #注目している σ区間の境界線(今回は下にsigma分、つまり偏差値30以下)
    df["limit"] = df["SMA"]-sigma*df["std"]

    #最新の値段がσ区間を超えているか判定
    #今回は 「低すぎる値なら下がり過ぎなので、その時の価格で買うべき」という考え方を想定
    I_should_buy = df.iloc[-1]["price"] < df.iloc[-1]["limit"]


    if I_should_buy:
        print("買い注文を実行します。")
        print(o1.buy_btc_jpy(rate=str(price_now),amount=0.005))

    else:
        print("売買はありません。")

    #先頭行を削除してdfの長さを一定に保つ(長時間の運用時のメモリ対策)
    df = df.drop(df.index[0])
    time.sleep(interval_sec)
なおセキュリティの都合上、APIキーはコードの中に直接書かずにプログラムの実行時にその都度入力するようにしています。
開発の時は、めんどくさいのでコードの中に直接書きたい気持ちにかられると思いますが、やる時は自己責任でお願いしますね笑

今回のプログラムについて質問がある場合は、このブログのお問い合わせや Twitter の DM などで受け付けています。
バグの報告なども受け付けています。
必ず応答できるわけではありませんが、気軽に絡んでください。

ちなみに他の取引所の API のコードには対応していないので、質問したい方は必ずコインチェックの口座を開設してください。

無料でコインチェック口座を開設する
なお、
コードのいじり方が良くわからない
という方は、おそらくpandasの扱いに慣れていないことが原因だと思われます。
とりあえず下の書籍(pandas開発者執筆です)を理解すれば、自由自在にコードを書き換えることができるはずです。 さらに、今後deep learningを使って アルゴリズムをパワーアップしたいという方はまずは下の書籍から入門するととってもわかりやすいです。

ゼロから作るDeep learning | Pythonで学ぶディープラーニングの理論と実装

以上です。 エンジョイ仮想通貨ライフ!
スポンサーリンク

SNSシェアお願いします!

13 件のコメント

  • はじめましていつも楽しく拝見させていただいております。私も公開されているコードをもとにツールを作ってみようと思ったのですが、shell上でアクセスキーが表示されるところで止まっております。
    これは自身のAPIキーが間違って入力されているということなのでしょうか??ご助力頂けましたら幸いです。よろしくお願いします。

    • コメントありがとうございます。

      さて、掲載コードを改変なしで使用しされたと仮定して話をします。

      仮にターミナル上でAPIキーを間違って入力したとしても、
      「まずは今からXX秒間、価格データを収集します。」
      という表示は出るはずなので、API入力間違いが原因では無いと思います。

      何かエラーログなどは出ていますか?

  • はじめまして。
    参考にさせていただいております。
    BTC購入後、何%の利益が出たらBTC残高をすべて売るというプログラムは作れますでしょうか。
    BTC残高の取得方法などを調べているのですがいまいちよくわからず。。。
    参考コードご教授いただけないでしょうか。

    お忙しい中申し訳ありませんが、
    ご確認お願い致します。

  • プログラムは必要な箇所を変更して貼り付けるだけで動きますか?
    上のプログラム後に何か入力が必要ですか?

    • 実行後にターミナル上で2種類のAPIキーを入力する必要があります。

      input()関数のところを直接APIキーの文字列に変更すれば入力は必要ありませんが、第三者にコードが流出すると危険なので記事の例ではinput()形式にしています。

      • プログラム72行目まで画面にエラーなく表示されたらプログラムが実行されていると言うことですか?

        • ターミナルで実行するので、画面にコードは表示されません。

          「Pythonファイル 実行方法 コマンドプロンプト」
          「Python 実行方法 ターミナル」

          などでググってみてください。
          (どういう問題が発生しているのかよく分からないので的外れな点に言及していたらすみません、、)

  • コメントを残す

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

    CAPTCHA