2011/01/16

バックテスト(自動)時代 - ForexTester2ストラテジプログラミング⑦(複数通貨ペア連続評価とその背景)



さてプログラミング時代の前回までは、売買ルールのプログラムの書き方について話してきました。

今回は、プログラミング時代の最終回で、効率化の為に複数通貨ペアを連続して評価する為のプログラミングとその背景今後できれば追加したい機能について書いてみたいと思います。
(物語の時間の流れが、実際とは逆転していってますが。。。。)

●複数通貨ペアの連続評価実行がなぜ必要?

そもそも複数通貨ペアを連続実行する必要があるのか?

ということなのですが、以下の理由です。

それは、名著と言われるロバート・パルド著トレーディングシステムの開発と検証と最適化のアップデート版アルゴリズムトレーディング入門との出会いです。
(詳細は別途)

この本、どうやってトレーディングシステムを開発していくかが書かれているのですが、主な内容はそのシステムが堅牢かどうかを、どうやって検証していけば判断できるのか、ということに主眼が置かれています。
(なので、どういう風に売買ルールやサイジングを決めていくかは書かれていないに等しい)

システムが堅牢であるという事は、カーブフィッティングが無く、将来も利益を生む可能性が高いということで、とっても重要なこと。

で、この書籍での検証プロセスの中に「多市場多期間検証」という工程があり、それは複数市場で複数期間(※)の検証が必要という事。
※複数期間検証:例えば、10年分のデータを元に評価する際、その10年を2年毎等に4分割して、各期間毎に評価すること。(もちろん、その後にもいろいろな評価工程が続くのですが)

複数市場とはFXでいうと複数の通貨ペア。

つまり、複数の通貨ペアで利益を出せる様なシステムが、堅牢なシステムである事の必要条件なのです。(もちろん、特定通貨ペアの特性を活かしたシステムの場合は別だと思いますが)

なので、1回のストラテジ実行で、連続して複数通過ペアを評価できるととっても便利!!

ちなみに、私はパソコン(ForexTester2?)性能の都合上多市場多期間検証の前に、検証工程を追加していますが、それでも複数通貨ペアで評価しています。
(いかんせん本記事執筆時点でも、トレード開始を決意してから一年未満の初心者だから、試行錯誤も多いので。。。)

この記事書いている裏でもForexTester2が多市場多期間検証をがんばって実行してくれてます。
(14通貨ペア×2年を1セット。合計4セットしてます。1セット2Hぐらいかかる。。)


●実際に多市場多期間検証してみて感じたこと

通貨ペア毎に特性が違うのは何となく感覚的にわかるのですが、ある年はどの通貨ペアでも利益が出るのに、ある年はどの通過ペアもダメって事は当たり前、ってことに割と最近気づきました。
(気づくの遅い??)
感覚的に、ある通貨ペアがダメな時は、他の通貨ペアでは大丈夫じゃないの?って思ってたのが見事に裏切られました。。。

そもそもシステムが悪いんじゃないの?って話なんですが。。


●複数通貨ペア連続評価用のプログラミング
 最初どーしよっかなーって悩んでいたのですが、実は簡単なロジックでできてしまいます。ミソは「Strategy optimizer」を上手く使うということです。
 この「Strategy optimizer」という機能、数字のパラメータに関しては少しずつ変化させながら指定された期間を評価できるのですが、Currency(通貨ペア)は通貨ペアを順次変えるという事ができません。
そこでここの工夫のポイントは、通貨ペアを数字化してしまうというものです。

 ①InitStrategy関数
  まず、「Strategy optimizer」で通貨ペアを変化させれる様に、以下のソースを追加します。
  また、グローバル変数としてCurrencyNoをInteger型で定義しておいてください。

  // Register external parameters(おそらくある既存のソース)
  RegOption('Currency', ot_Currency, Currency);
  ReplaceStr(Currency, 'USDJPY');

  // 追加するソース
  RegOption('CurrencyNo', ot_Integer, CurrencyNo);
  SetOptionRange('CurrencyNo', 0, MaxInt);
  CurrencyNo := 0;

 ②ResetStrategy関数
  ResetStrategy関数の最初に以下のソースを追加します。
  新規に追加したStrategyパラメータ「CurrencyNo」を0にした場合は、「Currency」で指定
  された通貨ペアだけを実行できます。

  以下の例では、2つの通貨ペアセットが用意されていて、1~11と、21~34の2種類です。
  どの通貨ペアを選ぶかは好みとスキルやプランで決めてください。

  ただし、数字は連番である必要があるので注意!!

  私の場合、前述の追加した工程では、1~11をつかって、2001年、2005年、2009年を評価し、
  多市場多期間検証では21~34を使って、2001年から2008年を2年刻みで評価しています。

  // Set Currency
  if CurrencyNo <> 0 then
  begin
       case CurrencyNo of
            // 多市場多期間 事前検証用
            1: ReplaceStr(Currency,'EURJPY');
            2: ReplaceStr(Currency,'AUDJPY');
            3: ReplaceStr(Currency,'GBPJPY');
            4: ReplaceStr(Currency,'USDJPY');
            5: ReplaceStr(Currency,'CHFJPY');
            6: ReplaceStr(Currency,'USDCAD');
            7: ReplaceStr(Currency,'USDCHF');
            8: ReplaceStr(Currency,'EURUSD');
            9: ReplaceStr(Currency,'GBPUSD');
            10: ReplaceStr(Currency,'NZDJPY');
            11: ReplaceStr(Currency,'NZDUSD');
            // 多市場多期間検証用
            21: ReplaceStr(Currency,'AUDJPY');
            22: ReplaceStr(Currency,'AUDUSD');
            23: ReplaceStr(Currency,'CHFJPY');
            24: ReplaceStr(Currency,'EURCHF');
            25: ReplaceStr(Currency,'EURGBP');
            26: ReplaceStr(Currency,'EURJPY');
            27: ReplaceStr(Currency,'EURUSD');
            28: ReplaceStr(Currency,'GBPJPY');
            29: ReplaceStr(Currency,'GBPUSD');
            30: ReplaceStr(Currency,'NZDJPY');
            31: ReplaceStr(Currency,'NZDUSD');
            32: ReplaceStr(Currency,'USDCAD');
            33: ReplaceStr(Currency,'USDCHF');
            34: ReplaceStr(Currency,'USDJPY');
       end;
  end;
 プログラムは以上。今までと比べて簡単でしょ?でしょ?
  ちなみに、21番からは通貨ペアをABC順にしてます。ちゃんと意味があります。
 これは、Excelにデータを取り込んだ後の集計で、都合がいいからです。
 ExcelでLOOKUP関数を使って通貨ペアを検索する必要があったのですが、この
 LOOKUP関数は、昇順にソートされていなければならないからです。


●複数通貨ペア連続評価の実行

 評価対象となる通貨ペアのデータは全て事前にインポートしてジェネレートしておく必要
 があります。
 評価を連続実行するには、メニュー「Tools」→「Strategy optimizer」を選択。
 先ほど追加したパラメータの「CurrencyNo」の"Start Value"を1、"Step"を1、"End Value"を11
 にすれば、上記プログラムの1~11の通貨ペアが指定された期間を自動で連続評価していって
 くれます。 21~34の場合は、21、1、34になります。

 ここで思い出して欲しいのですが、「Strategy optimizer」とういう機能は評価結果の結果は
 サマリしかExcel/CSVに出力できません。しかもForexTester2のデバッグ用Print文も出力され
 ません。なので全トレードを元に独自の観点で評価する場合に独自のログ出力機能が必要にな
 るのです。
 (実際、資金残高曲線の滑らかさを評価しようとすると独自ログ出力は必須)


●ストラテジプログラミング時代の最後に

 実は最近必要性を感じ始めつつもまだ追加できていない機能があります。
 (はよ言えって??

 それは、複数システム/複数通貨ペアの同時実行機能です。

 最近思ったのですが、滑らかな資金残高曲線とリスク分散を考えると、
 複数通貨ペア/複数システムの同時実行が必要性だなぁって事。

 もちろん、個別の実行結果をExcelで集計して擬似的にシミュレーションすることは
 当然できます。

 しかし、資金残高固定比率のサイジングモデルを使用していると、実際ドローダウンが
 どの程度発生し、どれぐらいで回復するのかが正確にわからないのです。
 (個別でやってると正確なシミュレーションにならない

 ある程度プログラムアイデアはできているのですが、ソースファイルへの影響範囲が大きいので
 まだやっていません。(実行スピードにも心配が。。。)

 もしできた日が来ればブログに投稿してみたいと思います。


思った以上に長くなってしまった。。。しかも、笑えない。。。


とうことで、ストラテジプログラミング時代は終わりです。


そして、「FXシステムトレード初心者奮闘記」はついにシステム開発・評価時代に突入するのでした!次こそお笑いの時代に戻れるかなぁ。。。やっぱり笑ってなんぼや!!

でもやっぱり、ForexTester2気に入ってます!!



0 件のコメント:

コメントを投稿