小中学校はろくな思い出しかなく、特に中学生時代は「地獄」だった。
一方で、高校時代は無色透明のようなものだったから特段 悪い感情があるわけでもない。
それがいいのか悪いのかは別として。
僕が高校時代といえば「安室奈美恵」「TRF」「globe」「相川七瀬」などの曲が大流行していた。
CD買ったり借りたりできる裕福な家庭ではなかったが、相川七瀬の「夢見る少女じゃいられない」「恋心」などの曲は自然と耳に入ってきて好きだった。
タイトルが分かりやすいからね。
一方で、相川七瀬の「ブレイクアウト(break out)」は英語タイトルが嫌いだったから聞かなかったなーー。
急に口火が切られて、それが瞬く間に広がってしまうというニュアンス
こんな言葉は日常的に使わない……。英語なんて翻訳ソフトで十分だわ。
「ブレイクアウト」という言葉はテクニカル投資でも出てくる。
前回「3点チャージ投資法『空売り』」のバックテストを行ったイザナミのアフェリエイトサイトに次のような記事を見つけた。
サイトが消滅してもアーカイブされてるのはありがたい。
今回はテクニカル分析でよく勝てる手法と言われている、
直近の株価の高値更新、ブレイクアウトの期待値を検証したいと思います!
これが人気記事になっており
PVは 41,234
いやいや、ちょwwww
このサイト月に数十人よ?
一日10人の訪問者が来ると仮定したら、11年も必要だわwww
株価の高値更新(ブレイクアウト)の期待値検証
人気っぽいのでバックテストをやってみる。
嫌な予感しかしないけどね!
【仕掛けルール】
- 1) [終値]が[期間高値(終値)(200)(1日前)(+5.00%)]より[大きい]
- 2) [日経平均25日線が上向き(集計した銘柄数)]が[1]と[同じ]
- 3) [翌日寄付]で[買い]を仕掛ける
【手仕舞いルール】
- 1) [日経平均25日線が上向き(集計した銘柄数)]が[0]と[同じ]
- 1.1) [翌日寄付]で手仕舞いする
- 2) [終値]が[建て値(-5.00%)]より[小さい]
- 2.1) [翌日寄付]で手仕舞いする
ここで「日経平均25日線が上向き(集計した銘柄数)」は次のサイトを参照したそうだ。
1つの例として、下記の仕掛け条件を作成します。
「日経平均の25MAが5日連続で下落している中、5日連続で下降している銘柄」
この方法を応用することで、日経平均以外の銘柄や、お好みの銘柄群の値動きから相場情報を作成し、売買ルールに組み入れることが可能です。
実装は難しくなさそうだ。結果は如何に?
バックテスト結果
計算時間は全銘柄で2時間15分、東証一部だけで1時間10分。
あれ?結構遅いな……?ストラテジー部分で遅くなる要素あったかな?
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 |
株価データ: 日足 銘柄リスト: 東証1部 2000/01/06~2021/05/25における成績です。 ---------------------------------------- 全トレード数 1457 勝ちトレード数(勝率) 415(28.48%) 負けトレード数(負率) 1042(71.52%) 全トレード平均利率 1.48% 勝ちトレード平均利率 24.32% 負けトレード平均損率 -7.62% 勝ちトレード最大利率 594.64% 負けトレード最大損率 -49.56% 全トレード平均期間 26.76 勝ちトレード平均期間 60.63 負けトレード平均期間 13.27 ---------------------------------------- 必要資金 ¥5,167,500 最大ポジション(簿価) ¥3,425,400 最大ポジション(時価) ¥9,554,900 純利益 ¥10,433,400 勝ちトレード総利益 ¥45,672,000 負けトレード総損失 -¥35,238,600 全トレード平均利益 ¥7,161 勝ちトレード平均利益 ¥110,053 負けトレード平均損失 -¥33,818 勝ちトレード最大利益 ¥2,997,000 負けトレード最大損失 -¥239,800 プロフィットファクター 1.30 最大ドローダウン(簿価) -¥3,065,600 最大ドローダウン(時価) -¥3,301,500 ---------------------------------------- 現在進行中のトレード数 9 ---------------------------------------- 平均年利 9.18% 平均年利(直近5年) 0.06% 最大連勝 6回 最大連敗 21回 ---------------------------------------- [年度別レポート] 年度 取引回数 運用損益 年利 勝率 PF 最大DD 2021年 29回 ¥191,000円 3.70% 31.03% 1.41倍 -20.12% 2020年 74回 ¥64,200円 1.24% 28.38% 1.03倍 -36.21% 2019年 62回 -¥554,500円 -10.73% 27.42% 0.61倍 -18.99% 2018年 87回 -¥362,300円 -7.01% 26.44% 0.80倍 -21.45% 2017年 67回 ¥676,300円 13.09% 37.31% 1.61倍 -17.87% 2016年 75回 ¥936,500円 18.12% 30.67% 1.56倍 -34.47% 2015年 71回 ¥585,300円 11.33% 36.62% 1.45倍 -18.83% 2014年 64回 ¥1,756,300円 33.99% 40.63% 2.56倍 -16.54% 2013年 63回 ¥4,912,000円 95.06% 36.51% 3.99倍 -29.36% 2012年 74回 ¥3,429,600円 66.37% 35.14% 2.99倍 -23.02% 2011年 85回 -¥689,000円 -13.33% 20.00% 0.74倍 -34.21% 2010年 55回 ¥141,600円 2.74% 27.27% 1.10倍 -16.79% 2009年 65回 -¥332,700円 -6.44% 29.23% 0.84倍 -35.55% 2008年 54回 -¥1,280,400円 -24.78% 16.67% 0.26倍 -29.47% 2007年 64回 -¥204,700円 -3.96% 32.81% 0.83倍 -16.60% 2006年 47回 ¥305,200円 5.91% 23.40% 1.33倍 -13.26% 2005年 63回 ¥1,276,100円 24.69% 41.27% 2.17倍 -14.29% 2004年 63回 ¥1,543,800円 29.88% 34.92% 1.97倍 -22.95% 2003年 82回 -¥505,000円 -9.77% 21.95% 0.81倍 -49.56% 2002年 62回 -¥403,900円 -7.82% 25.81% 0.73倍 -22.67% 2001年 75回 -¥168,500円 -3.26% 25.33% 0.92倍 -39.18% 2000年 76回 -¥883,500円 -17.10% 22.37% 0.59倍 -21.76% |
利益曲線は次のとおり。
前述のサイト上には次のように書かれているが、私のバックテスト結果では平均利益は21%もいかなかった。
勝率:31.88%
平均利益:21.42%
平均損失:6.96%
期待値:2.09%
グラフ結果はまぁまぁ似ているが、負けたときの落ち込み具合が私の方が酷い、なぜ?
で、これ「東証一部」以外ではズタボロ。
特に「東証二部」の結果が単調下落するので「全銘柄」で試すと次のような結果になる。
1 2 3 4 5 6 |
全トレード数 1980 勝ちトレード数(勝率) 457(23.08%) 負けトレード数(負率) 1523(76.92%) 全トレード平均利率 -0.38% 勝ちトレード平均利率 30.35% プロフィットファクター 0.98 |
アフィリエイトサイトはバックテストの結果まで
よく見せる
きらいがある。
ご注意を。
まとめ
僕なんて隠し事が全くできない性格だから
バックテスト結果・ソースコード・考察
をすべて公開しちゃってるよ。
子供にすら嘘ついたら即バレるわww
アフィリエイターは息をするように嘘をつく。
ソースコード
バックテストには無料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 |
# loop-type: date-only //============================== require "TIlib" require "Utility" require "TrendCheck" // ====================================== // 株価の高値更新(ブレイクアウト) // ====================================== // //【仕掛けルール】 //1) [終値]が[期間高値(終値)(200)(1日前)(+5.00%)]より[大きい] //2) [日経平均25日線が上向き(集計した銘柄数)]が[1]と[同じ] //3) [翌日寄付]で[買い]を仕掛ける // //【手仕舞いルール】 //1) [日経平均25日線が上向き(集計した銘柄数)]が[0]と[同じ] //1.1) [翌日寄付]で手仕舞いする //2) [終値]が[建て値(-5.00%)]より[小さい] //2.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() //------------------------------------------------ $MA = [$code_num] $MA_1 = [$code_num] $MA_2 = [$code_num] $MA_3 = [$code_num] $MA_4 = [$code_num] $HL_1 = [$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 ! ($MA[i] && $MA[i] && $MA_1[i] && _ $MA_2[i] && $MA_3[i] && $MA_4[i] && $HL_1[i]) //Tilibのオブジェクト生成 $MA[i] = MA_new(25) $MA_1[i] = {-1}MA_new(25) $MA_2[i] = {-2}MA_new(25) $MA_3[i] = {-3}MA_new(25) $MA_4[i] = {-4}MA_new(25) $HL_1[i] = {-1}HighLow_new(200) //銘柄ごとのグローバル変数を初期化する $hold[i] = 0 return end //指標の計算を1日進める MA_next($MA[i]) MA_next($MA_1[i]) MA_next($MA_2[i]) MA_next($MA_3[i]) MA_next($MA_4[i]) HighLow_next($HL_1[i]) //================================================== // 保有してない→購入 //================================================== if (! $hold[i]) if ! (Close && $MA[i] && $MA[i] && $MA_1[i] && _ $MA_2[i] && $MA_3[i] && $MA_4[i] && $HL_1[i]) return end ma = MA_value($MA[i]) ma1 = MA_value($MA_1[i]) ma2 = MA_value($MA_2[i]) ma3 = MA_value($MA_3[i]) ma4 = MA_value($MA_4[i]) high1 = HighLow_high($HL_1[i]) if ! (ma && ma1 && ma2 && ma3 && ma4 && high1) return end //================================================== // 売買(買い) //================================================== //1) [終値]が[期間高値(終値)(200)(1日前)(+5.00%)]より[大きい] flag1 = Close > high1 * 1.05 //2) [日経平均25日線が上向き(集計した銘柄数)]が[1]と[同じ] // = [5] 日連続で、[移動平均(終値)(25)] が [大きい] flag2 = (ma > ma1) && (ma1 > ma2) && (ma2 > ma3) && (ma3 > ma4) if (flag1 && flag2) $buyflag[i][0] = 1 $buyflag[i][1] = ma $buyflag[i][2] = 1 $buyCnt = $buyCnt + 1 end //================================================== // 保有している→売却 //================================================== elsif ($hold[i]) ma = MA_value($MA[i]) ma1 = MA_value($MA_1[i]) ma2 = MA_value($MA_2[i]) ma3 = MA_value($MA_3[i]) ma4 = MA_value($MA_4[i]) if ! (ma && ma1 && ma2 && ma3 && ma4) return end // 移動平均乖離率を計算する if ($set[i] < 1) $set[i] = 1 return end $set[i] = $set[i] + 1 //================================================== // 売買(売り) //================================================== // 1) [日経平均25日線が上向き(集計した銘柄数)]が[0]と[同じ] flag1 = (ma > ma1) && (ma1 > ma2) && (ma2 > ma3) && (ma3 > ma4) // 2) [終値]が[建て値(-5.00%)]より[小さい] flag2 = 0.95 * $buy[i] > Close if (! flag1) PrintLog("売り1") $sellflag[i] = 1 $set[i] = 0 elsif (flag2) PrintLog("売り2") $sellflag[i] = 1 $set[i] = 0 end end end //================================================== // 翌日逆指値チェック //================================================== def CheckHighLow2(t) if ! ({1}High > t && t > {1}Low) return 0 end if ({1}Open > t) return {1}Open else return t end end //==================== // 買い処理([当日引け]で[売り]を仕掛ける) //==================== def SortBuy() PrintLog("購入予定") if ! (HasPricedata(Close)) return end $long = 0 $long = Num($buyUnit, Close) codeset = $order[(int)Code] Buying(codeset) end //==================== // 売り処理( [当日引け]で手仕舞いする) //==================== def Sell_(i) if (HasPricedata({1}Open)) if ($sellflag[i]) Selling(i) $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($buyCnt, 0) while i < $buyCnt {sortList[i]}SortBuy() i = i + 1 end end //---------------------------------------------- i = -1 while (i + 1 < $code_num) i = i + 1 {codes[i]}Sell_(i) end |