実際に稼働させるためのBOT(稼働用BOT)について解説をしていきます。
これまでにご紹介したプログラムではアルゴリズムを作る部分に焦点を当てていたかと思います。ただ、稼働用のBOTでは実際にプログラムがあなたの代わりにトレードをしなければなりません。
そのために必要な事を順番にご紹介します。
※関連記事⇒仮想通貨BOTのトレード用&バックテスト用プログラムの管理方法
■前提知識
・PythonによるBOT作成の基本が分かる
・CryptowatchAPIでOHLCデータの取得ができる
・システムトレードの売買注文の基本が分かる
コンテンツ
「稼働用BOT」とは?
稼働用のBOTというのは、バックテストを行うためのプログラムとほぼ同じなのですが、トレードに特化した機能としてどの様なものがあるのでしょうか?
稼働用のBOTというのは常に動き続けなければなりません。基本的にはずっと動き続けている必要があるのです。スピードが求められる処理になるので、無駄なものはなるべく省いて必要な処理だけに特化しましょう。
ここで簡単な稼働用BOTの処理例を挙げておきます。
■稼働用BOTの処理例(以下をループするイメージ)
1)初期処理:ライブラリの使用設定等
2)入力処理:資産情報、OHLC、板情報などを取得 ※ループ開始
3)情報の分析(売買シグナルが出ているか?手仕舞いのシグナルが出ているか?)
4)売買シグナルが出ていたら売買注文を行う(注文枚数の計算等も行う)
5)手仕舞いのシグナルが出ていたら手仕舞いする
6)出力処理:必要な情報をログファイルなどに出力
7)一定時間後、次の入力処理を行う
バックテスト用のプログラムとの違いなども意識しながら見てみて下さい。
稼働用BOTの初期処理
仮想通貨BOTとして初期処理というのはあまり多くはありません。
初期処理として代表的なのは各種変数の設定と、ライブラリの使用設定くらいです。
各種変数の初期設定
Pythonの場合、変数は使用したい箇所で記載すれば良いので、初期処理としてはあまり多くはありません。ただ、事前に使用が決まっている変数(特にトレードの情報を格納しておく変数)についてはプログラムの始めに初期化をしましょう。
必要ライブラリの情報設定
トレードのためにccxtなどのライブラリを使用する場合は、最初にAPIキー&Secretを設定して、ライブラリが使用できる形にしておく必要があります。
1回設定をしてしまえば、あとはオブジェクトを使いまわすだけですから、扱いが非常に簡単です。この他にも、他のライブラリや、共通で使用可能なパラメータ情報がある場合は、初期処理で1回だけ行う様にしましょう。
稼働用BOTの入力データ
稼働用BOTは「一定時間毎」に最新の情報を取得して、シグナルの有無などを判定しなければなりません。必要な情報には以下の様なものがあります。
※稼働用BOTの場合の入力データは都度取得が必要になります。対して、バックテストの場合は基本的にデータの取得は最初の1回でOKです。
OHLCデータ
cryptowatch APIなどから取得するOHLCデータです。
1時間足を基準にしたトレードであれば、1時間毎に最低1回は最新のデータを取得する必要があります。
ちなみに、Pythonの場合、OHLCデータは配列に入れると思います。その場合、最新のデータは[-2]で指定します。
※Pythonの場合、配列の最後のデータを[-1]、最後から2番目を[-2]と指定します。
あれ、でも最新のデータだったら[-1]を指定すべきでは?と思ったかもしれませんね。実は[-1]のデータは現在作成中のOHLCデータなのです。そのため、高値、安値などがまだ変わる可能性があるデータになります。
トレード手法によって、この辺りの考え方は異なりますが、基本的には最新データの終値を基準にシグナル判定をする事が多いので、基本にならって最新データは[-2]と覚えておきましょう(-1はまだ終値が出ていません)。もちろん明確な理由があれば変更してOKです。
取引所の口座情報
始めはあまり気にしなくとも良いかもしれませんが、本格的なシステムトレードをしたいと思ったら口座の情報も取得する必要があります。
ただし、この情報を取得するのは実際にエントリーが出た時だけで基本OKです。
※エントリーの際に口座情報を取得するAPI操作を関数化しておきましょう。
この口座情報から取得すべきなのは、基本的には「資産情報」です。資産状況に合わせてトレード枚数を変えていくのが一般的ですから、段々と資産が増えてきたら、ぜひこのロジックも追加しましょう。
Ticker情報
Ticker情報(板情報とも呼ばれる)を活用したBOTを稼働させる場合には、取引所の対象通貨ペアのTicker情報を常に取得し続ける必要があります。
実際のトレードで使用するケースは少ないですが、実際の板の情報がないと正確なトレードはできない。。。というトレーダーも結構います。
データを頻繁に取得する必要があるため、APIの使用制限などに引っ掛からない様に注意が必要です。
BOTを稼働させ続ける
次に稼働用BOTは文字通り、稼働させ続けなければなりません。
では、どの様に稼働させるのでしょうか?
その① 「ループ処理」- while文
一つはPythonのwhile文を使って、処理をループさせる方法です。
while文のループを止める方法はいくつかあります。
・予め稼働させる時間・ループ回数を決めておく
・実行トリガーのファイルを用意しておく(ファイルが存在する間ループ)
・無限ループさせる(Anaconda Promptの画面から強制停止)
特別、こだわりがなければ無限ループでも良いかもしれません。Anaconda Promptoは簡単に強制停止ができますからね^^
ただ、Anaconda Promptを操作できない場所からでも停止させたい!という事を考えると、他の停止方法も検討した方が良いかもしれません。
ここではWhileループを使ってループ処理を行う例を見てみましょう。簡単なprint出力コードです。
■サンプルコード(ループ回数を5とした場合)
1 2 3 4 5 6 7 |
from time import sleep i = 1 while i <= 5: print("{}回目の処理".format(i)) sleep(0.1) i = i +1 |
■結果
1 2 3 4 5 |
1回目の処理 2回目の処理 3回目の処理 4回目の処理 5回目の処理 |
この場合は分かりやすくループ回数を5回としていますが、以下の様に記載をすれば無限ループも簡単です。(強制停止方法は検討して下さい)
1 |
while True: |
その② 「cron」or「タスクスケジューラ」
Linuxであれば「cron」、Windowsであれば「タスクスケジューラ」を使用する方法もアリです。
ただ、この方法には一つデメリットがあって、一度プログラムが実行されると処理が完了してしまいます。メモリ上にデータを保持する事ができません。
そのため、エントリー状況などに関するデータをファイル等で保持する、といった仕組みが必要になります。
この方法でも問題無いという場合は簡単に使用ができます。
ここではLinux環境にて、cronを使って一定時間毎にプログラムを実施する例を見てみましょう。簡単なprint出力コードです。
■サンプル(cronの場合)
・crontabの設定(Pathは通しておいて下さい。もしくは絶対パス指定して下さい)
1 |
*/10 * * * * python /home/source/test_bot.py |
・Pythonコード
1 2 3 |
from datetime import datetime workDT = datetime.now().strftime("%Y/%m/%d %H:%M:%S") print ("処理を実行しました。日時:"+str(workDT)) |
■実行結果(イメージ)
1 2 3 4 5 |
処理を実行しました。日時:2018/11/10 08:00:15 処理を実行しました。日時:2018/11/10 08:10:15 処理を実行しました。日時:2018/11/10 08:20:15 処理を実行しました。日時:2018/11/10 08:30:15 処理を実行しました。日時:2018/11/10 08:40:15 |
一体どっちが良いの^^?
基本的にはWhileのループを使った方が良いと思います。
cronの場合だと、一回実行する毎にプログラムの処理が完了してしまうため、メモリ上にデータを蓄積する事ができません。そのためファイル入出力など、別の処理が必要になります。
※いずれにしても今後必要にはなると思いますが^^;
環境制約、BOTの運用方法によって、最適な方法は異なると思いますが、どちらでもOKなのであれば、まずはWhileなどのループ文を活用する方が良いと思います!
このサイトでもループを使って稼働させる想定でプログラムを作成していきます。
稼働用BOTの出力データ
稼働用BOTでは、基本的に画面への出力などはしなくともOKです。
ただ、売買の実績を保存しておく必要があるので、必要な情報をファイルに保存する様にしましょう。
ちなみに、cronやタスクスケジューラを使う場合は、毎回処理結果をファイル出力する必要があります。while文などのループ処理でBOTを稼働させる場合は、メモリ上にデータを保存しておき、最終的にファイル出力するという処理でOKです。
では、実際に出力すべきデータを挙げてみます。
売買データの保存
売買した結果はファイルに出力して保存しておきましょう。
処理ログ
処理結果をログファイルに出力します。売買の内容については含まず、あくまで処理結果のみ出力します。
エラーが発生した場合は、エラー原因等が特定できる様に処理状況を結果出力しましょう。
BOTを稼働させる際に考慮が必要な事
さてBOTを稼働させる上で考慮しなければならない事もあります。
エラーチェック
BOTを連続で稼働させようと思ったらエラーチェックは必須です。
特にAPIへのリクエスト結果が意図せずエラーになる事があるので、リクエストエラー時にどの様な振る舞いをするのか?をコードに落とし込む必要があります。
APIの使用制限
取引所API、cryptowatchAPI等々、稼働用BOTを正しく動かし続けるためにはAPIにリクエストを行い、必要な情報を取得し続けなければなりません。
その際に要注意なのは、APIに使用制限が設定されている場合です。10秒に1回までとか、1分間に3回までとか、色々なルールがあります。
そのためAPIの使用制限については理解をした上で、上限にかからない様にコーディングする必要があります。
強制停止
ループ処理で連続稼働させている場合に、どうしてもすぐに止めたい!と思う事があると思います。(cronやタスクスケジューラの場合は設定を止めればOK)
AnacondaPromptで実施をしている場合であれば、止めるは非常に簡単ですが、他の実施方法の場合には、強制ですぐにBOTを停止させる様な仕組みを考えなければなりません。
例えば、ファイル存在確認による強制停止処理というものがあります。
例えば「exec.txt」というファイルを作成し、ループ条件として「exec.txt」の存在チェックを行います。「exec.txt」というファイルが存在していなければ、ループを停止してBOTの終了処理をする。という流れになります。
止めたい時にファイルを削除すれば良いだけなので、非常に楽な停止方法です。
まとめ
さて、稼働用BOTの作成の仕方について今回はご紹介しました。
実際に稼働させ続ける中で改良した方が良いという部分はどんどん改良しましょう。そうする事で実運用に耐えるものができあがるはずです。さらにトレード手法が優秀なものであれば、利益にも繋がっていくはずです。
今回は少し抽象的な部分もあったかもしれませんが、稼働用BOTの基本になる考え方だと思っているので、しっかりと押さえておきましょう。