実装して日記まで書いてますが非公開の手法が大量にあります。
多少の優位性が見られたため分析していた為です。
なお、私は同日売買を可能に修正してProtraを利用しています。
仕様では時価計算が狂うとのことでできませんが、デイトレなどもバックテストが必要なので改造してます。
修正コードは、SimulateBuiltins.cs(Github)にあります。
cosisin氏が使っている陰線ストラテジーの劣化版の有効性検証
2014年02月08日の日記のcosisin氏が使っている陰線ストラテジーの劣化版をバックテストしてみます。
私が使っている陰線ストラテジーの劣化版です。ちなみに私の使っているやつはシグナル半分で期待値7%です。
これでは味気ないので、相場によって仕掛ける銘柄数を変えます。
①相場が中期的に強いときは上位10銘柄に仕掛けます。次の4枚がその画像です。
②中期的に弱いが、ダウが下がっているとき、反発するかもしれないので、上位5銘柄仕掛けます。次の4枚がそれです。
③中期的に弱くて、ダウが上がっているとき、高値掴んで叩き落される可能性があるので、上位2銘柄のみ仕掛けます。次の4枚がそれです。
④最後の2枚は相場によって仕掛け銘柄数を変えたやつをまとめて最適分散したものです。シグナル数変えずにちょっと期待値よくなったでしょ。こんな感じで相場の状況によって仕掛け銘柄数を変えると、安定しやすくなると思います。あまり細かく条件設定したり、優先順位を色々変えたりすると過剰最適化の恐れがあるので程々に。
やりすぎ・・・。
【基本設定】
- 1) 株価の低い場合はランキングしない[50]万円以下
- 2) 売買代金の少ない場合はランキングしない(売買代金の[3]日間平均が[5]千万円以下の場合)
- 3) 単利利用、通年
- 4) 全ての銘柄対象
【買いルール】
- 1) [始値→終値(率)]が[0]より[小さい]
- 2) [平滑移動平均乖離率(6)]が[0]より[大きい]
- 3) [期間高値(高値)(75)÷期間高値(安値)(75)]が[2]より[大きい(同じ含む)]
- 4) [移動平均乖離率(終値)(25)]が[20]より[大きい(同じ含む)]
- 5) [高値]が[値幅制限上限(-1Tick)]で[買い]を仕掛ける
- [YES (5)] 6) [翌日逆指(終日)][値幅制限上限(-1Tick)]で[買い]を仕掛ける
- [NO (5)] 8) [終値→高値(率)]が[5]より[小さい]
- [YES (6)] 7) [翌日逆指(終日)][高値(+1Tick)]で[買い]を仕掛ける
- [NO (7)] 9) [翌日逆指(終日)][終値(+5.00%)]で[買い]を仕掛ける
【手仕舞いルール】
- 1) [翌日逆指値(終日)][終値(-1Tick)]で手仕舞いする
必要な関数追加が多いね・・・・・
ソースコード
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 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 |
# loop-type: date-only //============================== require "TIlib" require "Utility" require "TrendCheck" // ====================================== // cosisin氏の陰線ストラテジーの劣化版 // ====================================== // //【基本設定】 // 1) 株価の低い場合はランキングしない[50]万円以下 // 2) 売買代金の少ない場合はランキングしない(売買代金の[3]日間平均が[5]千万円以下の場合) // 3) 単利利用、通年 // 4) 全ての銘柄対象 // //【買いルール】 // 1) [始値→終値(率)]が[0]より[小さい] // 2) [平滑移動平均乖離率(6)]が[0]より[大きい] // 3) [期間高値(高値)(75)÷期間高値(安値)(75)]が[2]より[大きい(同じ含む)] // 4) [移動平均乖離率(終値)(25)]が[20]より[大きい(同じ含む)] // 5) [高値]が[値幅制限上限(-1Tick)]で[買い]を仕掛ける // [YES (5)] 6) [翌日逆指(終日)][値幅制限上限(-1Tick)]で[買い]を仕掛ける // [NO (5)] 8) [終値→高値(率)]が[5]より[小さい] // [YES (6)] 7) [翌日逆指(終日)][高値(+1Tick)]で[買い]を仕掛ける // [NO (7)] 9) [翌日逆指(終日)][終値(+5.00%)]で[買い]を仕掛ける // //【手仕舞いルール】 // // 1) [翌日逆指値(終日)][終値(-1Tick)]で手仕舞いする 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 = 0 // 最大保有日数 $Interest = 1 // 無制限(0) / 単利(1) / 複利(2) $reverse = 1 // 購入順序 昇順(0) / 降順(1) $udcount = 0 // 騰落レシオ利用数 Init() // テクニカル指標初期化 -------------------------- $HLB = [$code_num] $EMA = [$code_num] $MA25 = [$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 ! ($EMA[i] && $MA25[i] && $HLB[i]) //Tilibのオブジェクト生成 $EMA[i] = DiffEMA_new(6) // 平滑移動平均乖離率 $MA25[i] = DiffMA_new(25) // 移動平均乖離率(終値) $HLB[i] = HLBand_new(75) //銘柄ごとのグローバル変数を初期化する $hold[i] = 0 return end //指標の計算を1日進める DiffEMA_next($EMA[i]) DiffMA_next($MA25[i]) HLBand_next($HLB[i]) if ! (Index > 75) return end //================================================== // 保有してない→購入 //================================================== if (! $hold[i]) if ! ($EMA[i][1] && $MA25[i] && $HLB[i][1] && $HLB[i][3] && Close && {-1}Close) return end dma25 = DiffMA_value($MA25[i]) dema = DiffEMA_value($EMA[i]) if ! (dma25 && dema) return end //================================================== // 売買(買い) //================================================== // 1) 株価の低い場合はランキングしない[50]万円以下 // 2) 売買代金の少ない場合はランキングしない(売買代金の[3]日間平均が[5]千万円以下の場合) if ! (SalesValue()/3 + {-1}SalesValue()/3 + {-2}SalesValue()/3 > 50000 && Close > 50) return end // 1) [始値→終値(率)]が[0]より[小さい] check1 = 0 > OpenToClose() // 2) [平滑移動平均乖離率(6)]が[0]より[大きい] check2 = dema > 0 // 3) [期間高値(高値)(75)÷期間高値(安値)(75)]が[2]より[大きい(同じ含む)] check3 = ($HLB[i][1] / $HLB[i][3]) >= 2 // 4) [移動平均乖離率(終値)(25)]が[20]より[大きい(同じ含む)] check4 = dma25 >= 20 // 5) [高値]が[値幅制限上限]より[大きい(同じ含む)] check5 = High > {-1}Close + DailyPriceLimit({-1}Close) if (check1 && check2 && check3 && check4) if (check5) // 6) [翌日逆指値(終日)][値幅制限上限(-1Tick)]で[買い]を仕掛ける PrintLog("購入予定1") $buyflag[i][0] = 1 // 好きなパラメータをもとにソート $buyflag[i][1] = dema $buyCnt = $buyCnt + 1 else // 7) [終値→高値(率)]が[5]より[小さい] check7 = 5 > CloseToHigh() if (check7) // [翌日逆指値(終日)][終値(+5.00%)]で[買い]を仕掛ける PrintLog("購入予定2") $buyflag[i][0] = 2 // 好きなパラメータをもとにソート $buyflag[i][1] = dema $buyCnt = $buyCnt + 1 else // [翌日逆指値(終日)][高値(+1Tick)]で[買い]を仕掛ける PrintLog("購入予定3") $buyflag[i][0] = 3 // 好きなパラメータをもとにソート $buyflag[i][1] = dema $buyCnt = $buyCnt + 1 end end end //================================================== // 保有している→売却 //================================================== elsif ($hold[i]) if ($set[i] < 1) $set[i] = 1 return end $set[i] = $set[i] + 1 //================================================== // 売買(売り) //================================================== // 1) [翌日逆指値(終日)][終値(-1Tick)]で手仕舞いする if ($set[i] >= $MaxHoldDay) PrintLog("手仕舞い") $sellflag[i] = 1 $set[i] = 0 end end end //================================================== // [買い]を仕掛ける //================================================== def BuyingLimitedPrice(i, d, t) //資金が不足している場合は何もしない if ($long == 0) return end //予算を超えない場合だけ買う if ($long * t <= $budget) if ($Interest == 1 || $Interest == 2) $budget = $budget - $long * t end $hold[i] = $long $buy[i] = t {1}Buy((int)t, $hold[i]) Print("B 予算残り = " + $budget) $set[i] = 0 else PrintLog("予算を超過しています") end end //================================================== // 買い(カスタマイズ条件) //================================================== def Buying2(i) if (0 == PricedataExistCheck({1}Open)) if ($buyflag[i][0] == 2) t = StopOrderClose() elsif ($buyflag[i][0] == 3) t = StopOrderHighTick() else t = StopOrderPriceLimitTick() end if (t) BuyingLimitedPrice(i,1,t) end end end //==================== // 買い処理 //==================== def SortBuy(i) if (PricedataExistCheck(Close)) return end $long = 0 $long = Num($buyUnit, Close) codeset = $order[(int)Code] Buying2(codeset) end //================================================== // 売り(カスタマイズ条件) //================================================== def Selling2(i) if (0 == PricedataExistCheck({1}Open)) SellingOpen(i,1) else if (1 == PricedataExistCheck({2}Open)) SellingClose(i,0) else SellingOpen(i,2) end end end //==================== // 売り処理 //==================== def Sell_(i) if ($sellflag[i]) Selling2(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 |
株価データ: 日足 銘柄リスト: 全銘柄 1998/01/05~2019/09/13における成績です。 ---------------------------------------- 全トレード数 1882 勝ちトレード数(勝率) 975(51.81%) 負けトレード数(負率) 907(48.19%) 全トレード平均利率 2.23% 勝ちトレード平均利率 9.52% 負けトレード平均損率 -5.62% 勝ちトレード最大利率 65.82% 負けトレード最大損率 -27.86% 全トレード平均期間 2.94 勝ちトレード平均期間 3.02 負けトレード平均期間 2.86 ---------------------------------------- 必要資金 ¥3,563,400 最大ポジション(簿価) ¥8,943,600 最大ポジション(時価) ¥9,567,900 純利益 ¥41,017,360 勝ちトレード総利益 ¥90,518,060 負けトレード総損失 -¥49,500,700 全トレード平均利益 ¥21,795 勝ちトレード平均利益 ¥92,839 負けトレード平均損失 -¥54,576 勝ちトレード最大利益 ¥575,400 負けトレード最大損失 -¥277,500 プロフィットファクター 1.83 最大ドローダウン(簿価) -¥1,962,520 最大ドローダウン(時価) -¥2,091,324 ---------------------------------------- 現在進行中のトレード数 0 ---------------------------------------- 平均年利 57.55% 平均年利(直近5年) 4.90% 最大連勝 10回 最大連敗 11回 ---------------------------------------- [年度別レポート] 年度 取引回数 運用損益 年利 勝率 PF 最大DD 2019年 64回 -¥288,700円 -8.10% 43.75% 0.83倍 -13.78% 2018年 101回 -¥448,521円 -12.59% 44.55% 0.89倍 -27.86% 2017年 136回 ¥1,006,400円 28.24% 47.79% 1.28倍 -22.78% 2016年 110回 ¥300,900円 8.44% 41.82% 1.08倍 -22.55% 2015年 71回 ¥303,200円 8.51% 40.85% 1.11倍 -17.56% 2014年 142回 ¥1,282,100円 35.98% 40.14% 1.24倍 -24.97% 2013年 257回 ¥7,005,522円 196.60% 50.58% 1.97倍 -22.30% 2012年 84回 ¥3,164,600円 88.81% 52.38% 2.32倍 -18.87% 2011年 85回 ¥2,289,000円 64.24% 52.94% 1.96倍 -26.94% 2010年 67回 ¥1,064,400円 29.87% 50.75% 1.67倍 -12.84% 2009年 144回 ¥3,235,551円 90.80% 51.39% 1.96倍 -17.65% 2008年 63回 ¥1,386,950円 38.92% 49.21% 1.87倍 -18.62% 2007年 44回 ¥906,851円 25.45% 59.09% 1.78倍 -20.27% 2006年 40回 ¥1,108,300円 31.10% 55.00% 2.78倍 -9.78% 2005年 90回 ¥3,198,000円 89.75% 65.56% 3.05倍 -19.22% 2004年 121回 ¥5,191,100円 145.68% 70.25% 4.35倍 -16.81% 2003年 135回 ¥7,500,300円 210.48% 67.41% 4.82倍 -14.29% 2002年 37回 ¥517,200円 14.51% 56.76% 1.59倍 -24.03% 2001年 45回 ¥1,518,200円 42.61% 57.78% 2.73倍 -16.97% 2000年 46回 ¥776,000円 21.78% 63.04% 1.69倍 -24.80% |
利益曲線は次のとおりです。
まとめ
優位性はあるものの、近年の利益率は非常に少ないです。
色々と実験しましたが、指値買い無しでは優位性がありません。
個人的には指値無しで増加傾向のあるストラテジーに対して、安定化するために指値を使っているストラテジーが良い手法だと思ってます。