USDJPY日足用のシグナルを決めていきます。
シグナルの決め方は前回記事を参照してください。
Table of Contents
X期間の標準偏差を上抜けたときにポジションを持ち、Y数の足が経過するとポジションを閉じます。
Xは20~200(20ステップ)まで、Yは1~30(1ステップ)までで最適化を実行しました。
利益/最大ドローダウンの比率を基準とした順位は1~10位までが以下の画像の通りです。
最適化期間は2005.5.30~2018.5.28としています。
また今回は取引コストとしてスプレッドを30(3pips)としてバックテストを実施しています。
Xは80または60が良い結果になっています。Yは10以下になっており、長時間のトレードはなく良い傾向かと思います。
ここではボリンジャーバンド期間=80、経過足数=3を選択しました。
選択したパスでのバックテスト期間は約1年追加し、2005.5.30~2019.4.5までとし、アウトオブサンプルテストも兼ねました。
資産曲線はまあまあです。最適化期間以外においてもパフォーマンスが大きく下がってはおらず、カーブフィッティングはないものと思います。
X期間の最高値を更新したときにポジションを持ち、Y数の足が経過するとポジションを閉じます。
結果を見る前にサンプルソースの変更箇所の説明を簡単にします。
変更前のソース
/* ドンチャン */ if( DonchanEnable == true ){ if( DonchanCounterTrend == 0 ){ dIndiVal[0] = High[iHighest(NULL, 0, MODE_HIGH, DonchanPeriod, 1)]; dIndiVal[1] = High[iHighest(NULL, 0, MODE_HIGH, DonchanPeriod, 2)]; dIndiVal[2] = Low[iLowest(NULL, 0, MODE_LOW, DonchanPeriod, 1)]; dIndiVal[3] = Low[iLowest(NULL, 0, MODE_LOW, DonchanPeriod, 2)]; }else{ dIndiVal[3] = High[iHighest(NULL, 0, MODE_HIGH, DonchanPeriod, 1)]; dIndiVal[2] = High[iHighest(NULL, 0, MODE_HIGH, DonchanPeriod, 2)]; dIndiVal[1] = Low[iLowest(NULL, 0, MODE_LOW, DonchanPeriod, 1)]; dIndiVal[0] = Low[iLowest(NULL, 0, MODE_LOW, DonchanPeriod, 2)]; } if( sel == 0 ){ if(dIndiVal[0] > dIndiVal[1]){ // 買いセットアップの確認 ret &= 1; }else{ ret = 0; } }else{ if(dIndiVal[2] < dIndiVal[3]){ // 売りセットアップの確認 ret &= 1; }else{ ret = 0; } } }
変更後のソース
/* ドンチャン */ if( DonchanEnable == true ){ dIndiVal[0] = High[iHighest(NULL, 0, MODE_HIGH, DonchanPeriod, 1)]; dIndiVal[1] = High[iHighest(NULL, 0, MODE_HIGH, DonchanPeriod, 2)]; dIndiVal[2] = High[iHighest(NULL, 0, MODE_HIGH, DonchanPeriod, 3)]; dIndiVal[3] = Low[iLowest(NULL, 0, MODE_LOW, DonchanPeriod, 1)]; dIndiVal[4] = Low[iLowest(NULL, 0, MODE_LOW, DonchanPeriod, 2)]; dIndiVal[5] = Low[iLowest(NULL, 0, MODE_LOW, DonchanPeriod, 3)]; if( DonchanCounterTrend == 0 ){ if( sel == 0 ){ if((dIndiVal[0] > dIndiVal[1]) && (dIndiVal[1] <= dIndiVal[2])){ // 買いセットアップの確認 ret &= 1; }else{ ret = 0; } }else{ if((dIndiVal[3] < dIndiVal[4]) && (dIndiVal[4] >= dIndiVal[5])){ // 売りセットアップの確認 ret &= 1; }else{ ret = 0; } } }else{ if( sel == 0 ){ if((dIndiVal[3] < dIndiVal[4]) && (dIndiVal[4] >= dIndiVal[5])){ // 買いセットアップの確認 ret &= 1; }else{ ret = 0; } }else{ if((dIndiVal[0] > dIndiVal[1]) && (dIndiVal[1] <= dIndiVal[2])){ // 売りセットアップの確認 ret &= 1; }else{ ret = 0; } } } }
変更内容は判定する足を一つ追加し、買いであれば2前足≦3前足の条件を加えて高値連続更新ではシグナルが発生しないようにしました。
ボリンジャーバンドと同様に最適化結果の1~10位を算出します。
Xは100以上が良い結果になっています。Yは10以下になっており、長時間のトレードはなく良い傾向かと思います。
今回は損益/ドローダウン以外の要素として取引回数を考慮し、
パス125:ドンチャン期間=100、経過足数=5を選択しました。
最適化期間以外の成績が思わしくないですが、最大ドローダウン更新までは様子見で良いと思います。
確認のために、最適化期間以外を含めて最適化をしましたが、ほとんどのパラメータで成績は悪くなっていました。
全データを含めた最適化結果と選択するパラメータが変わらなければ問題なしとします。
上記のパラメータの考えは「トレードシステムの法則」のBRACテストを参考にしています。
X期間のRSI値55を価格が上回ったときにポジションを持ち、Y数の足が経過するとポジションを閉じます。
最適化の期間、パラメータは他のシグナル同様です。
RSIでの1~10位は以下の画像のとおりです。
結果はやはり取引回数が少ないことがネックになりそうです。
20回ですと年1~2回程度の取引になってきますので、そのままシグナルに使うのは危険が伴います。
ここではRSI期間=80、経過足数=1を選択します。
結果的には最適化期間以外で取引が確認でき、プラスとなりました。しかしRSIは特に取引回数が少ないため、もし運用する場合は最大ドローダウンを超えた時点ですぐに停止するなどの注意が必要です。