BOTの一番成績のいい最適なパラメーターをpythonで総当たりで探索しよう!さて、前回までの記事でバックテストをして自動売買BOTのパフォーマンスを評価する方法は、大体マスターできたと思います!今回は、バックテスト編の総仕上げとして最適なパラメーターを探索する方法を紹介しておきましょう。このパラメーター探索ができることこそ、ある意味、自分でpythonのプログラミングができることの優位性といっても過言ではないかもしれません。それを調べる方法を解説します。パラメーター最適化とはパラメーターとは、ある自動売買BOTのロジックの中で自由に動かして変更できる値のことをいいます。前回までの記事で学習した一番シンプルなn期間ドンチャン・ブレイクアウトBOTには、以下の2つのパラメーターがありました。1)X分足の時間軸を使う2)n期間の最高値(最安値)ブレイクアウトで買う同じドンチャンブレイクアウトでも、15分足で10期間のドンチャン・ブレイクアウト戦略を使うのと、1時間足で30期間のドンチャン・ブレイクアウト戦略を使うのとでは、全く成績が異なります。上記の2つの組み合わせだけなら、前回までの記事の方法で1つ1つを手作業で検証することも可能です。組み合わせが何百通り、何千通りと増えてくると、すべてのパターンを手作業で検証して比較するのは難しくなります。そこでpythonの出番です。pythonのようなプログラムなら、自動的に何百通りものパラメーターの組み合わせでバックテストを行い、最も利益を最大化できるようなパラメーターを探索することができます。今回はその方法を解説していきます!今回の練習で試すパラメーターまずは準備として前回までのドンチャン・ブレイクアウトのコードを改良し、以下の4つのパラメーターを設定できるようにしてみましょう。使うより実践的なドンチャン・ブレイクアウト戦略では、上値のブレイクアウトと下値のブレイクアウトで異なるパラメーターを使用することがよくあります。そのため、今までのコードを改良し、買いエントリと売りエントリで、それぞれ違う期間のパラメーターを設定できるようにしておきます。今までのコードでは、ブレイクアウトの判定基準を「過去n期間の最高値(最安値)を直近の高値が上回ったとき」としていましたが、高値ではなく終値のパターンも検証しておきましょう。上記の修正済みのコードは、以下の別記事にまとめておきます。時間のある方は自分でも挑戦してみてください!パラメーターを設定できる改良版コードパラメーターの組み合わせを総当たりでテストする方法パラメーター探索と聞くと、最近流行りの機械学習やニューラルネットワークなど、難しい数学やプログラミングスキルが必要だと誤解している方もいるかもしれません。基本的には、数千通りくらいのパターンであれば、ただの「総当たり」で全パターンを計算すれば十分です。全パターンを試しても数十秒~1分もあれば終わりますので、複雑な機械学習や最適化アルゴリズムは必要ありません。以下のようなパターンの組み合わせをすべて試したいとしましょう。]この場合、以下のようにfor文を書くことで全パターンの組み合わせを試すことができます。各組合せで実行したい処理パラメーターAのfor文処理をするなかで、1つの要素についてさらにパラメーターBのfor文処理をし、パラメーターBのfor文処理のなかの1つの要素に対してさらにパラメーターCのfor文処理をし....という入れ子構造にしていくわけですね。500通りの組み合わせについて、全てのパターンでバックテストを実行することができます。シンプルな記述方法なお、pythonでは上記のコードをもっとシンプルにして以下のように書くことができます。試すパラメーターの組み合わせなお、今回のドンチャンブレイクアウトのパラメーター最適化では、以下の組み合わせを総当たりで全て試してみることにします。768通りのパターンをテストしてみましょう。これをfor文の総当たりでテストするためには、以下のように書けばOKです。(今までの記事で作成したもの)これで総当たりのfor文の準備は完了です!最大化したい指標を決める何のためにパラメーター最適化を実施するのかといえば、リターンを極限まで高くしたいからですよね。「総利益が最大になるようなパラメーターを探す」というのも1つの方法です。自動売買BOTの評価を最終損益だけで判断するのは不十分です。厳密にいえば、私たちが探している理想の売買ロジックは、「できるだけリスクを抑えながら、できるだけ大きなリターンを得ること」にあるはずです。そのため、リスクとリターンの比率を1つの数字で表せるような指標を「最大化したい数字」に設定すべきです。このような指標には、シャープレシオ、MARレシオなど、いくつかの指標がありますが、ここでは一番オーソドックスな「プロフィットファクター」を使うことにします。損失100万円」の売買システムとでは、かなり意味が違ってきます。前者は、損失が利益のおよそ1/10で済んでいるのに対し、後者は、なんと利益の半分もの損失を出してしまっています。前者の方が安定した売買システムで、後者のほうがより不安定な(リスクの高い)売買システムということになります。」で表される指標のことをプロフィットファクター(PF)といいます。PFが大きければ大きいほど、そのシステムは安定していてリスクが小さいと評価できます。プロフィットファクターの計算コード今まで作成してきたドンチャン・ブレイクアウトのバックテスト検証コードに、プロフィットファクターを計算するコードを追加しておきましょう。2)さて、それでは実際のコードを作っていきましょう!2.pythonコードいつものように、まず最初に全コードの内容と実行結果を示します。その後コードの書き方を解説していきます。)実行結果これを実行すると以下のようなCSVファイルが出力されます。プロフィットファクター(PF)のJ列を「降順」で並び変えてみると、ドンチャン・ブレイクアウトの有望なパラメーターの組み合わせがわかります。PFで並び替え後の成績ベスト30上記のコードではトレード回数が100回に満たなかった結果データを全て捨てているので、どのパラメーターの組み合わせも最低限のサンプル数を確保できています。上位30の成績のパラメーターをみると、ほとんどが2時間足以上の時間軸なのがわかります。PFで並び替え後の成績ワースト30逆に最もプロフィットファクターの低かった(悪かった成績)30コをみると、短い時間軸(30分足)に集中しているのがわかります。ドンチアンブレイクアウトは、あまり短い時間軸には適さない戦略の可能性がありそうです。(ただし時間軸によってテストに使用しているローソク足の期間が違うので、厳密には比較できない点に注意してください。)実行結果2次はさらに範囲を絞ってテストをしてみましょう!今度は時間軸を1時間足・2時間足だけに絞り、上値ブレイクアウトの期間・下値ブレイクアウトの期間を10~55期間の範囲にして1期間刻みでテストしています。以下のようにパラメーターを設定すればOKですね。np.arange(10,56)この条件でテストしてみると以下のようなCSVファイルが出力されます。・CSV結果出力ファイル1・CSV結果出力ファイル2ファイル1は先ほどと同じくトレード回数が100回に満たなかったテスト結果を削除したもの、ファイル2は削除せずに全ての結果を残したものです。今回はファイル2を使ってみましょう。PFで並び替え後の成績ベスト30(1時間足)1時間足の上位の成績を見ると、明らかに上値ブレイクアウト(買い)の期間は40前後、下値ブレイクアウト(売り)の期間は20前後が良さそう、という傾向が見えます。判定基準は「終値」が上位を独占していますね。PFで並び替え後の成績ベスト30(2時間足)2時間足の上位の成績を見ると、上値ブレイクアウト(買い)の期間は50以上、下値ブレイクアウト(売り)の期間は20~30期間がいいようですね。「終値」でブレイクアウトの判定をした方が、トレード回数は減るものの成績が良くなる傾向にありそうです。使って調べてみるといいでしょう。Pythonコードの解説さて、それでは新しく変更した部分のpythonコードを解説しておきましょう!基本的なコードは前回まで勉強した内容とほとんど変わっていないことに気付いたと思います。集計するコード」を、まるまる上記で説明した「総当たりのfor文」の中に入れるだけですね。図にすると以下のような感じです。こののような入れ子構造になっている点だけ混乱しなければ、上記のコードで難しい箇所はなかったと思います。集計・計算した結果を表示(print)するだけでしたが、今回のパラメーター最適化のコードでは、各バックテストの結果を返すように変更する必要があります。そのためバックテスト集計用の関数に以下の部分を足しています。result各バックテストの結果を配列に記録して、それを最後にpandasで1つの表にする方法は、前回までの記事の「各トレード結果を配列に記録して最後に集計する方法」と全く同じなので、説明は省きます。不要な行を削除する唯一新しく登場したのは、最後のdrop()の箇所でしょう。今回のコードでは、トレード回数の少ないパラメーターの組み合わせを除外できるようにしています。それが以下の部分のコードです。)表名.drop()は、行のindexを指定することで、その行を表から削除することのできる関数です。これを使って以下のような仕組みで、トレード回数の少なすぎるバックテスト結果を削除しています。)なお、inplce=Trueは、現在の表データに結果をそのまま上書きする、という意味です。以上でコードの解説はおしまいです!まとめこの章の前の方の記事でも解説したように、このようなパラメーター調整には常にカーブフィッティングの問題がつきまといます。以下のような点に注意しておきましょう。(1)パラメーターの数を増やし過ぎないようにする(2)おおまかな傾向を捉えることを目的にする(3)トレード数(サンプル)が少なくならないようにする一般論としていえば、今回のドンチャン・チャネル・ブレイクアウトのように広範なパラメーターのどの値を使ってもプラスの期待値が出る、という場合で、おおまかな傾向を捉える目的(例えば、20期間あたりが一番良さそう)でパラメーターを最適化するのは問題ありません。問題があるのは、例えば、「6」という数字を使えば利益が出る、「8」という数字を使うとマイナスに転落する、「13」という数字を使えばプラスになる、といった全く連続性も傾向もないパラメーターを恣意的に調整することです。これをすると、過去データでしか利益の出せないパラメーター調整になります。今回の記事で、いったんバックテスト編はおしまいです。無料でここまで丁寧に解説して下さっていて本当にありがたいです。0スタートですが勉強させていただいています。コメントをキャンセルメールアドレスが公開されることはありません。