Yahoo知恵袋に次のような質問があった。
akt********さん
2018/4/26 11:24株の引けで買って翌日の寄りで売ると儲かるときは凄い儲かる時ありますけど、これって勝率でいえばどうですか?
それに対する返答は
「それは博打です」
ってww
聞くだけ無駄、それがYahoo知恵袋。
今後は人に聞くならChatGPTやBardに聞いたほうが良いと思う。
もっと良いのは自分で検証してみること。
たとえば専業トレーダー二階堂重人氏の書籍。
氏の手法はテクニカル分析を駆使したデイトレードやスイングトレードが中心だけど、この書籍では次のような「マーケット・ニュートラル」な戦略を提案している。
- 信用口座で、買い銘柄Aに対して銘柄Bを空売りして、リスクヘッジをする。
- 急騰や大きな上昇トレンドで、株価がボリンジャーバンドで±2σをつけた後日の押し目で順張りエントリーをする。
- 原則はすべて1日だけ持ち越しのスイングトレード。
- 大引で注文して、翌日の寄り付きで手仕舞う。
今回は「引けで買って翌日の寄りで売る」期待値だけを検証してみる。
一晩寝かせてしっかり儲けるオーバーナイト投資術期待値検証
書籍から必要な内容を抜粋する。
考え方はギャップアップやギャップダウンしそうな銘柄を選ぶ。
- ギャップアップ・・・終値に対して翌日の始値が高いこと
- ギャップダウン・・・終値に対して翌日の始値が低いこと
抽出方法は次の通り。
まず急騰してボリンジャーバンドの「+2σ」を上抜けしたところを探しましょう。
あとは下抜けしたところ、長めの陽線で反発したところを探します。
終値が5日移動平均線の上になっているか確認します。
具体的には次のように記載があった。
この場合、買うべきタイミングの答えは「C」。
- 条件1・・・Aのところを見て下さい。株価が急騰してボリンジャーバウンド「+2σ」を上抜けしています。
- 条件2・・・Bのところで、株価が反落しています。
- 条件3・・・Cのところで、長めの陽線で反発。終値は5日移動平均線の上になっています。
これで条件を全てクリアしました。買いポジションを持つタイミングです。
急騰してボリンジャーバウンドの「+2σ」を上抜け……の急騰って?
- 開門海:前日終値477円 → 始値493円(103.4%)
- クミアイ化学工業:前日終値699円 → 始値789円(112.9%)
- ケネディクス:前日終値651円 → 始値682円(104.8%)
「3%」上がれば「急騰」のようだ。
また「長めの陽線(反発)」って?
- 開門海 始値775円 → 終値832円(107.4%)
- クミアイ化学工業 始値510円 → 終値522円(102.4%)
- ケネディクス 始値691円 → 終値711円(102.9%)
「2%」上がれば「長めの陽線(反発)」のようだ。
システムトレードでの手法
実践問題を見る限り4日間の間に発生していたので、それを上限とする。
【銘柄抽出】
- 終値200円以上の全銘柄
【買いルール】
4日間の間に次のような挙動をした場合、本日の終値で買いを仕掛ける。
- 1) 3日もしくは2日前の終値より始値が3%上昇し、ボリンジャーバンドの「+2σ」を上抜けした
- 2) 1)を満たし、前日に 下抜け(反落)が発生
- 3) 1)2) を満たし、本日 始値と終値が2%以上の陽線となった
- 4) 1)2)3)を満たし、本日 5日移動平均線の終値 < 本日の終値
【手仕舞いルール】
- 翌日の始値で成行売り
バックテスト結果
計算時間はプライムの全銘柄で50分。
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 |
株価データ: 日足 銘柄リスト: 全銘柄 2000/01/14~2023/10/18における成績です。 ---------------------------------------- 全トレード数 1679 勝ちトレード数(勝率) 700(41.69%) 負けトレード数(負率) 979(58.31%) 全トレード平均利率 0.37% 勝ちトレード平均利率 6.66% 負けトレード平均損率 -4.14% 勝ちトレード最大利率 58.86% 負けトレード最大損率 -27.63% 全トレード平均期間 1.43 勝ちトレード平均期間 1.54 負けトレード平均期間 1.36 ---------------------------------------- 必要資金 ¥2,214,900 最大ポジション(簿価) ¥2,933,700 最大ポジション(時価) ¥2,999,900 純利益 ¥2,752,148 勝ちトレード総利益 ¥20,962,070 負けトレード総損失 -¥18,209,920 全トレード平均利益 ¥1,639 勝ちトレード平均利益 ¥29,946 負けトレード平均損失 -¥18,601 勝ちトレード最大利益 ¥278,400 負けトレード最大損失 -¥126,000 プロフィットファクター 1.15 最大ドローダウン(簿価) -¥950,426 最大ドローダウン(時価) -¥936,926 ---------------------------------------- 現在進行中のトレード数 0 ---------------------------------------- 平均年利 5.18% 平均年利(直近5年) 0.26% 最大連勝 9回 最大連敗 14回 ---------------------------------------- [年度別レポート] 年度 取引回数 運用損益 年利 勝率 PF 最大DD 2023年 48回 -¥281,700円 -12.72% 45.83% 0.42倍 -13.61% 2022年 54回 -¥293,361円 -13.24% 33.33% 0.50倍 -15.44% 2021年 84回 -¥130,300円 -5.88% 44.05% 0.85倍 -17.99% 2020年 126回 ¥1,011,006円 45.65% 50.00% 1.99倍 -14.65% 2019年 83回 -¥276,400円 -12.48% 39.76% 0.61倍 -11.67% 2018年 76回 -¥227,126円 -10.25% 39.47% 0.73倍 -21.60% 2017年 91回 -¥227,800円 -10.28% 42.86% 0.79倍 -17.84% 2016年 56回 ¥733,120円 33.10% 62.50% 1.99倍 -27.63% 2015年 99回 -¥165,210円 -7.46% 41.41% 0.88倍 -19.55% 2014年 87回 -¥12,700円 -0.57% 39.08% 0.99倍 -26.55% 2013年 147回 ¥1,010,481円 45.62% 48.30% 1.58倍 -21.91% 2012年 60回 -¥184,900円 -8.35% 40.00% 0.77倍 -20.12% 2011年 68回 ¥147,400円 6.65% 36.76% 1.16倍 -15.85% 2010年 47回 -¥87,362円 -3.94% 38.30% 0.85倍 -12.62% 2009年 72回 ¥603,700円 27.26% 59.72% 2.23倍 -10.53% 2008年 51回 ¥91,300円 4.12% 39.22% 1.16倍 -16.21% 2007年 38回 ¥184,000円 8.31% 36.84% 1.44倍 -10.03% 2006年 37回 -¥5,900円 -0.27% 43.24% 0.98倍 -15.68% 2005年 95回 ¥720,800円 32.54% 49.47% 1.95倍 -7.43% 2004年 61回 ¥24,000円 1.08% 42.62% 1.04倍 -19.50% 2003年 73回 ¥8,300円 0.37% 47.95% 1.01倍 -22.87% 2002年 37回 ¥122,600円 5.54% 54.05% 1.42倍 -10.68% 2001年 35回 -¥46,900円 -2.12% 40.00% 0.86倍 -7.19% 2000年 54回 ¥35,100円 1.58% 53.70% 1.07倍 -20.14% |
利益曲線は次の通り。
書籍中のバックテスト期間は2018年頃。
それ以降、ガクッと下がっているのは書籍発売の影響……では無いと思うけど。
少なくとも、これだけグニャグニャだと役には立たないかな。
当日買いも難しいし。
おわりに
勝率は5割満たないけど、利益はトータルでプラスという結果になった。
ただし近年は負け越し。
今回は二階堂重人氏の手法だけど、他の手法ならもっと良いかもしれない。
ソースコード(Protraでの使い方)
バックテストには無料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 |
# loop-type: date-only //============================== require "TIlib" require "Utility" require "TrendCheck" //============================== // 二階堂重人氏の引け買い寄り売りオーバーナイト //------------------------------ // // 【買い】 //1) 前日終値より始値が3%上昇し、ボリンジャーバンドの「+2σ」を上抜けした //2) 1)を満たした翌日以降に 下抜け(反落)が発生 //3) 1)2) を満たした後に、本日、始値と終値が2%以上の陽線となった //4) 1)2)3)を満たした後に、本日、5日移動平均線の終値 < 本日の終値 // // 【売買(売り)】 // 1) 翌日の始値で成行売り 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 = 0 // 購入順序 昇順(0) / 降順(1) $udcount = 0 // 騰落レシオ利用数 Init() //------------------------------------------------ $MA5 = [$code_num] $BB20 = [$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 ! ($MA5[i] && $BB20[i]) //銘柄ごとのグローバル変数を初期化する $MA5[i] = MA_new(5) $BB20[i] = BB_new(20) $hold[i] = 0 return end //指標の計算を1日進める MA_next($MA5[i]) BB_next($BB20[i]) // ここまで ======================================== //================================================== // 保有してない→購入 //================================================== if ! ($hold[i]) if ! (Close && {-3}Close && {-2}Close && {-1}Close && Close >= 200) return end ma5 = MA_value($MA5[i]) bb_v = BB_value($BB20[i]) bb_d = BB_deviation($BB20[i]) if ! (ma5 && bb_v && bb_d) return end //1) 前日終値より始値が3%上昇し、ボリンジャーバンドの「+2σ」を上抜けした flag1_1 = ({-2}Open >= {-3}Close * 1.03) && ({-2}Close > bb_v + 2 * bb_d) flag1_2 = ({-3}Open >= {-2}Close * 1.03) && ({-3}Close > bb_v + 2 * bb_d) if ! (flag1_1 || flag1_2) return end //2) 1)を満たした翌日以降に 下抜け(反落)が発生 flag2 = {-1}Open > {-1}Close if ! (flag2) return end //3) 1)2) を満たした後に、本日、始値と終値が2%以上の陽線となった flag3 = (Close * 100 / Open) >= 102 if ! (flag3) return end //4) 1)2)3)を満たした後に、本日、5日移動平均線の終値 < 本日の終値 flag4 = (ma5 < Close) && (Open > {-1}Close) if (flag4) PrintLog("買い候補 " + Close) $buyflag[i][0] = 1 $buyflag[i][1] = Close // 好きなパラメータをもとにソート $buyflag[i][2] = $buyflag[i][0] // 呪文 $buyCnt = $buyCnt + 1 end //================================================== // 保有している→売却 //================================================== elsif ($hold[i]) if $set[i] < 1 $set[i] = 1 return end $set[i] = $set[i] + 1 //================================================== // 売買(売り) //================================================== // 1) 利食い:含み益が10%を上回った if ($set[i] >= $MaxHoldDay) PrintLog("利食い") $sellflag[i] = 1 $set[i] = 0 end end end //================================================== // 買い(デイトレ模倣) //================================================== def Buying2(i) if (HasPricedata(Close)) BuyingLimitedPrice(i, 0, Close) end end //==================== // 買い処理 //==================== def SortBuy() if ! (HasPricedata(Close)) return end $long = 0 $long = Num($buyUnit, Close) codeset = $order[(int)Code] Buying2(codeset) end //==================== // 売り処理(デイトレ模倣) //==================== def Sell_(i) if (HasPricedata(Open)) if ($sellflag[i]) if (Open) SellingLimitedPrice(i, -1, Open) 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 = 0 while (i < $code_num) {codes[i]}Main(i) i = i + 1 end if ($buyCnt) sortList = SelectionSort(10, 1) cnt = 0 while (cnt < $buyCnt) if ! (sortList[cnt]) break end cnt = cnt + 1 end i = 0 while i < cnt {sortList[i]}SortBuy() i = i + 1 end end //---------------------------------------------- i = 0 while i < $code_num {codes[i]}Sell_(i) i = i + 1 end |