新年度を迎えたが何もやる気が出ない。子会社に転籍だしなーー。
仕事では上司が変わり、
「もう君の役割は不要なので業務変更を」
と三行半を叩き付けられた。
この仕事目的でアメリカから早めに帰任させられて、いらなくなったらポイですよ。
現状の理不尽に絶えてサラリーマン生活を続けるか、異動するか……うーん。。
そう言えば、4月1日から千葉県では自転車保険が必須化となった。
ざっくり各社の値段を調べたが価格が跳ね上がってるなぁ……。
商品名 | 運用主体 | 年額保険料 | 補足 |
---|---|---|---|
自転車ライフ安心保険 | LINE Finance | 2,280円 | 以前は年間1,200円 |
サイクル安心保険 | 全日本交通安全協会 | 7,140円 | プランF。以前は年間1,236円 |
サイクルアシスト | 楽天損害保険 | 6,010円 | 基本タイプ。以前は年間1,356円 |
ポケット保険 | 三井住友カード | 2,2080円 | これも以前は年間1,680円程度 |
まるごとマモル | 日本生命保険 | 1,990円 | 保険外交員(ニッセイのおばちゃん)からしか契約できない |
家族安心プラン | ちゃりぽ | 9,800円 | 家族あんしんプラン |
傷害特約 | チューリッヒ | 2,400円 | スーパー自動車保険の特約 |
お金や体力、精神力ばかり減っていく。
社会人になって増えたのは白髪とシワぐらいだ……。
やる気が起きず、何もやってないから日記に書くことがない。
どんな些細な事でも視点を変えれば記事になるけど、掘り下げる気にもならない。
仕方ないので、数年前に実装済だったストラテジーを引っ張り出して走らせてみた。
今回紹介するストラテジーが世の中に公開されたのは2012年と古い。
cosisin氏の安定押し目ストラテジー
今から9年前のcosisin氏のストラテジーだ。
当時、ニッパー氏もバックテストをしている。
cosisin氏のストラテジーは過去にも何度もバックテストしてきた。
- cosisin氏の2日後の終値の-1Tickの逆指値有効性検証(システムトレード)
- cosisin氏の陰線ストラテジーの劣化版の有効性検証(システムトレード)
- cosisin氏のダウ逆張り改良ドドンパ(待ち)の有効性検証(システムトレード)
- cosisin氏の勝率90%以上、期待値20%以上の有効性検証(システムトレード)
- cosisin氏の平滑移動平均乖離率を使った逆張り手法の有効性検証(システムトレード)
- cosisin氏の3日保有のスイング戦略の有効性検証2(システムトレード)
彼のストラテジーは複雑だけど、結構安定しているんだよね。
今回のストラテジーの説明は次のように書かれている。
安定した押し目のストラテジーを作ってみました。といっても何か特別なことをしたわけではなく、ランキング情報で上位30位まで集めて、最適分散で25日間の値動きが小さいもの上位10位まで仕掛けるようにしただけです。期待値や利益率は小さいですが、安定性は高い気がします。まあ、私は利用しませんが、興味がある方はカスタマイズしてみてください。じゃーねー。
【基本設定】
- 1) 株価の低い場合はランキングしない[150]万円以下
- 2) 売買代金の少ない場合はランキングしない(売買代金の[3]日間平均が[5]千万円以下の場合)
- 3) 単利利用、通年
- 4) 全ての銘柄対象
- 5) 優先順位は終値と終値+ATRの乖離率(25)が小さい順(最近の値動きが小さい)
【ランキング条件[安定押し目(順位)]】
- 1) [期間上昇(率)]=[当日終値(現在値)]÷[指定期間前の終値]
- 2) [安定押し目]=[期間上昇(率)(75)]が[0]より大きい
- 3) [前日比2日最大]の小さい順
【買いルール】
- 1) [安定押し目(順位)]が[30]より[小さい(同じ含む)]
- 2) [翌日始値]が[終値(-5.00%)]より大きい
- IF(2) 3) [翌日指値(寄付)][終値(-1.50%)]で[買い]を仕掛ける
- IF(Not 2) 4) [翌日逆指値(終日)][翌日始値(+1Tick)]で[買い]を仕掛ける
【手仕舞いルール】
- 1) [Stop高(高値)]が[1]と[同じ]
- 2) [当日指定値][高値]で手仕舞いする
- 3) [保有日数]が[1]より[大きい(同じ含む)]
- 4) [当日引け]で手仕舞いする
「終値と終値+ATRの乖離率」って何?と思ったがイザナミに標準でついている機能のようだ。
「終値と終値+ATRの乖離率」や「終値と終値-ATRの乖離率」という指標を使うことで、「ATR」が終値に対してどれくらい乖離しているのかを比率(%)で判断できるため、「ATR」の概念を売買ルールに組み込みやすくなります。
ニッパー氏によれば、ストラテジーの概要は次のように書かれていた。
- 前日比(2日間で値が大きい方)が小さい、つまりマイナス方向に大きいものの順でランキング付け。これで押し目チェック
- 75日期間上昇率がプラスかどうかで、中期視点で上昇していることを確認。
- 仕掛けるときはさらにちょっと安くなったところを狙う、通常は終値-1.5%で寄指。
- そのまま急落していく銘柄にはエントリーしたくないので、終値-5%より下で寄付いたら、寄り付き+1tickで逆指値。
よう分からん。
バックテスト結果
私の実装では、買い可能な銘柄一覧から「終値と終値+ATRの乖離率」に従って昇順に30銘柄だけ調査対象とした。
実行時間は1時間程度。
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 |
株価データ: 日足 銘柄リスト: 日経225採用銘柄 1998/01/05~2021/04/05における成績です。 ---------------------------------------- 全トレード数 15358 勝ちトレード数(勝率) 8427(54.87%) 負けトレード数(負率) 6931(45.13%) 全トレード平均利率 0.20% 勝ちトレード平均利率 1.69% 負けトレード平均損率 -1.61% 勝ちトレード最大利率 18.64% 負けトレード最大損率 -42.41% 全トレード平均期間 2.98 勝ちトレード平均期間 2.99 負けトレード平均期間 2.96 ---------------------------------------- 必要資金 ¥9,733,800 最大ポジション(簿価) ¥9,995,000 最大ポジション(時価) ¥10,717,200 純利益 ¥27,825,000 勝ちトレード総利益 ¥123,697,300 負けトレード総損失 -¥95,872,260 全トレード平均利益 ¥1,812 勝ちトレード平均利益 ¥14,679 負けトレード平均損失 -¥13,832 勝ちトレード最大利益 ¥179,900 負けトレード最大損失 -¥359,600 プロフィットファクター 1.29 最大ドローダウン(簿価) -¥2,273,400 最大ドローダウン(時価) -¥2,322,300 ---------------------------------------- 現在進行中のトレード数 6 ---------------------------------------- 平均年利 12.99% 平均年利(直近5年) 4.56% 最大連勝 15回 最大連敗 10回 ---------------------------------------- [年度別レポート] 年度 取引回数 運用損益 年利 勝率 PF 最大DD 2021年 194回 ¥378,900円 3.89% 56.70% 1.35倍 -7.19% 2020年 754回 ¥487,400円 5.01% 52.12% 1.08倍 -15.71% 2019年 551回 ¥1,362,800円 14.00% 59.35% 1.54倍 -8.21% 2018年 631回 -¥381,800円 -3.92% 50.40% 0.90倍 -13.33% 2017年 464回 ¥374,200円 3.84% 57.11% 1.17倍 -9.38% 2016年 762回 ¥1,254,400円 12.89% 55.38% 1.26倍 -9.34% 2015年 731回 ¥935,300円 9.61% 57.18% 1.20倍 -11.08% 2014年 565回 ¥934,200円 9.60% 54.69% 1.29倍 -9.34% 2013年 719回 ¥3,964,400円 40.73% 59.67% 1.99倍 -6.90% 2012年 591回 ¥1,937,100円 19.90% 62.27% 1.91倍 -4.76% 2011年 648回 -¥448,900円 -4.61% 55.40% 0.91倍 -42.41% 2010年 661回 ¥810,500円 8.33% 54.92% 1.23倍 -6.39% 2009年 828回 ¥1,459,800円 15.00% 54.59% 1.25倍 -9.91% 2008年 874回 -¥39,500円 -0.41% 52.52% 1.00倍 -24.67% 2007年 817回 ¥1,606,100円 16.50% 57.77% 1.32倍 -14.80% 2006年 806回 ¥2,889,700円 29.69% 61.29% 1.82倍 -8.36% 2005年 561回 ¥2,600,100円 26.71% 63.64% 2.32倍 -7.15% 2004年 722回 ¥2,766,100円 28.42% 61.91% 2.00倍 -5.02% 2003年 829回 ¥2,571,100円 26.41% 59.83% 1.54倍 -9.16% 2002年 861回 ¥1,528,200円 15.70% 53.54% 1.27倍 -26.93% 2001年 889回 -¥377,100円 -3.87% 50.96% 0.95倍 -13.54% 2000年 900回 ¥1,212,000円 12.45% 53.22% 1.16倍 -17.01% |
利益曲線は次のとおり。
2012年の手法なのに、ほぼ単調増加じゃん。
少し改造すれば実運用に耐えれそうだ。
まとめ
当日の寄付きを監視する必要があるが、Pythonなどで証券会社にログインして株価チェックすれば良い。
ストラテジーをサクサク作れる人は凄いなぁ。
最近は新しいストラテジーがネットで検索しても見つからないんだよね。
ソースコード
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) 株価の低い場合はランキングしない[150]万円以下 // 2) 売買代金の少ない場合はランキングしない(売買代金の[3]日間平均が[5]千万円以下の場合) // 3) 単利利用、通年 // 4) 全ての銘柄対象 // 5) 優先順位は終値と終値+ATRの乖離率(25)が小さい順(最近の値動きが小さい) // //【ランキング条件[安定押し目(順位)]】 // 1) [期間上昇(率)]=[当日終値(現在値)]÷[指定期間前の終値] // 2) [安定押し目]=[期間上昇(率)(75)]が[0]より大きい // 3) [前日比2日最大]の小さい順 // //【買いルール】 // 1) [安定押し目(順位)]が[30]より[小さい(同じ含む)] // 2) [翌日始値]が[終値(-5.00%)]より大きい // IF(2) 3) [翌日指値(寄付)][終値(-1.50%)]で[買い]を仕掛ける // IF(Not 2) 4) [翌日逆指値(終日)][翌日始値(+1Tick)]で[買い]を仕掛ける // //【手仕舞いルール】 // 1) [Stop高(高値)]が[1]と[同じ] // 2) [当日指定値][高値]で手仕舞いする // 3) [保有日数]が[1]より[大きい(同じ含む)] // 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 = 0 // 最大保有日数 $shortSelling = 0 // 空売り戦略 Yes(1)/No(0) $Interest = 1 // 無制限(0) / 単利(1) / 複利(2) $reverse = 0 // 購入順序 昇順(0) / 降順(1) $udcount = 0 // 騰落レシオ利用数 Init() // テクニカル指標初期化 -------------------------- $ATR25 = [$code_num] //------------------------------------------------ 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 ! ($ATR25[i]) $ATR25[i] = ATR_new(25) $hold[i] = 0 return end //指標の計算を1日進める ATR_next($ATR25[i]) if ! (Index > 75 && {1}Open) return end //================================================== // 保有してない→購入 //================================================== if (! $hold[i]) //================================================== // 売買(買い) //================================================== // 1) 株価の低い場合はランキングしない[150]万円以下 // 2) 売買代金の少ない場合はランキングしない(売買代金の[3]日間平均が[5]千万円以下の場合) if ! (Close && {-1}Close && {-2}Close && Volume && {-1}Volume && {-2}Volume) return end if ! (SalesValue()/3 + {-1}SalesValue()/3 + {-2}SalesValue()/3 > 50000 && Close > 150) return end // 1) [期間上昇(率)]=[当日終値(現在値)]÷[指定期間前の終値] // 2) [安定押し目]=[期間上昇(率)(75)]が[0]より大きい // 3) [安定押し目(順位)]が[30]より[小さい(同じ含む)] check = PeriodUpRate(75) // 優先順位は終値と終値+ATRの乖離率(25)が小さい順 atr25 = ATR_value($ATR25[i]) flag = 100 if (atr25) flag = ((Close + atr25) / Close - 1) * 100 end if (check > 0) // 4) [翌日始値]が[終値(-5.00%)]より大きい check5 = {1}Open > Close * 0.95 if (check5) // 5) [翌日指値(寄付)][終値(-1.50%)]で[買い]を仕掛ける // PrintLog("購入予定1 : " + flag) $buyflag[i][0] = 1 // 小さい順にソート $buyflag[i][1] = flag $buyCnt = $buyCnt + 1 else // 6) [翌日逆指値(終日)][翌日始値(+1Tick)]で[買い]を仕掛ける // PrintLog("購入予定2 : " + flag) $buyflag[i][0] = 2 // 小さい順にソート $buyflag[i][1] = flag $buyCnt = $buyCnt + 1 end end //================================================== // 保有している→売却 //================================================== elsif ($hold[i]) if ($set[i] < 1) $set[i] = 1 return end $set[i] = $set[i] + 1 //================================================== // 売買(売り) //================================================== // 1) [Stop高(高値)]が[1]と[同じ] check = High >= Close + DailyPriceLimit(Close) if (check) // 2) [当日指定値][高値]で手仕舞いする PrintLog("手仕舞い1") $sellflag[i] = 1 $set[i] = 0 // 3) [保有日数]が[1]より[大きい(同じ含む)] elsif ($set[i] >= $MaxHoldDay) // 4) [当日引け]で手仕舞いする PrintLog("手仕舞い2") $sellflag[i] = 2 $set[i] = 0 end end end //================================================== // [翌日指値(寄付)][終値(num%)]で[買い]を仕掛ける //================================================== def StopOrderClose2(num) t = Close * num if ! ({1}High > t && t > {1}Low) return 0 end return t end //================================================== // [翌日逆指値(終日)][高値(+1Tick)] //================================================== def StopOrderOpenTick2() t = {1}Open + Yobine({1}Open, 0) if ! ({1}High > t && t > {1}Low) return 0 end return t end //================================================== // 買い(カスタマイズ条件) //================================================== def Buying2(i) if (0 == PricedataExistCheck({1}Open)) if ($buyflag[i][0] == 1) // 5) [翌日指値(寄付)][終値(-1.50%)]で[買い]を仕掛ける t = StopOrderClose2(0.985) elsif ($buyflag[i][0] == 2) // 6) [翌日逆指値(終日)][翌日始値(+1Tick)]で[買い]を仕掛ける t = StopOrderOpenTick2() 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 ($sellflag[i] == 1) // 2) [当日指定値][高値]で手仕舞いする if (0 == PricedataExistCheck(High)) Sell(High, $hold[i]) $budget = $budget + $buy[i] * $hold[i] $hold[i] = 0 Print("S 予算残り = " + $budget) end elsif ($sellflag[i] == 2) // 4) [当日引け]で手仕舞いする Selling(i) 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 $max = 30 if ($max > $buyCnt) $max = $buyCnt end if ($buyCnt) // [安定押し目(順位)]が[30]より[小さい(同じ含む)] while i + 1 < $max i = i + 1 {$sortList2[i]}SortBuy(i) end end i = -1 while i + 1 < $code_num i = i + 1 {codes[i]}Sell_(i) end |