テスターの結果は想定どおりで、資産曲線も素直に伸びていた。設定を一つも変えずに口座へ乗せて二週間。エントリーの日付も方向も検証と同じなのに、約定した値段が違う。決済の値も違う。足し合わせると、検証で出ていた数字にならない。
ここで最初に迷うのが「EAの作りが悪いのか、取引環境の差なのか」である。分からないままパラメータを動かすと、たいてい話がこじれる。直したつもりの変更が別の要因に埋もれて、効いたのかどうかも判定できなくなるからだ。
そもそも検証と実運用は、同じものを測っていない。ずれるのが前提で、問いは「ずれるかどうか」ではなく「どのくらいずれるか」「その差に説明がつくか」になる。今回は、切り分けの順番と、ずれの測り方をまとめる。
比べる前に、土俵をそろえる
数字を並べる前に、同じ条件で回したものかを確かめる。期間・銘柄・口座の条件が違えば、ずれて当たり前で、それはEAの話ではない。銘柄は名前の末尾の表記だけでなく、口座タイプによってスプレッドの出方や手数料の有無が変わることがある。検証で使った銘柄と、いま動かしている銘柄が同じ商品かを先に見る。
期間も同じ日付にそろえる。別の月の相場と比べても、何が起きているかは出てこない。そのうえで、合計ではなく1件ずつ突き合わせる。合計だけを見ていると、原因の違う差が打ち消し合って見えなくなる。突き合わせの鍵にするのは時刻と方向と数量で、金額は鍵にしない。金額は合わせに行く対象であって、鍵にすると差が出た瞬間にどの取引の話か分からなくなる。
検証は「その値段で約定した」前提で進む
バックテストは過去のデータの上を歩く。入ると判断した時点で、その値段で約定したことになる。相手の都合も、回線の遅れも、注文が届くまでの時間も入らない。実運用は順序が逆で、注文を出してから値段が決まる。押した時点の値は希望であって、届いて処理された時点の値が結果になる。その間に価格が動けば、動いたぶんがそのまま差になる。
だから検証と実運用が1ポイント単位で一致することはないし、一致しないこと自体は不具合ではない。速い場面ほど差は開くので、静かな時間に入る作りと、指標をまたいで入る作りでは、同じEAでもずれ方が違う。見るのは差の大きさと、その散らばり方になる。
「設定は同じで回した」——同じなのは設定であって、相手も回線も同じではない。
スプレッドは一定ではない
検証ではスプレッドの扱いを選べる。過去の記録に残っている値を使う方式と、固定値を置く方式がある。小さい固定値で回した結果には、実際には通らなかった取引まで含まれている。実際のスプレッドは時間帯で開く。日をまたぐ前後、週明けの最初、指標が出た直後。この時間に入る作りのEAなら、差はここに集中する。
影響の大きさは、1回あたりに狙う値幅で決まる。大きく取る作りなら、スプレッドが1つ2つ違っても並び順は変わらない。数ポイントを取りに行く作りだと、それだけで検証の結果と入れ替わる。手数料も同じで、往復でいくら引かれるかを検証に入れていないと、取引回数の多いEAほど離れていく。
足が閉じる前に判定していないか
検証だけ成績が良く、実運用で再現しないときの典型がここだ。足が確定する前の値で判定していると、検証では先の値動きを見た形になりやすい。検証ツールは、足の中の動きをどこまで細かく再現するかを選べる。粗い方式は、足の中の値動きを近似で作る。その上で足の途中を判定させると、本来は知りようのなかった値を見て入ったのと同じことが起きる。
生成の方式を変えただけで結果が別物になるなら、まずここを疑う。確認そのものは難しくない。判定を確定した足だけで行っているか。指標の値を読むときに、まだ動いている足の値を読んでいないか。その値は後から変わる。実運用では、変わる前の値で入って、変わった後の値で振り返ることになる。
足の途中で判定する作りが悪いわけではない。速い場面を取りにいくなら、確定を待っていては間に合わない。ただし、それをやるなら検証も足の中を細かく再現する方式で回さないと、比べる意味がなくなる。そのぶん検証に時間はかかるが、そこを省くと差の原因が読めない。
滑りの許容幅は、通す側にも通さない側にも効く
発注のときに、これ以上ずれたら約定しないという幅を指定できる。狭くすれば不利な値では入らないが、そのぶん約定しない。広くすれば入るが、不利な値で入る。どちらに寄せても、検証の数字からは離れていく。それでいて、初期値のまま一度も触られていないことが多い項目でもある。
この二つは、どちらも「バックテストと違う」という同じ顔をして出てくる。原因は逆だ。検証にあった取引が実運用に無いなら幅が狭すぎ、取引の数は合っているのに1件ずつの成績が落ちているなら広すぎる。先に取引の件数を数えれば、どちらの話かはすぐ分かる。
決済側はもう少し面倒で、損切りは指定した値段より不利な方向に滑ることがある。損切りの幅が小さいほど、滑ったぶんの割合は大きくなる。滑る前提で幅を決めているかどうか、という話になる。ここを決めないまま損切りだけ狭めると、検証の数字からいちばん遠いところへ行く。
直す前に、ずれの大きさを測る
測らずに直すと、直ったのかどうかが分からない。パラメータを変えて数字が良くなっても、相場のほうが変わっただけかもしれない。残すのは、注文を出した時刻、出したときの値、約定した値、そのときのスプレッド、約定までにかかった時間。それと、約定しなかった注文だ。
約定しなかった記録がいちばん落ちやすいが、検証にあって実運用に無い取引の正体はそこにある。記録は書き足すだけにして、後から上書きしない。発注時の値を約定した値で塗り替えると、差そのものが消える。別々の欄で持てば、あとから何度でも数え直せる。
数えるときは平均だけを見ない。指標発表の1件で平均は動く。中央値と、いちばん悪かった値の両方を見る。時間帯ごとに分けると、差が特定の時間に固まっていることが多い。そこまで出れば、作りを直すのではなく、その時間を避けるだけで収まる場合もある。
二週間ぶんたまったら、測った幅を検証側の設定に入れて回し直す。スプレッドも滑りの幅も、実際に出た値に置き換える。ここでようやく、検証と実運用を並べて見られる状態になる。手を入れるのは、その後でいい。順番を逆にすると、直ったのか相場が変わったのかが最後まで分からない。
当方は元金融系のシステムエンジニアで、MT5のEAの改修と最適化をココナラでお受けしています(MT4は移植・改修のご相談から承ります)。ずれを記録する仕組みを足す、確定した足で判定するように直す、といったご相談も承っています。いつから・どのくらいずれているかを添えて、ココナラのメッセージからご相談ください。なお、お渡しするのはソフトウェアであって、投資助言や運用の代行ではありません。