同じ期間で検証を回したら、成績が前回とまるで違った。EAは一行も変えていない。パラメータも同じ。違うのは、検証に使う過去データを落とし直したことだけだ。
過去データは検証の入力である。入力が変われば出力が変わるのは当たり前なのだが、パラメータほどには意識されない。しかも「同じ通貨ペアの同じ期間」を指定していても、どの業者の、いつ落とした記録かで中身は違う。
見るべきなのは値の中身より先に、本数と開始時刻だ。何本あるのか、いつから始まっているのか。ここを数えないまま回した検証は、結果が良くても悪くても読み取りようがない。今回は、過去データの穴が計算のどこに効いてくるのかを見ていく。
検証の入力は「どこかの業者の、いつかの記録」
端末が持っている過去データは、業者のサーバーから配信されたものを端末側に貯めたものだ。業者ごとに元にしている配信元が違い、同じ業者でも口座タイプが変われば別物が入ってくることがある。指定した期間の先頭から本当に埋まっているとも限らない。
確かめ方は単純で、検証に使う期間の最初の足と最後の足がいつなのか、その間に何本あるのかを見る。想定していた本数より少なければ、どこかが抜けている。ここで初めて「抜けているのは休場なのか、それとも配信の欠けなのか」という話に入れる。本数を数えるのが先で、値を見るのは後になる。
穴は3種類ある
ひとくちに「データが欠けている」と言っても、中身は3つに分かれる。ひとつめは、週末や休場で足がそもそも無いもの。市場が閉じているのだから正しい不在で、これは穴ではない。
ふたつめが、平常の時間帯なのに1本だけ抜けているもの。配信が届かなかったのか、取り込みに失敗したのか。理由は端末の外にあるので、こちらからは分からない。みっつめが、値そのものが飛んでいるもの。高値だけが極端に離れている、始値が前の足の終値からかけ離れている。1本しか無いのに、後ろへ長く効く。
この3つを「データがおかしい」とひとまとめにすると、直しようがなくなる。数え方も、効き方も、対処も別のものだ。
「N本前」は、時刻ではなく順番を指している
移動平均でも、変動幅でも、一定期間の高値安値でも、過去N本ぶんを使う計算は本数で数えている。時刻で数えてはいない。だから1本欠けると、窓の反対側の端が1本ぶん過去へ伸びる。N本前が指す時刻が、その足だけ変わってしまう。
やっかいなのは、ずれるのが欠けた足のところだけではない点だ。窓がN本ぶんあるなら、その欠けを含んだまま窓が進むあいだ——つまり後ろのN本ぶん——ずっと窓の中身が想定と違う。欠けは1本でも、影響は本数ぶん引きずる。
そしてこれは、本数で数えている限り避けられない。時刻で窓を切る作りにすれば時間幅は揃うが、今度は休場をまたぐたびに窓へ入る本数が変わる。どちらを取るかは設計の選択で、片方を選べば片方の性質が付いてくる。
飛び値は、損益より先に指標を壊す
1本だけ極端な値が入っていると、まずその足での判定が変わる。ただ、そこで終わらない。平均を取る計算なら窓から抜けるまで平均を引っぱり続けるし、期間の高値安値を見る計算なら、その値が窓に入っているあいだ高値そのものになり続ける。
損益は取引が閉じれば数字が確定する。指標はそうならない。1本の異常値は、その後の数十本ぶんの計算の中に残り続ける。検証結果を見て「この一回の取引がおかしい」と探しても見つからないのは、原因の足と、結果の出た足が離れているからだ。
「変な取引が一回あった」ではなく「この期間だけ判定の傾向が違う」。そう見えたら、値ではなく本数を疑う。
埋めるか、埋めないか
欠けを見つけたあと、埋めるか埋めないかを決めることになる。どちらが正解ということはない。性質が違うだけだ。
埋めれば足は連続する。本数で数える計算はきれいに揃い、窓の時間幅も安定する。代わりに、実際には配信されなかった値の上で判定することになる。前の足の終値をそのまま置く埋め方をすると、その足は値動きがゼロだったことになるので、変動幅を見る計算はその分だけ小さめに出る。
埋めなければ、無かったものは無いままだ。判定はあった値だけで下る。ただし本数が減るぶん、前の項で書いたずれがそのまま残る。
どちらを選んでもいいが、選んだ方を検証の条件として書き残しておきたい。しばらく経って同じ検証を回し、結果が違ったとき。埋め方を変えたのか、データを落とし直したのかが分からなければ、二つの結果を比べようがない。
同じ穴は、実運用でも来る
ここまで検証の話をしてきたが、同じことは動かしている最中にも起きる。端末を起動した直後は、まだ過去の足が読み込まれていない。週明けの最初の足では、窓の大半が休場をまたいだ向こう側にある。業者が扱い始めたばかりの銘柄は、そもそも履歴そのものが短い。
このとき、必要な本数が揃わないまま計算を走らせると、多くの計算は初期値か、途中までの値を返す。返ってくるのは数字なので、判定はそのまま通ってしまう。動かないことより質が悪いのは、動いてしまうことの方だ。
対処は難しくない。必要な本数が揃うまで、判定そのものを始めない作りにしておく。取得できた本数を数えて、足りなければ何もせずその足を見送る。起動直後の何本かを捨てることになるが、捨てた自覚がある方が後で読める。ログに一行「本数が足りないので見送った」と残しておけば、翌朝ポジションが無い理由も自分で分かる。
当方は元金融系のシステムエンジニアで、いただいた売買ルールどおりに動くMT5のEAの開発と、既存EAの改修をココナラでお受けしています。特定の時期だけ検証と実運用が噛み合わない、という段階のご相談でも構いません。噛み合わない期間と、使っている指標の種類を添えて、ココナラのメッセージからご相談ください。なお、お渡しするのはソフトウェアであって、投資助言や運用の代行ではありません。