EAにある程度のランダム性を持たせたい
EAを作っていると避けられないことの一つが「最適化」。
EAはプログラムなので、0か1かきちんと判断してトレードを行います。
例えば、ボリンジャーバンドにタッチしたらエントリーというロジックの場合、裁量トレードだと、相場によっては、タッチしていなくてもチャートパターンなどを見てエントリーをするといった場面があると思いますが、EAの場合、きちんとタッチが確定するまでトレードを行いません。
また期間も20日か21日か一つ違うだけで成績が変わってしまいます。
より良い成績を求めて最適化すると、それは過去のヒストリカルデータに合わせた成績、過剰最適化であって今後の相場にも同じように合うか分かりません。
ならいっそ最適化要素をランダムにしてみようと思い試してみることにしました。
【 MathRand()を使って乱数化してみる】
MathRand() ・・ 0から32767の正数をランダムに返す疑似乱数の関数です。
こちらは、過去に売買方向をランダムエントリーするEAだったり、乱数によってロジックを切り替えるEAなどに組み込んだりしたこともありましたが、今回は、こちらをインジケーターの期間などに組み込んでみたいと思います。
ベースには、このEAを使用してみたいと思います。
例えばMAの期間を乱数化したい場合、
int RandMA =MathRand() %6+20; //乱数を20~25の間で発生させます。
iMA(NULL,0,RandMA,0,1,0,0); //MAの期間に20~25をランダムで代入します。
こんなイメージで常にEAが稼働している間、インジケーターの期間が変更されるので、エントリーのタイミングがその時々で変わります。
その他にも例えばRSI30を下抜けで買いたい場合、40~20などに乱数化なども出来ます。
ロジックそのものは変更されないので、損失を出したり相場そのものに合う合わないは別の話になりますが、「過去の相場では、20日の成績が良かったが、直近では25日の方が成績が良い」などの過剰最適化に繋がりやすい思考をある程度避けることが出来るのではないだろうかと思います。
デメリットですが、常にインジケーターの期間などが変更されるためかEAの挙動が非常に重いのでバックテストが非常に時間が掛かってしまう点です。
バックテストで重いということはリアル稼働でも重い可能性があります。
思いつきで作って見たので、まだフォワードテストは開始していません。
試しみようと思います。
こちらのEAですが、気休めみたいなものなので意味があるかは分かりませんし、フォワードと乖離することを許さない人が一定数いるので、公開予定は今のところありません