BandCrossのFX自動売買

勇敢に

EAの最適化

開発者によって違いはあるかと思いますが、自動売買を行うプログラムであるEAでは多かれ少なかれ最適化という作業を行っています。 最適化の代表的な方法はパラメータを変化させながらバックテストを行い成績が良いパラメータ値を採用する方法ですが、もちろんそればかりではありません。 私の場合、概ね以下のような3種類の最適化を行っています。

1. 自分の好みで最適化(これは最適化と言えるのか。。。)

私の場合オーダに関するパラメータがこれに該当します。TakeProfitやStopLossをどのくらいにしようかというのはまず自分の好みで決めています。最終的にはその値近辺でバックテストを行いますがそれでも一番成績の良いパラメータを採用するとは限りません。というのもバックテストでは出来るだけ損切りしないほうが良い成績になる場合が多いので、好みを優先する場合があります。

2. 自分なりの理論で最適化

例えばテクニカル分析やその他の計算で使用するバーの数(参照する期間)を決める場合は少し考えます。BandCross3の場合、日本時間の朝9時から取引可能になります。そのため欧州マーケットの乱高下やロンドンフィキシングの影響を受けたくないなと考えると朝3時ごろから9時までの6時間以内のデータで分析することになります。またそれより長期の分析を行う場合、市場の違いによる影響を均一化するために出来るだけ約24時間単位にします。また24時間に若干プラスすると当該時刻近辺のデータを1回分余計に参照することになりますので効果的かなとも考えています。これも最終的には自分の理論値近辺でバックテストによる最適化を行いますが、この場合は成績の良いパラメータを採用します。

3. 網羅的なバックテストで最適化

何かの判断に使用するpips数やパーセントなど見当のつかない閾値についてはとりあえず網羅的にバックテストを行い成績の良いものを採用します。

この他にも統計的な手法などで理論的に算出する方法や、みんなが使っているであろう数値、いにしえの昔から言い伝えられてきた数値を使う方法など色々な最適化の方法があると思いますが、いずれの方法にしても過剰最適化になっているのではないかは気になるところです。EA開発者は誰もが過剰最適化を防止したいと考えていると思いますが、実際に過剰かどうかの具体的な判断基準があるわけではなく運用前にチェックすることは非常に難しいものだと思っています。そんな私の過剰最適化防止策は以下ような方法です。

・あまり突き詰めた数値まで最適化しない  

バーの数なら10本単位でというようにあまり細かい数値まで突き詰めた最適化はしないことにしています。(それはただの手抜きではということはさておいて) 例えば20本の移動平均を使用した場合と21本の移動平均を使用した場合でバックテスト結果に大きな違いが出たとしても実運用ではほぼ同じ傾向になるはずだと考えています。(違いの出る本数の閾値が何本なのかはさておいて)

・直近数カ月のデータは最適化の期間に含めず検証に使用する

私の場合開発に時間がかかるので自然とこの検証期間のデータがたまってくるということもありますが、ある程度最適化した後に最適化に使用していない直近の数ヶ月に適用して結果を確認します。それで結果が悪ければその最適化はボツとしロジックから再検討します。

・あまり古いデータは使わない

かなり古いデータを含む長期間のバックテストで良い結果を出そうとするとロジックが複雑になったりパラメータの数を増やしたりして逆に過剰最適化になりやすいと思われることや、レートの桁数が少ないことによる差異(閾値に小数点以下のpipsを使用しているときは特に気になる)、 取引システムの性能向上やマーケット参加者の変化などで為替市場が変化している事など気になる点がいくつかあって、かなり古いデータを使用して最適化することについては妥当性が無いのではと思っています。

ポジションを数週間~数ヶ月保有するような場合は長期間の過去データを使用した検証が必要かもしれませんが、そのようなトレードではファンダメンタルズや季節要因などが大きく影響してくると思うので、EAのように値動きだけでトレードするようなシステムには向いていないのではと考えています。

とはいえ最適化やバックテストについては色々な考えあるかと思いますし、ワタシもそのうち考え変わるかもしれません。

 

作成者: BandCross

普段は自動制御系ソフトウェアのエンジニアをしている会社員です。FXの自動売買ソフトウェアを専門サイトに出品していますので、それに関連する情報を発信していきたいと考えています。

コメントは受け付けていません。