同期間のバックテスト結果が何故か変わる。。

kartzさんからコメント頂いて、ちょうど良い機会なので同期間のバックテスト結果が変化してしまう原因をまとめておきます。

(1) テスト時のスプレッドが異なる。
(2) ロジック内部の乱数列が異なる値を返す。
(3) チャートデータが更新されていた。
(4) ロット決定時の換算レートが異なる。

思いつくのはこんな所でしょうか..。



(1) は、ぼなんさ氏の記事に書かれているとおりです。実は、この記事を見てバックテスト時のスプレッドが何処かに保存されていると知り、妖しい解析を進めた結果、SpreadGenerator や SpreadChanger が生まれています。これを使えば、未ログイン状態で指定スプレッドでのテストが可能です。ログインが必要なEAでは、テスト開始後、Tickが生成されている間にログインを済ませるとテスト可能になるようです。


(2) は、売買ロジックに MathRand のような乱数を用いたEAで起こります。MathRandを使っていなくても、DLL内部でニューラルネットワークの計算に乱数を使用していたり、内部で遺伝的アルゴリズム(Genetic Algorithm,GA)を採用していると、乱数列の影響を受けます。海外サイトにあるDLL付きのEAで中身を理解せずに使ったりすると、こういう問題に遭う可能性があります。


(3) は、FXDDのスパイク発生時の対応を見ると、ユーザにスパイク有りのデータが配信された後、ブローカー側が訂正することで、ユーザ側のデータも更新されると分かります。また、複数のデータセンタを持つブローカーでは、直近のデータがデータセンタ間で僅かに異なっていたこともあります。定期的にデータセンタ間で同期させているのか、古いデータには違いがありません。
こういう事情があるので、MT4上で同じデータを入手したつもりでも、わずかに異なっている可能性があるのです。


(4) は、コメントにあったとおり、換算レートを使ってロット数を決めるEAでは、いつの換算レートを使うのか?で結果が変わるわけです。実運用では換算レートは刻一刻と変化してゆくので、テストはテストと割り切るしか無いですね..。