ストラテジー作成中に、裏で全銘柄のバックテストしていると、7時間とか10時間とか待つことになります。
PtSim.exeはそのままでは同時起動できません。
ソースコードを確認すると、アプリ名で同時起動を制限しているようです。
このため、アプリをコピペして異なる名前にすると同時アプリ起動が可能でした。
1つのPtSim.exeを使ったバックテストでCPU負荷は35%、2つのPtSim.exe起動でCPU負荷が70%程度、手元では3つのバックテストを走らせることが出来ています。
なお、同じストラテジーはプロセスが使われているのでバックテスト出来ません。
その時はストラテジーもコピペしてしまいます。
上手に時間を使って効率化をはかりたいです。
一目均衡表とは?
一目均衡表は、都新聞の商況部長として活躍した細田悟一氏が、1936年に一目山人というペンネームで発表したテクニカル指標です。
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 31 32 33 34 |
require "Color" require "TIlib" $Names[0] = "基準" $Colors[0] = $Red $Names[1] = "転換" $Colors[1] = $Green $Names[2] = "先行1" $Colors[2] = $Pink $Names[3] = "先行2" $Colors[3] = $SkyBlue $Names[4] = "遅行" $Colors[4] = $Blue if !$Ichimoku $Ichimoku = Ichimoku_new(9, 26, 52) Candle_draw($White, $Yellow) Indicator(0, $Ichimoku[1]) Indicator(1, $Ichimoku[3]) Indicator(2, $Ichimoku[5]) Indicator(3, $Ichimoku[7]) Indicator(4, $Ichimoku[9]) else Ichimoku_next($Ichimoku) Ichimoku_fillKumo($Ichimoku, $Colors[2], $Colors[3]) {-1}Ichimoku_repairCandle($White, $Yellow) Candle_draw($White, $Yellow) Ichimoku_draw($Ichimoku, $Colors[0], $Colors[1], $Colors[2], $Colors[3], $Colors[4]) Indicator(0, $Ichimoku[1]) Indicator(1, $Ichimoku[3]) Indicator(2, $Ichimoku[5]) Indicator(3, $Ichimoku[7]) Indicator(4, $Ichimoku[9]) end |
外国人トレーダーからも「Ichimoku」として親しまれ、「ローソク足チャート」とともに純国産のテクニカル指標として世界中で利用されています。
とても奥が深いテクニカル指標で、日本でも熟知している投資家は数名しかいないと言われています。
一目均衡表は、相場は「売り手」と「買い手」の『均衡(パワーバランス)』が崩れた方向へ動き、方向性が確立した後、相場の行方というものは『一目瞭然』(いちもくりょうぜん)である、という考え方に基づいています。
次のときは、買いシグナルとなり「好転した」と言います。
- ①転換線が基準線を上抜けたとき
- ②遅行スパンがローソク足を上抜けたとき
- ③ローソク足が雲を上抜けたとき
さらに、①②③の買いシグナルが3つそろった場合を「三役好転」と言い、より強い買いシグナルとなります。
あまりシステムトレードで、この指標を使ったストラテジーを見た事ありませんが、一目均衡表を使ったストラテジーが販売されていたので、検証してみました。
一目均衡表とRSIの有効性検証
出品されているストラテジーを見ると次のようになっています。
■仕掛け・手仕舞いともに前日の夜にご注文いただくことが可能です。仕事をしている方でも安心してご利用いただけます。
■仕掛け・手仕舞いともに成行注文となっているので、ストップ高・ストップ安でない限り約定します。
■相場情報は使用していません。
■フィルター(最適分散投資)は使用していません。
■スリッページは逆指値を使用していないのでありません。
■低位株は売買から除外しています。
特殊な事はしていなそうなので、一般的な手法で検証してみます。
【ランキング条件】
- 1) 株価の低い場合はランキングしない[150]万円以下
- 2) 売買代金の少ない場合はランキングしない(売買代金の[3]日間平均が[5]千万円以下の場合)
【買いルール】
- 1) ローソク足が一目均衡表の雲の上
- 2) RSIが30%以下
【手仕舞いルール】
- 1) 利食い:5%のプラス
- 2) 最大保有日数:4日
すごく単純ですね。既に勝てる気はしません。
ソースコード
TIlib、Utility、TrendCheckライブラリはGitHubに置いています(日記の公開日に合わせたバージョンを利用下さい)
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 |
# loop-type: date-only //============================== require "TIlib" require "Utility" require "TrendCheck" // ====================================== // イチモクRSI // ====================================== // //[ランキング条件] // 1) 株価の低い場合はランキングしない[150]万円以下 // 2) 売買代金の少ない場合はランキングしない(売買代金の[3]日間平均が[5]千万円以下の場合) // //[買いルール] // 1) ローソク足が雲の上にあり、RSIが30%を下回って確定した時 // //[手仕舞いルール] // 1) 利食い:5%のプラス // 2) 最大保有日数:4日 codes = CodeList if ($code_num && $code_num != Length(codes)) Print("前回と異なる銘柄リストでは実行できません。") Dummy end $code_num = Length(codes) //グローバル変数を初期化 if (!$__INIT__) $budgetIni = 10000000 $buyUnit = 1000000 // 1回の購入資金 (100万円) $MaxHoldDay = 2 // 最大保有日数 $shortSelling = 0 // 空売り戦略 Yes(1)/No(0) $Interest = 1 // 無制限(0) / 単利(1) / 複利(2) $reverse = 0 // 購入順序 昇順(0) / 降順(1) $udcount = 0 // 騰落レシオ利用数 Init() // テクニカル指標初期化 -------------------------- $ICHI = [$code_num] $RSI = [$code_num] //------------------------------------------------ InitDone() // 騰落レシオ初期化 $__INIT__ = 1 end def Main(i) //================================================== // 条件(買条件, 売条件共通部分) //================================================== //まだ上場していない銘柄は株価データがないためnullが返る if (Index == null) return end if ! ($order[(int)Code]) $order[(int)Code] = i end if ! ($ICHI[i] && $RSI[i]) //Tilibのオブジェクト生成 $ICHI[i] = Ichimoku_new(9, 26, 52) $RSI[i] = RSI_new(14, 1) // Wilder RSI //銘柄ごとのグローバル変数を初期化する $hold[i] = 0 return end //指標の計算を1日進める Ichimoku_next($ICHI[i]) RSI_next($RSI[i]) //================================================== // 保有してない→購入 //================================================== if (! $hold[i]) //================================================== // 売買(買い) //================================================== // 1) 株価の低い場合はランキングしない[150]万円以下 // 2) 売買代金の少ない場合はランキングしない(売買代金の[3]日間平均が[5]千万円以下の場合) if ! (Close && {-1}Close && {-2}Close) return end if ! (SalesValue()/3 + {-1}SalesValue()/3 + {-2}SalesValue()/3 > 50000 && Close > 150) return end senko1_1 = $ICHI[i][4] senko2_1 = $ICHI[i][6] senko1 = Ichimoku_senko1($ICHI[i]) senko2 = Ichimoku_senko2($ICHI[i]) rsi_1 = $RSI[i][0] rsi = RSI_value($RSI[i]) if ! (kijun_1 && tenkan_1 && kijun && tenkan && senko1_1 && senko2_1 && senko1 && senko2 && rsi_1 && rsi) return end // 1) ローソク足が一目均衡表の雲を上抜けた check1 = (High >= senko1_1 || High >= senko2_1) && senko1 >= Low && senko2 >= Low // 2) RSIが30%を下回った check2 = rsi_1 >= 30 && 30 > rsi if (check1 && check2) PrintLog("購入予定") $buyflag[i][0] = 1 // 好きなパラメータをもとにソート $buyflag[i][1] = rsi $buyCnt = $buyCnt + 1 end //================================================== // 保有している→売却 //================================================== elsif ($hold[i]) if ($set[i] < 1) $set[i] = 1 return end $set[i] = $set[i] + 1 //================================================== // 売買(売り) //================================================== if (Close >= 1.05 * $buy[i]) PrintLog("利食い") $sellflag[i] = 1 $set[i] = 0 elsif ($set[i] >= $MaxHoldDay) $sellflag[i] = 1 $set[i] = 0 end end end //==================== // 買い処理 //==================== def SortBuy(i) if (PricedataExistCheck(Close)) return end $long = 0 $long = Num($buyUnit, Close) codeset = $order[(int)Code] Buying(codeset) end //==================== // 売り処理 //==================== def Sell_(i) if ($sellflag[i]) Selling(i) $sellflag[i] = 0 end // 使用した$buyflag 配列を初期化 if ($buyflag[i][0]) $buyflag[i][0] = 0 $buyflag[i][1] = 0 end end //==================== // 銘柄コードを変えながらMain関数,BuySell関数を実行 //==================== Print("-------------------------------------------------") Print("日付 = "+ Year + "/" + Month + "/" + Day) SortInit() // ソート初期化 i = -1 while (i + 1 < $code_num) i = i + 1 {codes[i]}Main(i) end i = -1 while i + 1 < $code_num i = i + 1 {codes[i]}Sort(i) end i = -1 if ($buyCnt) while i + 1 < $buyCnt i = i + 1 {$sortList2[i]}SortBuy(i) end end i = -1 while i + 1 < $code_num i = i + 1 {codes[i]}Sell_(i) end |
バックテスト結果
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
株価データ: 日足 銘柄リスト: 日経225採用銘柄 1998/01/05~2019/09/20における成績です。 ---------------------------------------- 全トレード数 396 勝ちトレード数(勝率) 223(56.31%) 負けトレード数(負率) 173(43.69%) 全トレード平均利率 0.64% 勝ちトレード平均利率 3.15% 負けトレード平均損率 -2.59% 勝ちトレード最大利率 15.93% 負けトレード最大損率 -18.80% 全トレード平均期間 2.77 勝ちトレード平均期間 2.72 負けトレード平均期間 2.83 ---------------------------------------- 必要資金 ¥8,801,900 最大ポジション(簿価) ¥9,819,900 最大ポジション(時価) ¥10,474,900 純利益 ¥2,254,200 勝ちトレード総利益 ¥6,308,300 負けトレード総損失 -¥4,054,100 全トレード平均利益 ¥5,692 勝ちトレード平均利益 ¥28,288 負けトレード平均損失 -¥23,434 勝ちトレード最大利益 ¥120,000 負けトレード最大損失 -¥181,000 プロフィットファクター 1.56 最大ドローダウン(簿価) -¥837,800 最大ドローダウン(時価) -¥958,600 ---------------------------------------- 現在進行中のトレード数 0 ---------------------------------------- 平均年利 1.28% 平均年利(直近5年) 1.90% 最大連勝 9回 最大連敗 10回 ---------------------------------------- [年度別レポート] 年度 取引回数 運用損益 年利 勝率 PF 最大DD 2019年 16回 -¥252,500円 -2.87% 37.50% 0.25倍 -10.44% 2018年 30回 -¥257,900円 -2.93% 30.00% 0.36倍 -5.93% 2017年 40回 ¥217,000円 2.47% 50.00% 2.12倍 -3.19% 2016年 26回 ¥334,300円 3.80% 76.92% 3.20倍 -6.22% 2015年 33回 ¥795,400円 9.04% 84.85% 8.42倍 -7.44% 2014年 22回 ¥371,000円 4.21% 77.27% 7.29倍 -2.73% 2013年 19回 -¥167,600円 -1.90% 36.84% 0.59倍 -9.27% 2012年 16回 ¥129,400円 1.47% 68.75% 2.17倍 -5.67% 2011年 28回 -¥710,900円 -8.08% 50.00% 0.23倍 -18.80% 2010年 6回 ¥80,900円 0.92% 83.33% 4.06倍 -2.61% 2009年 10回 ¥359,800円 4.09% 70.00% 9.63倍 -2.12% 2008年 6回 -¥33,600円 -0.38% 50.00% 0.48倍 -4.52% 2007年 25回 ¥173,000円 1.97% 60.00% 1.75倍 -7.32% 2006年 23回 ¥87,300円 0.99% 47.83% 1.46倍 -7.93% 2005年 20回 ¥66,100円 0.75% 60.00% 1.71倍 -3.53% 2004年 21回 ¥742,900円 8.44% 85.71% 11.18倍 -4.35% 2003年 11回 ¥302,400円 3.44% 90.91% 13.10倍 -2.67% 2002年 16回 -¥108,300円 -1.23% 31.25% 0.67倍 -6.73% 2001年 13回 ¥69,200円 0.79% 61.54% 2.08倍 -5.02% 2000年 15回 ¥56,300円 0.64% 66.67% 1.25倍 -7.34% |
利益曲線は次のとおりです。
はい、パッとしない結果になりました。
まとめ
単純に一目均衡表を使っても上手く行かないようです。分かってましたが・・・。
坂本タクマ、cosisin氏などのブログを見ても、書籍や他の人のブログを参考にストラテジーをカスタマイズして構築していると書いてあります。
なので、書籍やブログ記事を引用してバックテストをしていますが、なかなか優秀なストラテジーは見つかりません。