さて、今回は前回の周期統計から得られたトレンド判定を軸にシミュ
レーションを行っていきます。前回までの内容を把握されていないと
意味不明なので下記にリンクを貼っておきます。
参考 : 観測枠を無効化するには?? その1
参考 : 観測枠を無効化させるには?? その2
参考 : 観測枠を無効化Excelファイル解説
参考 : 周期統計と観測枠の無効化
シミュレーションは前回行った売買戦略にトレンド判定を使いする形
にするだけです。ではテスト環境と追加条件を!
【テスト環境】
測定範囲 : 2011年5月5日 00:00~2012年3月27日 9:35
時間軸 : 5分足
シンボル : USDJPY
売買方式 : ドテン方式
各種コスト : 考慮していません
戦略特徴 : 時系列と通常移動平均線のクロスにおける逆張り戦略
【追加条件】
条件1 : トレンド修正した現区間周期が設定した閾値未満を逆張り戦略
条件2 : トレンド修正した現区間周期が設定した閾値より大きい時を順張り戦略
買いパターン⇒終値>通常移動平均線
売りパターン⇒終値<通常移動平均線
条件3 : 条件2は逆張りポジションを保有している時のみ作動
Multicharts用のソースコードは最後に載せますね (^-^)/
閾値は面倒なので最適化に頼りました (;^_^A
前回のシミュレーションでも最適化レポート載せたので比較できるって
のもありますけどね!
ただパラメータが2つになって最適化結果が多いのでCSVファイルをあ
げておきます。
記事で扱ったExcelの処理はExcelファイルダウンロードサービス内にて
ダウンロードできます
今回のファイル名 : 観測枠無効化最適化シミュ
※ ファイルの反映に時間がかかる時があります
ではシミュレーション結果ですが、まず2つのパラメータの組み合わせ
により総損益の状態を3Dグラフで観察します。
注目すべきは同じリターン空間に全ての組み合わせが存在していること
ですね。ちなみに総損益がマイナスになる組み合わせはありません。
0にあるのはトレードが無くなってしまうパラメータなので除外です。
同じリターン空間に全てのパラメータが存在するということは、
過剰最適化される余地が限りなく少ない (ノ゚ο゚)ノ
ということです。なのでパフォーマンス上位だけを示しても問題なさそうな
ので上位だけ示します。
参考 : 観測枠を無効化させるには?? その2
上記のリンク先にある最初のシミュレーションと比較してもわかりますが、
・ 可変移動平均線の特徴であった総損益の高さ
・ 通常移動平均線の特徴であった勝率の高さ
を引き継いだ形になりました。取引回数も減ってコストも減少してますね!
PFも当然高めです。どうやら、
周期のカウントによるトレンド判定は有効そう?
と言える結果ではないかという感じです。少なくとも周期統計の目的は果た
せた結果ですね (^-^)/
しかし、この売買戦略が実践に生かせるかどうかは疑問です。なぜなら、
ⅰ) 平均損益の低さ
ⅱ) 損益レシオの低さ
があるからです。まずコスト割れですし、負ける時の幅が勝つ時の幅より大き
い場面が多いので改良が必要でしょう。後は、
ドル円だから見栄えが良い ∑(゚Д゚)
ってのもあります。基本的にドル円のヒストリカルは簡単に高機能そうな戦略
を組むことができます。だからこその例題なので他の市場の銘柄とか多くの
銘柄で有効性をチェックする必要はありますよ (;^_^A
では次回は通常移動平均線を可変移動平均線に入れ替えた場合のシミュレ
ーションを扱います♪
【今回の戦略のMultichartsソースコード】
Inputs:length(20),Trend(7);
Vars:count(0),MAsum(0),MA(0),MALine(0),period(0),
OplengthL(0),OpMAsumL(0),OpMAL(0);
//Normal MA
MAsum=0;
For count=0 to length-1 begin
MAsum=close[count]+MAsum;
end;
MA=MAsum/length;
//Length Setting
If (close crosses over MA) or (close crosses under MA) then MALine=close;
If MALine<>MAline[1] then begin
period=1;
If period[1]>6 then begin
OplengthL=period[1]+1;
end else If period[1]<=6 then begin
OplengthL=6;
end;
end else
period=period[1]+1;
If OplengthL<period then OplengthL=period;
//OpMA
OpMAsumL=0;
For count=0 to OplengthL-1 begin
OpMAsumL=close[count]+OpMAsumL;
end;
If OpMAsumL<>0 and OplengthL<>0 then OpMAL=OpMAsumL/OplengthL else OpMAL=OpMAL[1];
//Signal1
If MA crosses over close and OplengthL<Trend then buy next bar at market;
If MA crosses under close and OplengthL<Trend then sellshort next bar at market;
//Signal2
If marketposition=1 and MA<close and OplengthL>Trend then sellshort next bar at market;
If marketposition=-1 and MA>close and OplengthL>Trend then buy next bar at market;