[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
システムトレード研究ノート~上級者用~さんの記事「フォワードテストと再現性指数」
がとても興味深かったので、挑戦してみました。
選んだシステムは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は下がる傾向が見受けられます。
・平均損益
これはシステム側でコントロールしているせいでこのような分布になっています。
・最大DD(資産割合)
バックテスト時のDDが低いほど、フォワードテスト時のDDも低い割合が出やすくなっています。
上に貯まっているのは死んでいるケースですね。。
・トレード数
これはおもしろい分布だと思いました。
どう捉えていいか迷いますが、トレンドフォローは繁忙期と閑散期があるのかもしれないですね。
パラメータと相場状況がトレード数に影響を及ぼしていると考えると、上記の分布もある程度納得できそうです。
・DD(金額)
ほとんどDD(割合)とおなじですね。
バックテスト時に低かったDDは、ある程度抑えられるが、相場状況によっては死ぬということですかね・・・。
・テスト全体の推移
バックテスト時の最適化の内訳
損益プラス:8374
損益マイナス:2410
損益0:3
フォワードテスト時の内訳
損益プラス:9163
損益マイナス:1624
損益0:0
上手くいきすぎていますが、良いですw
・問題点
①パラメータセットの母集団非網羅
このテスト手順に問題点があります。
もともとこの手順は面倒で行うつもりはありませんでした。
当初は、2期間で最適化を行い、重複して出現したパラメータセットで検証する予定でした。
ところが、パラメータ数が多すぎたため、重複がまったく起きていなかったのです・・・・。
検証用エクセルを作っていたのですが、まったく同一パラメータが出現しませんでした。
2期間の最適化パラメータを1セルに文字列を集約して、昇順ソートし、
IF文で検証もしましたが、確かに一件も重複していませんでした。
上記のことから、バックテストパラメータファイルと解析用コードを作成し、最適化機能を利用することで、
今の手順で進めることとしました。
というわけで、一度の再現性分析だけでは、パラメータセットの母集団のうち、
10000件程度を行ったに過ぎないので問題ではあります。
もちろん、パラメータセットのパターンが少なければ、一回の検証で終わるとは思います。
②システムの前提条件の問題
テスト期間において、テスト対象のシステムが前提としている相場状況でないと、
純粋なシステムの良し悪しが判断出来ないのかなぁと感じております。
期間によって、再現性指数がぶれるシステムもあると思います。
その場合、前提をしっかり意識していないと、「使えないシステム」として認定するリスクがあります。
今回はたまたま対象テスト期間で前提を満たしていただけかと。
・まとめ
今回のテストではうれしいことが二つありました。
一つは、現在利用しているトレンドフォローは今後もある程度期待出来そうだということ。
一つは、パラメータ数が大量にあっても、過剰最適化に必ずしもなりえないこと。今回は18パラメータです。
ということで、持論を強化する結果が得られたので大変満足ですた。
短期システムの検証を週末に行いますが、あんまり期待出来ない^^;