第13回目の本記事では、自動売買で必要なロジックを作成していきます。クラスを作成してコードを読みやすくしよう!まずは「どのような自動売買ロジックを組んでいくのか」を紹介します。そのあと、プログラムでビットコイン価格を取得して、「買い」か「売り」を判定する方法まで解説していきます。この記事で売買注文するための準備をしていきましょう!なおコードを作成するにあたり、前回の記事で作成したmain.pyを使っていきます。今回は以下の条件になったとき、「買い」と「売り」を入れるプログラムを作成します。観測地点のビットコイン価格が[latex]+2\sigma[/latex]を上回ったときここで登場する[latex]+2\sigma[/latex]と[latex]-2\sigma[/latex]を理解するには、ボリンジャーバンドについて知る必要があります。いえ、ボリンジャーバンドをしっかり理解しようとすると、大学で習う統計学の知識が必要です。そこで今回は、直感的に理解できるようチャートを確認しながらボリンジャーバンドについて紹介していきます。ボリンジャーバンドとは?以下は1時間足のBTC/JPYチャートです。緑と赤でスティックになっているのが、ビットコインの価格推移です。今回は価格推移だけでなく、BB:UpperとBB:Lowerも描かれています。このBBがボリンジャーバンドです。同じ色の線で上下セットになっていて、内側からそれぞれ[latex]1\sigma[/latex]、[latex]2\sigma[/latex]、[latex]3\sigma[/latex]と呼びます。内側に存在する青い線は[latex]1\sigma[/latex]です。上側の線を[latex]+1\sigma[/latex]、下側の線を[latex]-1\sigma[/latex]と呼びます。ボリンジャーバンドが意味するものボリンジャーバンドを使うと、価格が各ライン内におさまる理論的な確率が分かります。分かりにくいので、具体的に見ていきましょう。[latex]1\sigma[/latex]〜[latex]3\sigma[/latex]ごとに、価格がライン内におさまる確率は以下のとおりです。約99.7%つまり以下のグラフで言えば、価格が最も内側の青いラインにおさまる確率は約68.3%ということになります。ボリンジャーバンドを使うと、値動きの上限と下限をある程度は把握できるようになります。今回のロジックの狙いここまでおさえた上で、今回プログラムで組んでいきたいロジックを振り返ってみます。観測地点のビットコイン価格が[latex]+2\sigma[/latex]を上回ったとき要するに、今回使っていきたいのは[latex]\pm2\sigma[/latex]です。図で表すと、以下の紫の線になります。ここで描かれている紫線の内側におさまる確率は約95.4%でした。今回はそれを下回ったときに「買い」を入れて、上回ったときに「売り」を入れます。図で確認すると、以下のようになります。ほとんどの場合は約95.4%の確率で[latex]\pm2\sigma[/latex]におさまるけど、もし例外が発生したら売買をおこなうということです。これくらいシンプルなロジックだと、プログラムの作成もそこまで難しくありません。自動売買に必要なロジックの作成それでは自動売買で必要なロジックを作成していきましょう。自動売買プログラムの作成にあたり、以下のステップが必要になります。Pandasをインストールする今回は追加でPandasというライブラリをインストールします。Pandasを使う理由は、自動売買で必要になる移動平均や標準偏差をラクに計算できるからです。いうわけでPandasをインストールするために、以下のコマンドを実行しましょう。pandasインストールが完了したら、Pandasをインポートします。secret_key=SECRET_KEY)print(coincheck.last)﻿これでPandasを使う準備が完了しました。最新価格を取得し続けるライブラリのインポートが完了したら、さっそくコードを書いていきます。今回必要になるのは、ビットコインの最新価格を取得するcoincheck.lastです。取得したビットコイン価格を、PandasのDataFrame(データフレーム)に格納していきます。このDataFrameを活用することで、簡単に[latex]\pm2\sigma[/latex]の計算をおこなえます。いうわけで、DataFrameにビットコインの最新価格を入れるためにコードを編集しましょう。ignore_index=True)print(df)﻿これでmain.pyを実行すると、以下のような出力になるはずです。6503280.0これがpriceというカラムを持ったDataFrameです。データが1つだと分かりづらいので、forループでAPIに5回アクセスして価格を追加しましょう。このとき各回ごとに1秒間の休止状態を入れます。その理由は、繰り返しアクセスすることで、コインチェックのサーバーに負荷がかかってしまうからです。Pythonで1秒間の休止状態を入れるには、timeライブラリをインポートしてtime.sleep(1)を使います。)print(df)﻿ここではintervalという変数を準備してから、1秒間の休止を設定しました。上記のコードを実行すると、以下の出力になるはずです。6503649.0これで1秒おきにビットコイン価格を取得できるようになりました。今回は「ビットコインの最新価格を取得し続ける」ので、以下のようにWhile文を使ったコードに修正します。ボリンジャーバンドを計算する次にやるべきことは、取得した価格を使ったボリンジャーバンドの計算です。ボリンジャーバンドを計算するには、「過去どれくらい遡って価格情報を使うのか」を指定する必要があります。1日ごとに価格を取得しているのであれば、「どれくらいの日足を使って計算するのか」ということです。今回は過去20回の価格情報を使って、ボリンジャーバンドを計算していきたいと思います。[latex]\pm2\sigma[/latex]の値は、以下の計算式で求められます。\end{eqnarray}$$SMAというのは、単純に過去20回分の価格平均です。[latex]\sigma[/latex]は標準偏差のことで、要するに価格のバラツキを表します。[latex]\sigma[/latex]が大きければ、バラツキも大きいということですね。[latex]\sigma[/latex]は数学が分からないと少し難しいですが、Pandasを使えば簡単に計算できます。それではコードで書いてみましょう。print(df)﻿これでビットコイン価格の取得と、[latex]\pm2\sigma[/latex]の計算までおこなえます。ポイントはSMAとstdの計算です。Pandasを使うことで、それぞれ1行のコードで簡単に記述できます。引数のwindow=durationでは、あらかじめ先に決めておいた変数duration=20が入ります。durationに20を選択している理由は、過去20回分の価格を元に「平均と標準偏差を計算したいから」です。言い方を換えると、過去20回分の価格データが必要なので、それまでは価格取得に注力しています。過去20回分の価格を使った平均と標準偏差の計算結果は、df['SMA']とdf['std']として新しいカラムに格納しています。それではコードを実行して、出力を確認してみましょう。6.564988e+06このように、20行目では過去の価格データを使った[latex]\pm2\sigma[/latex]の計算ができていますね。「買い」または「売り」の条件を書くあとは計算したボリンジャーバンドを元に、「買い」と「売り」の条件を書くだけです。「買い」と「売り」の条件を書くには、直近で取得した価格と[latex]\pm2\sigma[/latex]の値を比較する必要があります。DataFrameで最後の値を参照するにはdf['カラム名']iloc[-1]を使います。このことを応用すれば、作成したいコードは以下のようになります。print('sell!!!')﻿これで直近の価格と[latex]\pm2\sigma[/latex]を比較できます。条件判定の中身はprint()で補っていますが、次のレクチャーで売買注文のコードを作成します。自動売買に必要なロジックを作成してみよう!というわけで、この記事では自動売買に必要なロジックを作成しました。想像していたよりも簡単にコードを書けたのではないでしょうか。次回の記事では、売買の部分もコードを書いていき、自動売買ロジックを完成させたいと思います。第14回目の本記事では、条件分岐を追加して売買ロジックを完成させます。寄稿、記事の掲載依頼はお問い合わせページからお願い致します。当サイトで使用する「仮想通貨」とは、「暗号資産」のことを指します。当サイトで使用する「仮想通貨」とは「暗号資産」のことを指します。当サイトで掲載している情報に基づいて被ったいかなる損害についても、運営者及び情報提供者は一切の責任を負いません。保証されたものではありません。