前回は最適化を途中で中止するボタン「ストップボタン」を作りました。
[EasyLanguageでシステムトレード]OptimizationAPIで最適化を中止するボタンを追加しよう
いよいよ今回は、複数銘柄に対してバックテストを行う方法を紹介します。
いままで紹介したやり方だと、複数の銘柄でバックテストしようとすると、チャート分析上に1つずつストラテジーを適用して、バックテストして…を繰り返さなくてはいけません。
非常に面倒です。。システムトレードをする上で、多くの銘柄で長期間でバックテストができないと、そのストラテジーが本当に有用なのかは見極められません。
EasyLanguage(OptimizationAPI)を使えば、複数銘柄でのバックテストがプログラムで可能となります。
プログラムコード例を下の方に書いているので、コピーすれば、簡単に設定できます。
バックテストのやり方はわかっても、試したい投資手法が無くなってきた。。。
そんなあなたには、投資本を紹介します。

目次
銘柄の最適化方法を設定する
これまで、ストラテジーの変数の最適化をしてきました。それと同様に、「銘柄の最適化」も可能です。
つまり、「このストラテジーを使って、もっとも利益が出る銘柄はこれだ」というのがわかります。
ですが、利益の出る銘柄がわかったところで、たまたまの可能性も高いですし、その銘柄だけが今後も同じような値動きをする可能性は低いと思います。
したがって、システムトレードをする上で、銘柄の最適化は、そこまで利用価値のないものかと、私自身は思っています。
ですが、そんな「銘柄の最適化」のやり方を別の方法で使えば、複数銘柄でのバックテストおよび最適化が可能となります。
その方法を以下で紹介します。
inputs文の変更

これからは、ここまでのプログラムはある前提で進めます。もし無い場合は、過去記事を参照してください。
inputs文で、Symという変数で、銘柄コードを指定していました。
今回は、この銘柄コードの最適化および複数銘柄でのバックテストなので、ここでは指定しません。
ちなみに、消すときは、普通に「backspace」などで消してもよいですが、EasyLanguageの場合、「//」を行の先頭につけることで、コメントアウトもできます。
その行は、プログラムとして無視しますよということができます。
さらに、複数の行を1度にコメントアウトしたい場合、{ }でくくると、その範囲はコメントとなります。
DefineJobメソッド

続いて、「DefineJob」メソッドを変更します。
vars文で、「resultoptions」と「optsymbol」を宣言しましょう。
それぞれ、保存するテストケース数の設定と、複数銘柄で最適化する際に必要です。
保存するテストケース数とは、たとえば、一銘柄でストラテジーの変数は一種類であれば、1ケースとなります。
二種類の銘柄で、二種類の変数で最適化する場合は、2×2=4ケースとなります。
大量にバックテストする場合、これを大きな値に設定しておかないと、全結果が保存されないことになります。
続いて、begin文の中身ですが、銘柄コードの設定文は削除しましょう。
その代わり、複数銘柄の記述を追加しましょう。
optsymbol=job.Securities[0].Optsymbol;
上記は、複数銘柄でテストする際のおまじないです。
optsymbol=Addsymbol(“7203”);
この文で、銘柄コード7203で、バックテストをするという記述になります。
上の画像を見るとわかるように、続けて同じ文を書いており、今度は銘柄コード7267を指定しています。
こうすることで、7203と7267でバックテストをすることができます。
みなさんもうお分かりだと思います。
そうです!この文をひたすら追加すれば、複数銘柄についてバックテストできるのです!
ひたすら書いていくのは、プログラム的には、かなりダサいですが、仕方ありません。
これで、複数銘柄でバックテストができるならよしとしましょう。
あとは、resultoptionsを設定すれば完成です。
つまり、画像のように「SetNumTestsToKeep」を250に設定することで、250ケースを保存できます。
なお、画像のようにストラテジーを設定すると、
ストラテジー1「Bollinger Band LE」で、10ケース
ストラテジー2「Bollinger Band KE」で、10ケース
銘柄で2ケース
以上から、10×10×2=200ケースとなります。
したがって、250ケースまで保存できるようにしておけば、十分です。
これで、プログラムが完成したので、いつも通り、F3キーで検証して、トレーディングアプリを実行してみてください。
結果を確認してみよう

結果をcsvファイルに出していると思いますので、中身を確認してみましょう。
例のごとく、結果の並び順は利益の大きい順ですが、銘柄のところに二種類出ていると思います。
エクセルの機能として、「フィルター」機能があります。
たとえばこれを使えば、あるストラテジーの変数のときの、結果だけに集約されます。
最後に、利益を足し算すれば、複数の銘柄に対してストラテジーを適用した際の、結果がどうなるかがわかります。
フィルターがメンドウ!というのであれば、ストラテジーの変数の最適化をやめて、ストラテジーの設定のみをすれば良いです。

上の画像のように、OptRangeの文を削除すれば、問題ありません。
その際の、ストラテジーの変数は、ストラテジー内で設定されている値がそのまま使われます。

Addsymbolでもうひとつ銘柄を増やしてバックテストをしてみると、上の画像のような結果が得られました。
この内、NetProfitの合計がそのストラテジーを3つの銘柄に対して適用したときの、利益です。
残念ながら、32,560円の損失となります。
プログラムコード例
以下に上で挿入したプログラムコード例を書いています。コピーしてお使いください。
optSymbol = job.Securities[0].OptSymbol;
optSymbol.Addsymbol("7203");
optSymbol.Addsymbol("7267");
resultoptions = job.Settings.ResultOptions;
resultoptions.SetNumTestsToKeep(250);
さいごに
EasyLanguage(OptimizationAPI)で、複数銘柄でのバックテストの方法を説明しましたが、いかがでしたでしょうか。
システムトレードをする上で、バックテストはとても大事です。
さらに、複数の銘柄で試さないと、機会も少ないですし、再現性が低いです。
今回紹介した方法で、みなさんのストラテジーの有効性を確かめてみてください。

初めまして、このサイトを見て日々勉強させていただいております。質問なのですが OptimizationAPIで足種を分足から日足に変更したいのですがどうすればよいかお知恵を拝借できませんでしょうか?
security.Interval.SetMinuteChart(MinuteInterval);
の部分を何かにかえればよいのでしょうか?
どうぞよろしくお願い致します。
YIさま
はじめまして。管理人ののっちです。
ブログ見ていただき、ありがとうございます。
質問いただいた件ですが、
security.Interval.SetMinuteChart(MinuteInterval);
を
security.Interval.SetDailyChart();
と書き換えてみてください。
これで日足となるはずです。
ちなみに、最後の()も忘れずに書いてください。
これで解決しなければ、またご連絡下さい。
今後とも、よろしくお願いします❗
はじめまして。私も本サイトで勉強させていただいております。
先にある質問と同じく足種の日足についてなのですが、
security.Interval.SetMinuteChart(MinuteInterval);
を
security.Interval.SetDailyChart();
と書き換え、
ストラテジーの最適化は不要なため、以下の2つをコメントアウトしたところ、
//strategy.ELInputs.OptRange(“NumDevsDn”, 1, 3, NumDevsStep);
//strategy.ELInputs.OptRange(“NumDevsUp”, 1, 3, NumDevsStep);
結果のNet Profitがすべて0になり、正常に動作していないように思います。
ストラテジーの最適化を有効にすると、0以外の結果が返り、正常動作していると思います。
ストラテジがエントリーできるチャートがなかったのかと思い、
DaysBack、LastDateを変更、GUIのストラテジーパフォーマンスから取引がされていることなどは確認いたしましたが、これ以上はお手上げのため、ご教示をお願いいただけないでしょうか。
いけたけ様
遅くなってしまい申し訳ございません。
いけたけ様と同じように、コメントアウトしてみましたが、
私の場合、うまく動作しているようです。
(Net Profitはゼロ以外の結果が返ってくる)
これと同じ内容を、いけたけ様のメールアドレスに送付しましたので、
差し支えなければ、プログラムのデータを送付いただけないでしょうか。
すぐに解決できず申し訳ございませんが、ご確認のほどよろしくお願いいたします。
管理人 のっち
管理人 のっち様
いつも楽しく勉強させていただいております。エラーについてご質問させて頂きたく、連絡いたしました。
複数銘柄のバックテスト中、ある銘柄で「Optimization Error: エラーメッセージを取得中です。 再試行してください」と表記されて処理が止まってしまいます。毎回、特定の銘柄でエラーが発生するようなのですが、エラーが起きてもその銘柄を飛ばして処理を続行する方法などございますでしょうか。恐縮ですが、ご教示いただければ幸いです。
ゆー様
いつもブログを見ていただいてありがとうございます。
返信遅くなり、申し訳ございません。
誠に申し訳ございませんが、解決方法は私にはわかりません。。
OptimizationAPIの仕様で、途中でエラーが出ると、OptErrorに飛んでしまうので、それを書き換えるとなると、大変難しいと思います。
解決できず申し訳ございません。
トレステフォーラムで質問してみるのも1つの手だと思います。
のっち