私の無能さとパワハラのため、6人いた部下が全員異動して1年以上経過した。
今月から新規業務を受け持ち、部下が1名増えるらしい。
隣の課の優秀社員2名が異動したので、その2名分の仕事を分担するんだってさー。
チーム体制がマネージャーから説明された。
ちょww
仕事が3倍になってるじゃん!
理不尽さを学ぶ。それがサラリーマン。
給料も地位は何も変わらない。
増えたのは仕事と残業時間と白髪だけ。
仕事を一度も断ったことが無いからなーー。
そのような状況という事もありシステムトレードの検討が全く進んでない。
そもそも個人的な興味が薄れるシーズンということもある。
gorotanhccat氏が今月に入ってストラテジーを公開していた。
gorotanhccat氏の手法は以前も実装した事がある。
未来予測して失敗したけどね。
今回はその辺りに注意してOSSのProtraでバックテストをしてみる。
なお、結論からいうと今回も失敗した。
gorotanhccat氏の逆張りデイ買いの期待値検証
サイトを見る限りストラテジーの結果は「取引回数が毎年3000回~1万回、勝率が約55%、期待値が0.20%、平均利率2.0%」となっている。
ストラテジーをまとめると次の通り。
【仕掛け】
次を満たすとき、[翌日指値(寄付)][終値(+5.00%)]で[買い]を仕掛ける
- [連続高値切り下がり日数]が7より[大きい(同じ含む)]
- [前日終値→高値(率)]が[-10]より[大きい]
【手仕舞い】
- [Stop安(終値)]が[1]と[同じ]
- YES→[翌日寄付]で手仕舞いする
- [Stop高(高値)]が[1]と[同じ]
- YES→[当日指定値][高値(-1Tick)]で手仕舞いにする
- NO→[当日引け]で手仕舞いする
【優先値設定】
- 終値と終値+ATRの乖離率(25)の大きい順
「連続高値切り下がり日数」は、イザナミ用語。
当日高値が前日高値よりも、連続して小さくなり続けている日数のこと。
「前日終値→高値(率)」も、イザナミ用語。
計算式:((高値÷前日終値)-1)×100
「終値と終値+ATRの乖離率」も、イザナミ用語。
「ATR」は真の値幅を指定期間で平均化した指標です。
値動きの強さを判断するときの指標として使われます。「終値と終値-ATRの乖離率」は、「ATR」の水準をゼロからマイナス方向の値の大きさで判断する指標とお考えください。
こちらは以前実装したことがある。
今までストップ高・ストップ安の処理が書かれていていも面倒なので無視してきた。
シストレ上はs安になったらそこで損切りするのを優先します。実践では先にs高で利確できてからs安に行くことも
ストラテジーに、明確に記載があるので今回はキチンと入れてみよう。
バックテスト結果
逆張り買いのパターン
計算時間は全銘柄で5時間。ATRの計算が特に修正してないけど劇遅だった……。
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 |
株価データ: 日足 銘柄リスト: 全銘柄 2000/01/07~2021/09/13における成績です。 ---------------------------------------- 全トレード数 1311 勝ちトレード数(勝率) 154(11.75%) 負けトレード数(負率) 1157(88.25%) 全トレード平均利率 -8.00% 勝ちトレード平均利率 7.30% 負けトレード平均損率 -10.04% 勝ちトレード最大利率 41.03% 負けトレード最大損率 -100.00% 全トレード平均期間 1.46 勝ちトレード平均期間 1.40 負けトレード平均期間 1.47 ---------------------------------------- 必要資金 ¥72,007,500 最大ポジション(簿価) ¥2,761,800 最大ポジション(時価) ¥2,833,000 純利益 -¥70,941,740 勝ちトレード総利益 ¥5,736,094 負けトレード総損失 -¥76,677,830 全トレード平均利益 -¥54,113 勝ちトレード平均利益 ¥37,247 負けトレード平均損失 -¥66,273 勝ちトレード最大利益 ¥250,000 負けトレード最大損失 -¥984,000 プロフィットファクター 0.07 最大ドローダウン(簿価) -¥70,944,740 最大ドローダウン(時価) -¥70,944,740 ---------------------------------------- 現在進行中のトレード数 0 ---------------------------------------- 平均年利 -4.48% 平均年利(直近5年) -0.66% 最大連勝 6回 最大連敗 171回 ---------------------------------------- [年度別レポート] 年度 取引回数 運用損益 年利 勝率 PF 最大DD 2021年 5回 -¥110,100円 -0.15% 20.00% 0.24倍 -9.46% 2020年 22回 -¥467,900円 -0.65% 27.27% 0.07倍 -14.29% 2019年 25回 -¥488,040円 -0.68% 44.00% 0.26倍 -25.00% 2018年 21回 -¥198,700円 -0.28% 33.33% 0.40倍 -11.11% 2017年 32回 -¥1,094,987円 -1.52% 43.75% 0.02倍 -19.05% 2016年 51回 -¥1,226,012円 -1.70% 37.25% 0.20倍 -17.14% 2015年 60回 -¥1,549,090円 -2.15% 40.00% 0.08倍 -12.50% 2014年 67回 -¥863,400円 -1.20% 44.78% 0.32倍 -13.33% 2013年 49回 -¥847,400円 -1.18% 55.10% 0.25倍 -25.00% 2012年 114回 -¥16,311,900円 -22.65% 33.33% 0.01倍 -100.00% 2011年 88回 -¥7,200,500円 -10.00% 42.05% 0.02倍 -100.00% 2010年 142回 -¥19,063,100円 -26.47% 38.73% 0.02倍 -100.00% 2009年 134回 -¥10,622,000円 -14.75% 37.31% 0.08倍 -100.00% 2008年 119回 -¥5,106,700円 -7.09% 35.29% 0.11倍 -100.00% 2007年 44回 -¥723,300円 -1.00% 38.64% 0.16倍 -20.00% 2006年 25回 -¥13,700円 -0.02% 48.00% 0.94倍 -10.63% 2005年 24回 -¥97,400円 -0.14% 33.33% 0.78倍 -10.87% 2004年 39回 -¥539,400円 -0.75% 28.21% 0.21倍 -11.38% 2003年 81回 -¥1,492,400円 -2.07% 43.21% 0.21倍 -16.67% 2002年 70回 -¥934,600円 -1.30% 42.86% 0.28倍 -17.31% 2001年 46回 -¥795,100円 -1.10% 26.09% 0.31倍 -16.67% 2000年 53回 -¥1,196,000円 -1.66% 20.75% 0.01倍 -20.00% |
利益曲線は次のとおり。
全然結果が違うね。
単調減少しているので空売りでやってみるかな……。
逆張り空売りのパターン
計算時間は全銘柄で5時間。
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 |
株価データ: 日足 銘柄リスト: 貸借(東証一部+二部) 2000/01/07~2021/06/01における成績です。 ---------------------------------------- 全トレード数 888 勝ちトレード数(勝率) 550(61.94%) 負けトレード数(負率) 338(38.06%) 全トレード平均利率 5.31% 勝ちトレード平均利率 9.75% 負けトレード平均損率 -1.92% 勝ちトレード最大利率 33.33% 負けトレード最大損率 -38.16% 全トレード平均期間 1.43 勝ちトレード平均期間 1.45 負けトレード平均期間 1.41 ---------------------------------------- 必要資金 ¥1,138,400 最大ポジション(簿価) ¥2,973,000 最大ポジション(時価) ¥3,166,600 純利益 ¥29,112,700 勝ちトレード総利益 ¥32,437,900 負けトレード総損失 -¥3,325,200 全トレード平均利益 ¥32,785 勝ちトレード平均利益 ¥58,978 負けトレード平均損失 -¥9,838 勝ちトレード最大利益 ¥250,000 負けトレード最大損失 -¥250,000 プロフィットファクター 9.76 最大ドローダウン(簿価) -¥281,000 最大ドローダウン(時価) -¥281,000 ---------------------------------------- 現在進行中のトレード数 0 ---------------------------------------- 平均年利 116.24% 平均年利(直近5年) 25.91% 最大連勝 13回 最大連敗 9回 ---------------------------------------- [年度別レポート] 年度 取引回数 運用損益 年利 勝率 PF 最大DD 2021年 3回 ¥66,400円 5.83% 66.67% 9.51倍 -1.60% 2020年 13回 ¥89,400円 7.85% 61.54% 1.96倍 -10.65% 2019年 5回 ¥75,000円 6.59% 60.00% 21.83倍 -0.62% 2018年 22回 ¥123,200円 10.82% 68.18% 2.84倍 -5.26% 2017年 30回 ¥1,120,700円 98.45% 100.00% ∞倍 0.00% 2016年 44回 ¥1,101,200円 96.73% 88.64% 15.28倍 -11.56% 2015年 42回 ¥1,258,500円 110.55% 83.33% 44.25倍 -1.40% 2014年 34回 ¥701,000円 61.58% 85.29% 8.67倍 -7.01% 2013年 30回 ¥990,900円 87.04% 93.33% 65.34倍 -1.83% 2012年 82回 ¥8,381,200円 736.23% 100.00% ∞倍 0.00% 2011年 48回 ¥2,127,700円 186.90% 93.75% 13.90倍 -25.18% 2010年 71回 ¥3,482,300円 305.89% 95.77% 37.27倍 -10.87% 2009年 83回 ¥3,133,000円 275.21% 85.54% 4.52倍 -38.16% 2008年 72回 ¥2,267,100円 199.15% 91.67% 11.25倍 -10.47% 2007年 29回 ¥282,700円 24.83% 79.31% 3.47倍 -9.04% 2006年 20回 ¥47,100円 4.14% 65.00% 1.36倍 -9.15% 2005年 17回 ¥214,200円 18.82% 88.24% 2.86倍 -15.00% 2004年 32回 ¥323,600円 28.43% 81.25% 3.11倍 -11.76% 2003年 52回 ¥912,200円 80.13% 84.62% 4.19倍 -24.14% 2002年 60回 ¥499,300円 43.86% 76.67% 2.30倍 -14.29% 2001年 48回 ¥934,000円 82.04% 83.33% 3.74倍 -25.83% 2000年 51回 ¥982,000円 86.26% 90.20% 21.67倍 -4.90% |
利益曲線は次のとおり。
あれ空売りだと上手くいく。
うーん、実装の誤り箇所が分からないや……。
まとめ
またしても失敗したが、もう実装するストラテジーが枯渇しているので公開しておく。
そして、最近は「システムトレード」に飽きてしまって全く手をつけてない。
ネットや書籍に公開されたストラテジーの大半は実装したと思ってる。
ソースコード
バックテストには無料OSSの「Protra」を利用した。
TIlib、Utility、TrendCheck、TOPIXライブラリは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 |
# loop-type: date-only //============================== require "TIlib" require "Utility" require "TrendCheck" //============================== // gorotanhccat氏の逆張りデイ買いの期待値検証 // //【仕掛け】 // //次を満たすとき、[翌日指値(寄付)][終値(+5.00%)]で[買い]を仕掛ける //1) [連続高値切り下がり日数]が7より[大きい(同じ含む)] //2) [前日終値→高値(率)]が[-10]より[大きい] // //【手仕舞い】 // //1) [Stop安(終値)]が[1]と[同じ] //1.1) YES→[翌日寄付]で手仕舞いする //2) [Stop高(高値)]が[1]と[同じ] //2.1) YES→[当日指定値][高値(-1Tick)]で手仕舞いにする //2.1) NO→[当日引け]で手仕舞いする // //========================================== codes = CodeList if ($code_num && $code_num != Length(codes)) Print("前回と異なる銘柄リストでは実行できません。") Dummy end $code_num = Length(codes) //グローバル変数を初期化 if (!$__INIT__) $budgetIni = 3000000 $buyUnit = 500000 // 1回の購入資金 (50万円) $MaxHoldDay = 0 // 最大保有日数 $shortSelling = 0 // 空売り戦略 Yes(1)/No(0) $Interest = 1 // 無制限(0) / 単利(1) / 複利(2) $reverse = 1 // 購入順序 昇順(0) / 降順(1) $udcount = 0 // 騰落レシオ利用数 Init() //------------------------------------------------ $ATR25 = [$code_num] //------------------------------------------------ InitDone() // 騰落レシオ初期化 $__INIT__ = 1 end def Main(i) //================================================== // 条件(買条件, 売条件共通部分) //================================================== //まだ上場していない銘柄は株価データがないためnullが返る if (Index == null) return end if ($order[(int)Code] == -1) $order[(int)Code] = i end if ! ($ATR25[i]) $ATR25[i] = ATR_new(25) $hold[i] = 0 return end //指標の計算を1日進める ATR_next($ATR25[i]) //================================================== // 保有してない→購入 //================================================== if (! $hold[i]) if ! (Close && {-1}Close && High) return end //================================================== // 売買(買い) //================================================== //2) [前日終値→高値(率)]が[-10]より[大きい] flag2 = ((High / {-1}Close) - 1) * 100 > -10 if ! (flag2) return end //1) [連続高値切り下がり日数]が7より[大きい(同じ含む)] c = 0 flag1 = 1 while (c < 7) if ! ({-1 * c}High && {-1 * c - 1}High && {-1 * c}High <= {-1 * c - 1}High) flag1 = 0 break end c = c + 1 end if (flag1) // PrintLog("買い候補") // 優先順位は終値と終値+ATRの乖離率(25)が小さい順 atr25 = ATR_value($ATR25[i]) flag = 0 if (atr25) flag = ((Close + atr25) / Close - 1) * 100 end // [翌日指値(寄付)][終値(+5.00%)]で[買い]を仕掛ける $buyflag[i][0] = Close * 1.05 $buyflag[i][1] = flag // 優先順位 $buyflag[i][2] = 1 $buyCnt = $buyCnt + 1 end //================================================== // 保有している→売却 //================================================== elsif ($hold[i]) if ($set[i] < 1) $set[i] = 1 return end $set[i] = $set[i] + 1 //================================================== // 売買(売り) //================================================== if ($set[i] >= $MaxHoldDay) PrintLog("利益確定") $sellflag[i] = 1 $set[i] = 0 end end end def CheckHighLow2(t) t = Yobine(t, 0) if ! ({1}High > t && t > {1}Low) return 0 end if ({1}Open > t) return {1}Open end end //================================================== // 買い(指値) //================================================== def Buying2(i) if (HasPricedata(Close)) t = 0 if ($buyflag[i][0]) t = CheckHighLow2($buyflag[i][0]) end if (t) BuyingLimitedPrice(i, 1, t) end end end //==================== // 買い処理 //==================== def SortBuy() if ! (HasPricedata({1}Open)) return end $long = 0 $long = Num($buyUnit, Close) codeset = $order[(int)Code] Buying2(codeset) end //==================== // 売り処理(デイトレ模倣) //==================== def Sell_(i) if (HasPricedata(Open)) if ($sellflag[i]) //1) [Stop安(終値)]が[1]と[同じ] check1 = Close - DailyPriceLimit(Close) >= Low //2) [Stop高(高値)]が[1]と[同じ] check2 = High >= Close + DailyPriceLimit(Close) if (check1) // [翌日寄付]で手仕舞いする PrintLog("[翌日寄付]で手仕舞い") SellingLimitedPrice(i, 1, Open) elsif (check2) PrintLog("[当日指定値][高値(-1Tick)]で手仕舞い") // [当日指定値][高値(-1Tick)]で手仕舞いにする SellingLimitedPrice(i, 0, {-1}High - Yobine({-1}High, 0)) elsif ({-1}Close) PrintLog("[当日引け]で手仕舞い") // [当日引け]で手仕舞いする SellingLimitedPrice(i, 0, {-1}Close) else PrintLog("売れない") end $sellflag[i] = 0 $buyflag[i][2] = 0 end // 使用した$buyflag 配列を初期化 if ($buyflag[i][0]) $buyflag[i][0] = 0 $buyflag[i][1] = 0 end end end //==================== // 銘柄コードを変えながらMain関数,BuySell関数を実行 //==================== Print("-------------------------------------------------") Print("日付 = "+ Year + "/" + Month + "/" + Day) $buyCnt = 0 // 購入数初期化 i = -1 while (i + 1 < $code_num) i = i + 1 {codes[i]}Main(i) end i = 0 if ($buyCnt) sortList = SelectionSort(10, 0) cnt = $buyCnt if ($buyCnt > 10) cnt = 10 end while i < cnt {sortList[i]}SortBuy() i = i + 1 end end //---------------------------------------------- i = -1 while (i + 1 < $code_num) i = i + 1 {codes[i]}Sell_(i) end |