今回は、「トレード用プログラム」と「バックテスト用プログラム」の使い分けについてお話します。
私がプログラミングを教えた友人の中の一人が最近仮想通貨BOTを作成している様です。その友人からプログラミングについての質問を受けた際に、彼が作成したプログラムを見せてもらいました。自力で勉強しながら結構しっかり作っているな。と思った一方で一つ気になった事があります。トレード用プログラムとバックテスト用プログラムを完全に切り分けて管理していたのです。
友人に、
「バックテストをした後で、トレード用プログラムへ作りかえる時に大変だったりしない?」
と聞いてみると、
「大変!!テストしなおしてるんだよ~。どうしたら良い?」
と言ってました。
この2つのプログラムを同じ様な性質を持っているので、同時に作成していく事ができます。そしてその方がミスが少ないし、効率的です。今回にはその時彼にも伝えた内容を中心に、トレード用とバックテスト用プログラムをどの様に作っていけばベターなのか。という点についてご紹介します。
コンテンツ
トレード用とバックテスト用
トレード用プログラム
実際にトレードを行うためのプログラムになります。
プログラム処理の流れの一つを例にあげます
■トレード用プログラムの処理例
1)現在のBTC-JPYペアのレートを確認
2)板情報を確認
3)シグナルの有無を判定
4)アカウントの資産情報の確認
5)注文を出す(もしくは手仕舞いをする)
6)注文が約定したかどうかの確認
このプログラムを処理しつづければ、シグナル(例えばチャネルブレイクアウト、移動平均線など)が出た時に自動で売買をしてくれる事になります。
バックテスト用プログラム
バックテスト用のプログラムになります。
こちらも、一つのプログラムの流れを例にあげてみます。
■バックテスト用プログラムの処理例
1)過去のBTC-JPYペアのレートを確認
2)シグナルの有無を判定
3)仮想的に注文を出す(もしくは手仕舞いする)
4)一定期間の利益を計算する
処理の流れはこんな感じになります。
それぞれのプログラムの役割
各プログラムの役割をもう一度考えてみると、
・トレード用プログラム⇒実際に売買を行うプログラム
・バックテスト用プログラム⇒考えた売買指標(アルゴリズム)が有効かを検証するプログラム
となります。
売買指標を考えたら、まずはバックテストを行い、有効であればトレード用プログラムを作る流れになると思います。
これは対象とするINPUTのデータ(もしくはパラメータ)やアウトプットの形式が少し異なるだけです。ですから、両方のプログラムはほぼほぼ同じ様なものと思ってよいのです。
両方に対応できるプログラムを作ろう
では、両方に対応できるプログラムを作れる様にはどうすれば良いのでしょうか?
処理の流れを同じにする
これは意外と大切な事です。同じ様なプログラムの場合(特に、今回の様に両方のプログラムの役割が密接にかかわっている場合)、処理の流れは同じにしましょう。
トレード用は最初にデータ入力処理があるのに、バックテスト用は全く違う処理になっている状態では、見た目から全然違うプログラムになると思います。
また、main関数の中で同様の意味を持った変数を使用する場合は、変数名も同じものを使用する様にしましょう。ロジック自体も同じ場合は以下で説明します。
共通処理は関数にまとめる
トレード用とバックテスト用のプログラムの例を見ていただくと、以下の様に共通する処理はたくさんあると思います。
・(過去 or 現在の)BTC-JPYペアのレートを確認
・シグナルの有無を判定
・(実際に or 仮想で)注文を出す
最後の注文処理は別々にしておいた方が良いですが、その他の共通の処理に関しては関数化しておきましょう。そして、それぞれのプログラムから同じ関数を呼び出せばOKです。仮に関数を使い分けるとしても、処理の中における役割を統一させましょう。
一度作ったら、売買指標の判定ロジックだけを切り替える
共通処理は関数にまとめるというポリシーで、一度それぞれのプログラムを作成したとします。でも、一定期間が経過したら、プログラムの見直しが必要になるはずです。
売買指標を変更させなければならないからです。
今はチャネルブレイクアウトが有効かもしれませんが、1ヵ月もしたら通用しなくなるかもしれません。そしたら仮想通貨BOTとしての意味がありません。
ですから、常にプログラムの修正が必要になります。プログラムを修正する際には、売買指標を判定するロジックだけを切り替える様にしましょう。これまではチャネルブレイクアウトを判定していたけど、これからは移動平均線を売買指標にしよう!という場合は、その判定ロジックだけを切り替える様にすべきです。
いじる必要がないロジックは手をつけてはいけません。不要なバグを発生させる可能性があります。
計画的に改良をする
上記でお伝えしたケース以外にも、プログラムを見直したいタイミングがあると思います。自分の資産管理などもBOTで計算できる様に改良する事も後々あるはずです。そんな時も、それぞれのプログラムのどの部分を修正するか?というのは、事前に計画を立てて改良していくべきです。
また、どちらか一方を修正する際には、もう一方のプログラムにも同様の修正を入れる様にしましょう。
プログラムの管理を徹底する
今回お伝えした事を実践する事で、私の友人はトレード用プログラムとバックテスト用プログラムの管理がとっても楽になった!と言ってくれました。
プロのエンジニアであれば、かなり神経を使ってプログラムの管理を行います。最近はgitなどのバージョン管理が容易に使える様になりましたが、ちょっとしたミスがシステム全体の障害になりかねません。
バックテストですごい成績が出たから、実運用してみたら実はシグナルのロジックが古いままだったなんて話も聞いた事があります。特にトレード用のプログラムを稼働させる際には注意する様にしましょう。