忍者ブログ
最新記事
カテゴリー
ブログ内検索
カスタム検索
TradersShop検索

リンク
プロフィール
HN:
さとしぃ
性別:
男性
趣味:
ゲーム、読書、インターネット

Mail:forexsystecpractice☆gmail.com
☆→@

自己紹介:


06/12/04 立ち上げ。夢のためにFXを06年3月からやっております。

08/05/11 システムトレードの勉強開始。ソフトはMT4を使用。

08/08/06 FXDDにて自動売買を1000ドルの資金で開始。

08/10/09 3000ドルからまさかの大転落。100年に1度の金融危機で生き残ったシステムはたったの三つ。

08/12/09 3000ドルの資金を再投入。 徹底的に本を読み続けています。

09/03/22 7700ドル達成。

09/08/14 1000ドル割れ。

09/12/17 3500ドル復帰。

10/04/09 修行中

14/11/21 パワーアップして再挑戦



アーカイブ
カウンター
RSS
<<   2024   04   >>
 1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28  29  30 
26 April 2024            [PR]  |   |
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

01 July 2011            再現性指数の検証。  |  検証  |  TB:  |  C:6  |

システムトレード研究ノート~上級者用~さんの記事「フォワードテストと再現性指数」
がとても興味深かったので、挑戦してみました。

選んだシステムはST-053-12という自作のトレンドフォローEAで、現在ライブ口座で最も良い成績を誇っているシステムです。

以下に前提を

・ソフトウェア
MetaTrader4

・通貨量
 1万通貨で単利です。

・期間
バックテスト期間
2006/10/01-2008/06/21

フォワードテスト期間
2008/6/21-2011/6/28

・対象パラメータ数
18パラメータ

・パラメータのSTEP
それぞれ10~20STEP程度

・手順
①まず、バックテスト期間で、最適化を行います。
②最適化結果の「テスト№」および「パラメータ」をテキストファイルにコピペします。(以降、パラメータファイルと記載)
③ソースを修正します。
  「テスト№」を意味するextern変数を定義します。
  「テスト№」変数の値をもとに、パラメータファイルを検索し、該当テスト№のパラメータを読み込み、既存パラメータに上書くようにします。
④INIT関数部分で、テスト№変数をパラメータファイルに記載のテスト№およびそのパラメータを網羅するように最適化対象を行います。
⑤テスト№変数のみで、最適化!
⑥これで、バックテスト№とフォワードテスト№を結び付けることが出来るようになりました。

・実際のコード(一部)
INIT()

 #再現性指数検証テスト区分。
   if(back_to_foward)
   {
 #パラメータファイルをオープンします。
   int handle = FileOpen(parameter_set_file_name,FILE_CSV|FILE_READ|FILE_WRITE,"\t");
   string param_set = "";
  
   Print("FileOpen = " + handle );
   FileSeek(handle,0,SEEK_SET);
   
  #ポインタがファイルの最終端になるまで。
      while(!FileIsEnding(handle))
      {
   #ファイルを読み込みます。「タブ」区切りで読み込みますので、この場合、現在のポインタから次のタブまで読み込みます。
         param_set = FileReadString(handle);
        
         //Print("####param_set = " + param_set);
         
   #各行の1つ目の値はテスト№となりますので、それがextern変数と同じか?判断します。
         if( StrToDouble(param_set) == back_test_no )
         {
    #同じであれば、パラメータを順次読み込み、既存変数に対して、置き換えていきます。
    #行の最終端まで繰り返しパラメータ読み込みを行います。

            while(!FileIsLineEnding(handle))
            {
               param_set = FileReadString(handle);
               Print("####param_set = " + param_set);
               
      #iMA_Method は、変数名です。読み込んだ文字列が変数名と同じであれば、
      #”iMA_Method=” より以降の文字列をパラメータとして再設定します。
      #読み取り時の関数は、パラメータのデータ型に依存するので、適宜使い分けてください。

               if(StringSubstr(param_set,0,StringLen("iMA_Method")) == "iMA_Method")
               {
                  iMA_Method = StrToInteger(StringSubstr(param_set,StringLen("iMA_Method")+StringLen("=")));
                  Print("iMA_Method = " + iMA_Method);
               }


・パラメータファイルの構成(ダミーパラメータですが)
1■proflevel=4■stoplevel=8■span=6■Leverage=20■slippage=5
2■proflevel=2■stoplevel=3■span=39■Leverage=20■slippage=5
■ = タブ

テスト№ パラメータ1 パラメータ2 パラメータ3
テスト№ パラメータ1 パラメータ2 パラメータ3

といった感じで並んでいます。



~~~~~~~~~~~~~~~~~~~~~~~~~~~

テストをしてみました。
最適化の出力項目について、エクセルにて
バックテストデータをX軸、
フォワードテストデータをY軸で取り、
散布図を作成し、回帰直線、決定係数を出してみました。

・損益
成績

良い感じですね。決定係数も0.6超えということで、「相当凄い」システム認定されましたかね?
ちなみに、下の方に溜まっているのは死んでいるケースですね。

・PF(プロフィットファクター)
PF

これも良い傾向ですが、バックテスト時に比べてPFは下がる傾向が見受けられます。

・平均損益
平均損益

これはシステム側でコントロールしているせいでこのような分布になっています。

・最大DD(資産割合)
DD(割合)

バックテスト時のDDが低いほど、フォワードテスト時のDDも低い割合が出やすくなっています。
上に貯まっているのは死んでいるケースですね。。

・トレード数
トレード数

これはおもしろい分布だと思いました。
どう捉えていいか迷いますが、トレンドフォローは繁忙期と閑散期があるのかもしれないですね。
パラメータと相場状況がトレード数に影響を及ぼしていると考えると、上記の分布もある程度納得できそうです。

・DD(金額)
DD(金額)

ほとんどDD(割合)とおなじですね。
バックテスト時に低かったDDは、ある程度抑えられるが、相場状況によっては死ぬということですかね・・・。

・テスト全体の推移
バックテスト時の最適化の内訳
損益プラス:8374
損益マイナス:2410
損益0:3

フォワードテスト時の内訳
損益プラス:9163
損益マイナス:1624
損益0:0

上手くいきすぎていますが、良いですw


・問題点

①パラメータセットの母集団非網羅

このテスト手順に問題点があります。
もともとこの手順は面倒で行うつもりはありませんでした。
当初は、2期間で最適化を行い、重複して出現したパラメータセットで検証する予定でした。
ところが、パラメータ数が多すぎたため、重複がまったく起きていなかったのです・・・・。

検証用エクセルを作っていたのですが、まったく同一パラメータが出現しませんでした。
2期間の最適化パラメータを1セルに文字列を集約して、昇順ソートし、
IF文で検証もしましたが、確かに一件も重複していませんでした。


上記のことから、バックテストパラメータファイルと解析用コードを作成し、最適化機能を利用することで、
今の手順で進めることとしました。

というわけで、一度の再現性分析だけでは、パラメータセットの母集団のうち、
10000件程度を行ったに過ぎないので問題ではあります。

もちろん、パラメータセットのパターンが少なければ、一回の検証で終わるとは思います。


②システムの前提条件の問題

テスト期間において、テスト対象のシステムが前提としている相場状況でないと、
純粋なシステムの良し悪しが判断出来ないのかなぁと感じております。

期間によって、再現性指数がぶれるシステムもあると思います。
その場合、前提をしっかり意識していないと、「使えないシステム」として認定するリスクがあります。

今回はたまたま対象テスト期間で前提を満たしていただけかと。

・まとめ
今回のテストではうれしいことが二つありました。

一つは、現在利用しているトレンドフォローは今後もある程度期待出来そうだということ。
一つは、パラメータ数が大量にあっても、過剰最適化に必ずしもなりえないこと。今回は18パラメータです。

ということで、持論を強化する結果が得られたので大変満足ですた。


短期システムの検証を週末に行いますが、あんまり期待出来ない^^;


拍手[9回]

PR
Coment
01 July 2011  1 : [Edit]             パチパチパチパチパチパチパチパチ by takechan  ( URL )
さとしぃさん、凄いですね。

まず、かなり大規模な実験、お疲れ様でした。

次に、メタトレーダーをここまで上手に使いこなす発想と技術に敬服いたします。

>パラメータ数が大量にあっても、過剰最適化に必ずしもなりえないこと。今回は18パラメータです。

これが一番痛快ですね。「パラメーター数が多いシステムはカーブフィッティングに陥っているのでダメだ」というのが圧倒的な通説ですが、今回のさとしぃさんの実験で、通説は大きく揺れることになりそうです。私も、「パラメーター数と過剰最適化とは直接的な因果関係があるわけではない」との少数説に立っているので、今回のさとしぃさんの実験結果がうれしくてたまりません。

今後もすばらしい記事を期待しております。

01 July 2011  2 : [Edit]             無題 by saru999  ( URL )
おもしろい記事をありがとうございます。
そして、具体的なプログラムまで公開していただきありがとうございます。



01 July 2011  3 : [Edit]             無題 by Phai  ( URL )
こんばんは、Phaiです。

大量のデータ解析、すごいですね。

> パラメータセットの母集団のうち、
> 10000件程度を行ったに過ぎないので問題ではあります。

18個のパラメータですから、
1個あたり2通りの数値を試したとしても2の18乗通りで2万6千以上になってしまうんですね。

そうなると、
1)できるだけ多くの種類のパラメータを動かす
2)またはパラメータを数個程度に絞ってそこだけ重点的に動かす

の2つのやり方があると思いますが、
今回はどちらのタイプに近いのでしょう?


それにしても再現性指数あっさり0.50超えとは驚きです。
私の直観がアテにならないのか、さとしぃさんのシステムが素晴らしいのか。
もちろん後者であることを願ってます^^

02 July 2011  4 : [Edit]             無題 by さとしぃ  (  )
takechan 様
お褒め頂き光栄ですー。
言われてみれば、確かに「>パラメータ数が大量にあっても、過剰最適化に必ずしもなりえないこと。」というのは痛快な結果でしたね。
一般的でないトレーダーであるシステムトレーダーの一般的な常識も必ずしも正しくないということですかね。オモシロイ構造です。

02 July 2011  5 : [Edit]             無題 by さとしぃ  (  )
saru999 様
お褒め頂きありがとうございます。
ちょっと、記述がぐちゃぐちゃなので、整理しておきますね。
プログラムのコードはINIT部分にセットすれば良いです。START部分だと、負担になりそうです。

02 July 2011  6 : [Edit]             無題 by さとしぃ  (  )
Phai 様
お褒め頂きありがとうございます。
Phaiさんの記事が無ければやらなかったと思います。それに現実逃避が好きな私は思いついても、きっかけが無ければ手を動かさなかったかも知れないです。

パラメータは、18パラメータ全てを最適化対象としてMT4の遺伝的アルゴリズムで最適化しています。各パラメータごとに、初期値、STEP値、最大値というような設定があり、遺伝的アルゴリズムでそれをランダムに組み合わせていく形になっています。
今回の18パラメータはそれぞれ10~20STEP程度はあるので、
10の18乗から20の18乗くらいの組み合わせになりますかね。
1000京くらいですかね・・・・。まぁ、個々のパラメータの近傍値は遺伝的アルゴリズムで飛ばされるので平気かも知れませんが・・・。
ある程度回数を積む必要はあるかもしれません。

0.5超えは正直にやにやしちゃうのが止まらないですが、どこまで行っても絶対は無いので、そこは留意しておきます。。。

Name

Title

Mailadress

URL

Font Color
Normal   White
Comment

Password


<<   HOME    711  710  709  708  707  706  705  703  702  701  700   >>
忍者ブログ/[PR]

Template by coconuts