クリスマスイブです。
バックテスト結果が良かったので公開してませんでしたが、クリスマスプレゼント(になるかも分かりませんが)として載せておきます。
今回は、cosisin氏の「問題・正解」の有効性を検証します。
【基本ルール】
- 終値が50万円以上
- 5日間平均が5千万円以上
- [前日比2日最大]=前日比(率)が2日最大
【買いルール】
- 1) 過去[3]日間に、[前日比2日最大]が[-5]より[小さい(同じ含む)]日が[2]日以上[存在する]
- 2) [期間上昇(率)(100)]が[0]より[大きい]
- 3) [逆張り(集計した銘柄数)]が[2]より[大きい(同じ含む)]
- 4) [翌日始値]が[安値(-5.00%)]より[大きい]
- 5) [翌日始値(終日)][安値(-5.00%)]で[買い]を仕掛ける
- 6) [翌日始値(終日)][翌日始値(+1Tick)]で[買い]を仕掛ける
【売りルール】
- [保有日数]が[2]より[大きい(同じ含む)]
- [翌日逆指(終日)][終値(-1Tick)]で手仕舞いする
仕掛けた翌日は何もせず放置して、次の日から終値のマイナス1ティックで逆指値をセットする、これだけで期待値が倍になります。普段裁量トレードで逆張りで買ったときに、数十分くらい横横で推移して、しばらくしたら上や下に動き出すことがあったので、シストレでも逆張りで拾ったら、ちょっと様子を見てから、手仕舞い発動したらどうか?そう思って試してみたら、自分でもびっくりで衝撃受けました。
ソースコード
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 |
# loop-type: date-only //============================== require "TIlib" require "Utility" require "TrendCheck" // ====================================== // cosisin氏の2日後の終値の-1Tickの逆指値 // ====================================== // //【基本設定】 // 1) 株価の低い場合はランキングしない[50]万円以下 // 2) 売買代金の少ない場合はランキングしない(売買代金の[3]日間平均が[5]千万円以下の場合) // 3) 単利利用、通年 // 4) 全ての銘柄対象 // //【買いルール】 // 1) 過去[3]日間に、[前日比2日最大]が[-5]より[小さい(同じ含む)]日が[2]日以上[存在する] // 2) [期間上昇(率)(100)]が[0]より[大きい] // 3) [逆張り(集計した銘柄数)]が[2]より[大きい(同じ含む)] // 4) [翌日始値]が[安値(-5.00%)]より[大きい] // 5) [翌日始値(終日)][安値(-5.00%)]で[買い]を仕掛ける // 6) [翌日始値(終日)][翌日始値(+1Tick)]で[買い]を仕掛ける // //【手仕舞いルール】 // 1) [保有日数]が[2]より[大きい(同じ含む)] // 2) [翌日逆指(終日)][終値(-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() // テクニカル指標初期化 -------------------------- // 騰落レシオ初期値代入($udcountの数) ---------- //------------------------------------------------ InitDone() // 騰落レシオ初期化 $__INIT__ = 1 end // 1) [期間上昇(率)]=[当日終値(現在値)]÷[指定期間前の終値] def PeriodUpRate(i) if ! ({-1 * i}Close) return 0 end return (float)Close / (float){-1 * i}Close * 100 end def Main(i) //================================================== // 条件(買条件, 売条件共通部分) //================================================== //まだ上場していない銘柄は株価データがないためnullが返る if (Index == null) return end if ! ($order[(int)Code]) $order[(int)Code] = i end if ! (Index > 75) return end //================================================== // 保有してない→購入 //================================================== if (! $hold[i]) if ! (Close && {-1}Close && {-2}Close && {-3}Close && {1}Open) return end //================================================== // 売買(買い) //================================================== // 1) 株価の低い場合はランキングしない[50]万円以下 // 2) 売買代金の少ない場合はランキングしない(売買代金の[3]日間平均が[5]千万円以下の場合) if ! (SalesValue()/3 + {-1}SalesValue()/3 + {-2}SalesValue()/3 > 50000 && Close > 50) return end // 1) 過去[3]日間に、[前日比2日最大]が[-5]より[小さい(同じ含む)]日が[2]日以上[存在する] day1 = -5 >= ((float)Close - (float){-1}Close) / (float){-1}Close * 100 day2 = -5 >= ((float){-1}Close - (float){-2}Close) / (float){-2}Close * 100 day3 = -5 >= ((float){-2}Close - (float){-3}Close) / (float){-3}Close * 100 check1 = (day1 && day2 || day2 && day3 || day3 && day1) // 2) [期間上昇(率)(100)]が[0]より[大きい] check2 = PeriodUpRate(100) > 0 if (check1 && check2) // 4) [翌日始値]が[安値(-5.00%)]より大きい check4 = {1}Open > Low * 0.95 if (check4) // 5) [翌日始値(終日)][安値(-5.00%)]で[買い]を仕掛ける // PrintLog("購入予定1") $buyflag[i][0] = 1 // 好きなパラメータをもとにソート $buyflag[i][1] = check2 $buyCnt = $buyCnt + 1 else // 6) [翌日始値(終日)][翌日始値(+1Tick)]で[買い]を仕掛ける // PrintLog("購入予定2") $buyflag[i][0] = 2 // 好きなパラメータをもとにソート $buyflag[i][1] = check2 $buyCnt = $buyCnt + 1 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 Buying2(i) if (0 == PricedataExistCheck({1}Open)) if ($buyflag[i][0] == 1) // 5) [翌日始値(終日)][安値(-5.00%)]で[買い]を仕掛ける t = StopOrderLow(0.95) else // 6) [翌日始値(終日)][翌日始値(+1Tick)]で[買い]を仕掛ける t = StopOrderOpenTick() 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) 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 // 3) [逆張り(集計した銘柄数)]が[2]より[大きい(同じ含む)] if ($buyCnt >= 2) 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.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 |
株価データ: 日足 銘柄リスト: 全銘柄 1998/01/05~2019/09/20における成績です。 ---------------------------------------- 全トレード数 4106 勝ちトレード数(勝率) 2239(54.53%) 負けトレード数(負率) 1867(45.47%) 全トレード平均利率 1.56% 勝ちトレード平均利率 7.62% 負けトレード平均損率 -5.72% 勝ちトレード最大利率 83.08% 負けトレード最大損率 -49.10% 全トレード平均期間 2.92 勝ちトレード平均期間 2.90 負けトレード平均期間 2.95 ---------------------------------------- 必要資金 ¥6,333,300 最大ポジション(簿価) ¥9,990,000 最大ポジション(時価) ¥12,281,510 純利益 ¥55,757,890 勝ちトレード総利益 ¥148,603,100 負けトレード総損失 -¥92,845,250 全トレード平均利益 ¥13,580 勝ちトレード平均利益 ¥66,370 負けトレード平均損失 -¥49,730 勝ちトレード最大利益 ¥777,600 負けトレード最大損失 -¥463,500 プロフィットファクター 1.60 最大ドローダウン(簿価) -¥2,032,400 最大ドローダウン(時価) -¥1,995,700 ---------------------------------------- 現在進行中のトレード数 1 ---------------------------------------- 平均年利 44.02% 平均年利(直近5年) 13.25% 最大連勝 11回 最大連敗 12回 ---------------------------------------- [年度別レポート] 年度 取引回数 運用損益 年利 勝率 PF 最大DD 2019年 123回 ¥1,733,700円 27.37% 57.72% 1.80倍 -36.71% 2018年 260回 -¥445,341円 -7.03% 48.08% 0.94倍 -47.94% 2017年 140回 ¥783,422円 12.37% 47.86% 1.31倍 -20.96% 2016年 255回 ¥378,756円 5.98% 48.24% 1.06倍 -20.33% 2015年 202回 ¥1,744,385円 27.54% 49.01% 1.47倍 -18.74% 2014年 333回 ¥3,669,100円 57.93% 54.35% 1.55倍 -31.66% 2013年 339回 ¥3,921,420円 61.92% 55.75% 1.49倍 -38.48% 2012年 134回 ¥1,179,400円 18.62% 50.75% 1.43倍 -22.81% 2011年 143回 ¥3,009,580円 47.52% 62.94% 2.22倍 -24.49% 2010年 117回 ¥1,746,695円 27.58% 57.26% 1.66倍 -17.73% 2009年 241回 ¥4,072,630円 64.31% 61.00% 1.64倍 -48.91% 2008年 439回 ¥2,755,336円 43.51% 51.71% 1.21倍 -48.87% 2007年 269回 ¥3,807,800円 60.12% 56.51% 1.69倍 -26.40% 2006年 222回 ¥2,991,975円 47.24% 60.36% 1.65倍 -29.21% 2005年 129回 ¥5,784,040円 91.33% 69.77% 4.44倍 -49.10% 2004年 152回 ¥2,986,600円 47.16% 59.21% 1.76倍 -27.89% 2003年 148回 ¥4,097,800円 64.70% 61.49% 2.14倍 -22.49% 2002年 121回 ¥3,365,100円 53.13% 60.33% 2.45倍 -34.96% 2001年 152回 ¥3,977,200円 62.80% 63.82% 2.27倍 -31.17% 2000年 187回 ¥4,198,300円 66.29% 61.50% 1.99倍 -25.19% |
利益曲線は次のとおりです。
まとめ
3ヶ月前に作成したまま放置していました。
単調増加ではありますが、指値が多く本当に利用できるかどうかは後研究に任せます。
最近は、全くシステムトレードの研究をしていません・・・。