【移植#102】最適化を段階的に進める — 探索数と相互作用を比べる¶

この記事の3行まとめ
- 入力値の組合せが多いとき、関係が薄い変数群を分けて順に探索すると計算を減らせます
- 5×5の例では全探索25回に対し、二段階なら10回で同じ最大値を見つけました
- 変数間に相互作用があると段階探索は全体最良値を逃すことがあります
元記事の相談をMT5で考える¶
2010年5月29日の原典は、最適化に時間がかかるため、相関性の低いパラメーターを分割して探索し、遺伝的最適化を使わずに済ませたいという相談です。ここではその発想を、全組合せと段階探索を比較する小さな実験として組み直します。
MT5のテスターでは、最適化する入力値ごとに開始・刻み・終了を指定し、完全探索または遺伝的最適化を選べます。OnTester()の戻り値は最適化基準「Custom max」に利用できます。公式リファレンスは、入力値を変数として数学関数の極値を探すテスター利用例も説明しています。
MQL5公式: Testing Trading Strategies MQL5公式: OnTester
まず独立した二変数で回数を比べる¶
配布EAは売買しません。入力AとBから次の点数を返すだけの決定論的な実験用EAです。
両方を0から4まで1刻みで完全探索すると25通りです。段階探索では、まずB=0に固定してAを5通り試し、最良のA=2を選びます。次にA=2へ固定してBを5通り試すとB=3になり、最大点100へ到達します。合計は10通りです。
この例は、二つの入力値が点数へ独立に加わるよう意図的に作っています。段階化すれば常に同じ答えになる、という一般的な保証ではありません。
相互作用を入れると最良値を逃す¶
EAのInpInteractionを有効にすると、A=4かつB=4の組合せだけに20点を加えます。完全探索の最良値は(4,4)の107点です。一方、同じ順で段階探索すると、B=0固定時にA=2が選ばれ、その後A=2固定でB=3が選ばれます。段階探索の結果は100点で、全体最良値を取り逃します。
これは局所的に各変数を改善する手順の弱点を示す人工例です。実際のEAでは、しきい値の組合せやフィルター同士の条件などが相互作用することがあります。最初の固定値や探索順を変えると結果も変わりえます。
MT5で試す手順¶
- 配布EAをコンパイルし、ストラテジーテスターで選びます。
InpAとInpBを0〜4、刻み1に設定し、最適化を「遅い完全アルゴリズム」、基準を「Custom max」にして実行します。InpInteraction=falseの最良行とパス数を記録します。二変数で25パスになる設定です。- 最適化を止め、
InpB=0を固定してInpAだけ最適化します。最良のAを採用し、その値を固定してBだけを最適化します。 InpInteraction=trueにして全探索と段階探索を繰り返し、107点と段階側の結果の差を確認します。
このEAは価格履歴を読まず発注もしません。実戦EAに適用するときは、相関性が低そうという印象だけで変数を分けず、検証用期間で全探索の小さな範囲と段階探索を照合してください。最適化に使った期間から離れた検証期間でも評価し、探索順、固定値、取引数、損益分布を記録します。点数最大化は将来の利益や頑健性を保証しません。
ダウンロード¶
102_Staged_Optimization_Demo_v1_00.mq5 をダウンロード
前後の記事¶
次: 【移植#103】直近25時間の安値を時刻でそろえる — 欠損バーを0と混同しない
あわせて読みたい記事¶
- 【検証#07】MQL⅘コードの高速化テクニック ー 1秒でも速く
- 【検証#12】その時刻判定、遅くない?文字列操作の罠
- 【移植#100】複数銘柄のテストをまとめて実行 — MT5のSymbol Optimization