まず、ズレを観察する
3環境の結果(トレード数・勝率・累積リターン・最大ドローダウン)を、1つの表に並べてみてください。おそらく、まったく同じ数字にはならないはずです。トレード数が1〜2回違ったり、累積リターンが数%〜数十%違ったりします。
ここで慌てる必要はありません。ズレること自体が正常で、むしろ全部ピッタリ一致するほうが不自然です。大事なのは「どれが正しいか」と犯人探しをすることではなく、ズレの一つひとつが、どの条件の違いから来ているかを説明できることです。順に見ていきます。
原因①:使うデータの違い
3環境は、それぞれ違う出どころのデータを使っています。MQL5はMT5業者のデータ、PineはTradingViewのデータ、PythonはあなたがエクスポートしたCSV。第6回で触れたとおり、同じ「S&P500」でも複数の姿があります。
- 対象そのものが違う:現物指数(SPX)・先物・ETF(SPY)・CFDでは、値も、動く時間帯も、配当の扱いも違います。片方が現物指数、片方がCFDなら、そもそも別のものを検証しています。
- 提供元が違う:同じCFDでも、業者やデータ会社ごとに終値が微妙に異なります。日足の「終値」をいつの時点で切るか(時刻の基準)も違うことがあり、これが月末判定をまたぐと、トレード数まで変わります。
- 期間・欠損が違う:各環境で使えるデータの長さや、抜けている日が違えば、集計対象のトレードそのものが変わります。
つまり、データの違いは最も影響が大きく、かつ気づきにくいズレの元です。結果を比べる前に、3環境ができるだけ近い対象・近い期間を見ているかを、まず確認します。
原因②:スプレッド・手数料
コスト(スプレッド・手数料)を入れるかどうか、いくらにするかで、成績は大きく動きます。月末ロングは月に1回だけの売買なので影響は比較的小さいですが、それでも無視はできません。
- MQL5・Pine:テスターの設定でスプレッド・手数料を指定します。ここを0にすると、現実には払うコストを無視した甘い結果になります。
- Python:第9回の最小限コードはコストを含めていません。決済リターンから毎回コストを引いて初めて、他の2つと土俵がそろいます。
3環境でコスト条件をそろえていないと、そのぶんが丸ごとズレになります。比較するなら、まず「Pythonもコストを引く」「3つとも同じくらいのスプレッドにする」と条件を合わせるのが先です。売買回数が多い戦略ほど、この差は雪だるま式に効きます。
原因③:約定タイミング
第7〜9回で繰り返し触れた点です。いつの価格で約定したことにするかが、環境で違います。
- MQL5(第7回):前の足で条件を判定し、次の足の頭(始値)で約定。
- Pine(第8回):既定で次の足の始値で約定。MQL5版と近い。
- Python(第9回):そのルールを、判定したその足の引け(終値)で約定と計算。
つまり、MQL5とPineは「翌日の始値」、Pythonは「当日の引け」。約定の瞬間が1本ぶんずれています。1日ぶんの値動きがまるごと片方に入るか入らないかの差なので、月末のように値が動きやすい時期だと、無視できないズレになります。 どちらが正しいということはなく、どちらも「そう仮定した」という約束ごとです。比較するなら、この仮定もそろえる(たとえばPythonも次の足の始値で約定するよう書き換える)必要があります。
目標は、3環境の数字を無理やり一致させることではありません。データ・コスト・約定の3条件をそろえていけば差は縮みますが、それでも完全には一致しないのが普通です。 大事なのは、残った差について「これはデータの対象が違うから」「これは約定の仮定が違うから」と説明できること。原因を言えないズレが残っているうちは、まだどこかに勘違いか間違いが隠れている、というサインです。
その他のズレの元
主な3つ以外にも、細かいズレの元があります。知っておくと、原因不明の差に出会ったときの手がかりになります。
- 営業日の数え方:今回は日付(カレンダー)で判定しましたが、本来のTurn-of-Monthは「月末からN営業日前」を営業日で数えます。祝日の扱いが環境で違うと、判定日がずれます。
- 端数・ロットの扱い:1回の売買数量や、資金に対する建て方の違い。
- 集計方法:累積リターンを「複利」で見るか「単利の合計」で見るか。テスターとPythonの計算方式が違うと、同じトレードでも最終値がずれます。
この経験から持ち帰ること
このコースで一番伝えたかったのは、コードの書き方そのものよりも、「検証結果は条件しだいで動く」という感覚です。同じルールを3つで書いて初めて、1つの成績の数字が、いかに多くの前提の上に乗っているかが実感できます。
だから、他人が公開している「バックテストで年利◯%」という数字を見たときも、どのデータで・どのコストで・どの約定で出した数字かを問う癖がつきます。それが書かれていない成績は、そのまま信じるには足りません。検証コース(過剰最適化)で学んだ「何通り試したか」と並んで、これも数字を疑うための大事な視点です。
実運用へ進む前に、通常・悪化・ストレスのコスト条件と、 フォワードテスト・停止基準を固定してください。 3環境の一致は実装確認であって、将来の利益保証ではありません。
月末ロングという簡単な題材を使いましたが、やったことは本格的な戦略検証と同じです。ここで身につけた「同じルールでも環境で結果はぶれる」「差は条件で説明する」という姿勢は、この先どんな戦略を検証するときにも効いてきます。お疲れさまでした。
チェックリスト
コースの締めくくりとして、以下が自分の言葉で説明できるか確認してください。
- 3環境で結果がズレる主な3原因(データ・コスト・約定タイミング)
- 同じ「S&P500」でも現物・先物・ETF・CFDで違うこと
- 約定が「翌日の始値」か「当日の引け」かで1本ぶんずれること
- 目標はズレを消すことではなく、差を説明できること
- 「唯一の正しい成績」は存在せず、数字は条件とセットで意味を持つこと
- 他人の成績を見るとき、データ・コスト・約定を問う視点
ミニテスト
最後に4問だけ確認です。不正解なら別の選択肢を選び直せます。正解すると解説が表示されます。
Q1. 同じルールなのに3環境で結果がズレる、と分かったときの正しい受け止め方は?
ズレること自体は正常で、全部一致するほうが不自然です。大事なのは犯人探しではなく、差の原因を条件の違いとして説明できることです。
Q2. 影響が最も大きく、かつ気づきにくいズレの元として本文が挙げるのは?
同じ「S&P500」でも現物・先物・ETF・CFDで別物になり、提供元や期間でも変わります。比較の前に、近い対象・近い期間を見ているか確認します。
Q3. 約定タイミングについて、本コースの実装の関係は?
MQL5・Pineは翌日の始値、Pythonは当日の引け。1日ぶんの値動きが入るか入らないかの差で、月末のような動きやすい時期には無視できません。
Q4. 他人の「バックテストで年利◯%」という成績を見たとき、このコースが勧める見方は?
成績は条件とセットで初めて意味を持ちます。データ・コスト・約定の前提が書かれていない数字は、そのまま信じるには足りません。過剰最適化の「何通り試したか」と並ぶ、数字を疑う視点です。