Softgate Limited

株式会社ソフトゲート コーポレートブログ

MT4 のリアルティックバックテスト その1

久々の技術ネタとして、MT4 でリアルティックに基づいたバックテストを行う話題を取り上げてみたいと思います。

といっても、Tick Data Suite や Tickstory の利用手順を説明するわけではありません。そういうのは、丁寧に解説してくれているブログが既に沢山あると思うので、適当にググってください。

まず、今回の記事では、MT4 がバックテストを行う際の大まかな処理の流れを(おさらいを兼ねて)追っていきます。

ヒストリカルデータの保存場所

MT4 は、ヒストリカルデータを MT4 データフォルダの下に保存しています。

より具体的には、データフォルダのパスを $(DataFolderPath) と表記することにすると

  $(DataFolderPath)\history\サーバ名

の下に、EURUSD1.hst(EUR/USD 1分足)とか USDJPY1440.hst(USD/JPY 日足)といった名前のファイルがたくさん置かれています。

これらのヒストリカルデータは、あくまでも 四本値 ベースであることはご承知の通りです。

したがって、MT4 が管理するヒストリカルデータは、1 分足が最も高精度ということになります。

ティック生成

さて、MT4 でバックテストを実施する場合、これらのヒストリカルデータを直接読み込んでバックテストの演算を行っているわけではありません。

バックテストを行う前に、MT4 は、バックテスト期間やテストモデルなどの設定に応じて、ヒストリカルデータからバックテスト用のテストデータを中間ファイルとして生成します。

試しに、バックテストを実行している最中にデータフォルダ以下の

  $(DataFolderPath)\tester\history

というフォルダを覗いてみてください。

もし EUR/USD 5 分足の「全ティック」モデルでバックテストをしているなら、EURUSD5_0.fxt という名前のファイルが生成されているはずです。

「コントロールポイント」モデルなら EURUSD5_1.fxt、「始値のみ」モデルなら EURUSD5_2.fxt となります。

このファイルのことを(私は) ティックファイル と呼んでいます。

ティックファイルを生成するアルゴリズムについては、本家 MetaQuotes が書いたフォーラム記事を参考にしてください。

話を戻すと、「全ティック」というテストモデルを選択した場合、MT4 は入手可能な最も精度が高いタイムフレーム(要するに 1 分足のデータがあれば 1 分足ということです)の四本値データを補間するような形で、擬似的なティックデータを生成します。

つまり、MT4 の「全ティック」モデルは、四本値のデータに基づいて、いわば デタラメ なティックデータを生成しているだけなんですね。

「全ティック」モデルの説明には 利用可能な最小時間枠を使い全てのティックを生成する、最も正確な方法 と書いてありますが、実際には何ら正確なわけではありません。

あくまで なんとなくティックレベルのバックテストっぽく見える だけのことです。

ティックファイルの構造

次に、ティックファイルの構造を簡単に説明して、今回の記事は終わりにしたいと思います。

一言で言えば、ティックファイルは、ヘッダ部分に続いて、ひたすら各ティックのデータが並ぶ形になっています。

ヘッダ部分に関して特筆すべき点は、バックテストで使用するスプレッドの値がここに記述されているということです。

本来の MT4 のバックテストが 固定スプレッド にならざるをえない理由が、こういうところからも理解できます。

ちなみに、いわゆる「モデリング品質 (modeling quality)」の数値もヘッダ部分に含まれていて、これを書き換えればテスト結果レポートのモデリング品質も変化します。

ヘッダに続く各ティックのデータは、次のような構造体になっています:

typedef struct
{
  time_t otm;
  double open;
  double low;
  double high;
  double close;
  double volume;
  time_t ctm;
  int    flag;
} TestHistory;

※ただし、これはビルド 509 以前のフォーマットです。ビルド 600 以降は datetime 型が 8 バイトに変更された影響で、各ティックのデータ構造も若干変化しています。

なんだか、ティックというよりは四本値みたいな構造体ですが、まあこれが現実ですので、しぶしぶ受け入れてください。

「全ティック」モデルでバックテストをする場合には、基本的に close の値を最新のビッドとして採用します。

じゃあアスクの値はどうするかと言うと、先ほども述べたとおり、MT4 の本来のバックテストは固定スプレッドですので、ビッドの値に固定スプレッドを加えたものが、最新のアスクとなるわけです。

リアルティックデータを自前で生成

では、もし、Dukascopy あたりから入手したリアルティックデータに基づいて、上記のフォーマットに従ってティックファイルを自前のソフトウェアで生成できたらどうでしょうか?

実は、リアルティックに基づいてティックファイルを正しいフォーマットで生成できさえすれば、 ビッドだけ正確なリアルティックのバックテストは可能 なんです。

とはいえ、これを実際にやろうとすると、ヘッダ部分をちゃんと生成するのが割と面倒だったりして、決して簡単ではないんですがね。

今回のまとめ

  • MT4 は 1 分足より細かいヒストリカルデータを持っていない
  • MT4 の「ティック」は適当に生成された擬似ティックである
  • MT4 のバックテストは固定スプレッドである
  • ビッドだけに限れば、リアルティックのバックテストも技術的に可能と言えば可能

では、(いつになるか分かりませんが)次回の記事では、Tick Data Suite, Tickstory や弊社の Forex Studio の古いバージョンといったソフトウェアたちが、どのようにして(アスクも含めた)リアルティックでのバックテストを可能にしているかを解説したいと思います。