第4章【前編】:コピーバンドからの脱却と、過剰最適化の罠
一、ネットの海と「コピーバンド」の限界
2022年、初春。
深夜の静寂の中、MetaEditorに「Hello World」を出力させてから数週間。
私は日中の営業回りを終えると、脇目も振らずに書斎のPCデスクへ向かう日々を送っていた。
しかし、プログラミング初心者がゼロから完璧なトレードロジックをコーディングできるほど、MQL4の世界は甘くはない。
文法を覚えたばかりの私が最初に行ったのは、海外フォーラムやMQLコミュニティに公開されている「無料のオープンソースコード」をかき集め、それらを切り貼りして一つのEAに仕立て上げる作業だった。
「このEAのエントリー関数(OnTick)を拝借して、あっちのインジケーター判定を組み合わせれば……よし、動いた!」
それはまるで、好きなアーティストのコード進行とフレーズをそのまま真似て演奏する「コピーバンド」そのものだった。
他人が書いたRSIの逆張りコード。
ネットで見つけた移動平均線のゴールデンクロス判定。
教科書通りのボリンジャーバンド逆張り。
それらをパッチワークのように繋ぎ合わせ、自分だけの「オリジナルもどきEA」を作り上げ、私は意気揚々とMT4の「ストラテジーテスター」を起動した。
「いけ……! 過去データでその実力を見せてくれ!」
二、単一ロジックの破綻 — RSIの限界 —
ポチッ、と開始ボタンをクリックする。
高速で進む過去チャートのローソク足。画面下のグラフタブに、緑色の資産曲線がリアルタイムに描かれていく。
最初は綺麗な右肩上がりを描いていた。
「よし……! 勝てているぞ!」
だが、検証期間が2020年の相場に入った瞬間、画面の中で異変が起きた。
トレンドが発生し、相場が一方向へ強く伸び始めたのだ。
【コピーバンド時代の単一RSIロジック(M5)】
・条件:RSI(14)が「70以上」で逆張りショート、「30以下」で逆張りロング。
・思想:過熱感からの反転を狙う、最もありふれたオシレーター逆張り。
強い上昇トレンドの中、RSIは「70」「80」「85」と張り付いたまま全く下落しない。
プログラムは「過熱しているから売る」という愚直な命令に従い、次々と逆張りのショートポジションを取り続けた。
そして——。
「おい、待て……! なんでこんな強い上昇相場で売り続けるんだ!?」
グラフの資産曲線が、まるで絶叫マシンのように垂直落下すると共に、バックテストの進行が強制停止する。
「全損……!?」
頭を抱えた。
ネットに転がっているありきたりなオシレーター単一ロジックでは、レンジ相場では勝てても、ひとたびトレンドが発生すれば一瞬で破綻する。
相場には「レンジ相場」と「トレンド相場」という、全く正反対の顔がある。
1つのインジケーター、1つの単一ロジックにすべてを背負わせようとする構造そのものが、破滅への一本道だったのだ。
三、都合のいい1年間と、パラメータいじりの甘い罠
ネットの無料コードを寄せ集めたコピーバンド時代と決別した私は、自力でロジックを組み立てる泥臭い開発作業へと没入していった。
だが、ここでプログラミングを覚えたての開発者が必ずハマる、最も恐ろしく甘美な罠が待ち受けていた。
——「過剰最適化(カーブフィッティング)」だ。
MT4のストラテジーテスターには「最適化」という機能がある。
EAに設定した各種パラメータの数値をコンピューターに総当たりで計算させ、指定した計測期間に対して「最も利益が出て、最もドローダウンが小さくなる数値」を自動で割り出させる機能だ。
私は、直近で相場が比較的穏やかだった期間を選択してテスターにセットし、最適化ボタンを回し続けた。
「……すごい! パラメータをこの数値に合わせたら、資産曲線が信じられないほどの右肩上がりを描くぞ!」
負けているトレードがあればインジケーターの数値を1刻みで微調整し、一時的な逆行があれば都合よくフィルターの数値を書き換える。
相場が安定していたその1年間だけに無理やり数値をパズルのように当てはめていく。
数日の作業の末、画面に完成したのは、非の打ち所がない美しい1年間のバックテストレポートだった。
・勝率 :96.8%
・純利益 :+850万円
・最大DD :3.2%
「できた……! 資産が一直線に増え続ける『本物の聖杯』を俺は作ってしまったんじゃないか!?」
画面に映る美しい右肩上がりの緑色のグラフを見つめながら、私は胸を高鳴らせた。
特定の狭い相場に数値を合わせただけの「見せかけの絵画」に過ぎないことに、当時の私はまだ気づいていなかったのだ。