バックテストと実運用が違うEA|先読みバイアス3つの型

バックテストと実運用が違うEA|先読みバイアス3つの型

記事
マネー・副業
「バックテストでは右肩上がりだったのに、実際に動かすと違う成績になる」というご相談をいただく。コードを開いて最初に見るのは、ロジックの良し悪しではない。判定に渡している値が、その時点で本当に手に入っていたか。ここが崩れていると、検証の結果そのものが読めなくなる。

判定より後に決まる情報が混ざることを、先読みと呼ぶ。厄介なのは、混ざっていても検証は普通に完走してしまう点だ。エラーも警告も出ない。しかも成績はきれいな方に出る。答えを見てから解いているのだから、当たり前といえば当たり前だ。

今回は、EAのコードで値の時点がずれる場所を三つに分けて見ていく。AIに問い合わせる作りの検証については別に書いたので、ここでは触れない。扱うのは、数値だけで閉じているEAでも起きる話だ。原因が分かれば直すのは難しくないし、直したかどうかを確かめる方法もある。

検証だけがきれいに出るとき、最初に見る場所

ストラテジーテスターは、その時刻に存在しなかったはずの値を渡されても止まらない。渡された数字で粛々と計算する。だから先読みは、成績という形でしか表に出てこない。しかも良い方に出るので、疑うきっかけがない。

実運用に移すと、その値は判定の時点でまだ無い。無いものは使えないので、EAは検証と違う動きをする。検証と実運用が噛み合わない時、まず疑うのはロジックではなく値の時点だ。先にロジックを触ると、合っていた部分まで動いてしまう。
先読みは、エラーではなく好成績として出てくる。

型1|まだ閉じていない足を、閉じた足として扱う

いちばん多いのがこれだ。判定の中で、進行中の足の終値を参照している。進行中の足の終値は「いまの値段」であって、確定した値ではない。次の瞬間には別の数字になるし、その足が閉じるまでは何度でも動く。インジケータの値も、元にしている足が閉じていなければ同じように動く。

ヒストリカルデータで回すときは、その足の終値が最初から確定した数字として並んでいる。テスターは終わった足を持っているので、進行中の足を指していても最終的な数字が返ることがある。実運用では返らない。ここで検証と実運用が食い違う。

上位足を見る作りだと、これが気づきにくい形で入ります。下位足で判定しながら上位足の終値を条件にすると、上位足が閉じるまでのあいだは、ずっと未確定の値を見ていることになります。判定は、閉じた足の値だけで組む。閉じたかどうかは、足の開始時刻が変わったかどうかで見分けられます。

型2|あとから直る値を、直る前の判断に混ぜる

業務の側にも同じ形の事故がある。月末で締めて集計を出した後に、その月の伝票が一枚届く。素直に足し込むと、先週配った資料の数字が今日は違う数字になっている。締めた後の数字は動かさない、直すなら取り消しの記録を足す。順序を守るための決まりごとだ。

EAでも起きることは変わらない。配信元があとから訂正する値、後日に確定する値。これを訂正後の状態で持っているデータから読んで、訂正前の時点の判断に使えば、その時刻には知りようがなかった情報で判定していることになる。

対処は、値を「いつ時点のものか」と一組で持つことです。同じ項目でも初報と訂正後を別の記録として並べ、判定はその時刻までに届いていた版だけを見る。上書きしてしまうと、後から確かめる手段そのものが無くなります。

型3|集められてから届く値を、対象期間の日付で使う

三つめは、集計されてから配られる値だ。ある期間を対象とした数字が、その期間が終わってしばらく経ってから公表される。データの中では対象期間の日付が振られていることが多い。日付をそのまま時刻として扱うと、公表より前の判定でその値を読んでしまう。

対象の日付と、手に入る日付は別物だ。業務の集計でも同じで、「いつのぶんか」と「いつ確定したか」を一つの列にまとめた時点で、後からの検算ができなくなる。列は分けて持つ。EAなら、値と一緒に取得時刻を持たせておけば足りる。

先読みが入りやすい場所

値と一緒に「いつ手に入ったか」を持つ

三つの型は、対処が同じところに行き着く。値そのものと別に、その値をいつ手に入れたかを持つ。持っていれば、判定の時刻と比べるだけで先読みかどうかが分かる。持っていなければ、コードを読んで想像するしかない。

実装そのものは重くない。判定に使った材料を、判定の時刻と一緒にログへ落とすだけだ。どの足の、いつ時点の値を見て、何を選んだか。一行あればいい。これがあると、検証のログと実運用のログを同じ形で並べられる。

業務のシステムで、誰がいつ何を変えたかを残しておくのと同じ話です。残っていないものは、後から誰も確かめられません。止まった時に読むのも結局このログなので、先読みの確認だけのために増やす手間にはなりません。書き出す項目は着手の前に決めておくと、検証と実運用で形がそろいます。

先読みを見つける手順

並べるのは損益ではなく、判定の回数

直した後、何を見て確かめるか。損益を並べても分からない。期間が違えば数字は動くし、直したことが効いたのかどうかが混ざってしまう。並べるのは判定の回数だ。発注した回数、見送った回数、値が取れずに判定できなかった回数。この三つを同じ期間で比べる。

先読みを外すと、たいてい発注の回数が減る。減ったぶんが、これまで先の値を見て入っていた取引だ。逆に参照失敗の回数が急に増えたなら、閉じた足だけを見る形に変えたことで材料が足りなくなっている。数え方を先に決めておくと、直した効果がその場で見える。

ただし、判定がN回しかない期間で前後を比べても、差が直したことによるものかは分からない。回数が少ないうちは、増えた減ったのどちらにも読めてしまう。期間をどう切るかはそれだけで別の話になるので、ここでは回数が足りているかを先に見る、とだけ書いておく。

当方は元金融系のシステムエンジニアで、MT4とMT5のEAを、いただいた売買ルールから開発しています。テクニカルだけで組む構成の新規開発も、いま動いているEAの手直しもお受けしていますので、ルールが箇条書きの段階でも、検証と実運用の食い違いが気になっている段階でも構いません。ココナラのメッセージからご相談ください。なお、お渡しするのはソフトウェアであって、投資助言や運用の代行ではありません。
サービス数100万件のスキルマーケット、あなたにぴったりのサービスを探す