風邪を引きました。エアコンが寒すぎる・・・。
夏なのに普段から長袖で、エアコンしてなくても布団掛けて寝ているので・・・。
冬は辛そうだなあ・・・。
そして、どんどん老いていく・・・。
海外投資家や個人投資家は、2018年より市場から徐々に減っています。
グラフを見る限り、日経平均株価は18000円ぐらいが妥当に感じます。
海外の売り圧力を全部「日銀」のETF(上場投資信託)購入が吸収しています。
そりゃテクニカル分析も糞もないよね!!
グラフ寝るよね!!
「グランビルの法則」は金融予測25年最下位だった金融記者「ジョセフ・E・グランビル(Joseph E. Granville 1923- )」が考案しました。
ただの金融記者のちょっとした思いつきが、科学的権威を帯びた「法則」として日本のみ広まっていったのは、ルール好きの日本人らしい。
グランビルの法則の詳細は「おさらい・・・グランビルの法則とは?」にあります。
イザナミのグランビルの法則の有効性
「グランビルの法則を設定する」にイザナミでのグランビルの法則の実現方法がさりげなく書いてあります。
買いルールは次の4つです。
(1)終値が下向きから横ばいか上向きになったMAを上抜けたら買い
【買いルール】
- 1) 1日前の[5]日連続で、[移動平均(終値)(25)]が[小さい]
- 2) 1日前の[5]日連続で、[終値]が[移動平均(終値)(25)]より小さい
- 3) 当日の[終値]が[移動平均(終値)(25)]より[大きい(同じものを含む)]
- 4) [翌日寄付]で[買い]を仕掛ける
(2)終値が上昇中のMAを下回ったが、MAを再度上抜けたら買い(押し目買い)
【買いルール】
- 1) 当日が[5]日連続で、[移動平均(終値)(25)]が[大きい]
- 2) 1日前の[終値]が、[移動平均(終値)(25)]より[小さい]
- 3) 当日の[終値]が[移動平均(終値)(25)]より[大きい(同じものを含む)]
- 4) [翌日寄付]で[買い]を仕掛ける
(3)終値が上昇中のMA上側で下落したが、MAに達せずに反発したら買い
【買いルール】
- 1) 当日が[5]日連続で、[移動平均(終値)(25)]が[大きい]
- 2) 当日が[5]日連続で、[終値]が[移動平均(終値)(25)]より[大きい]
- 3) 1日前の[2]日連続で、[終値]が[小さい]
- 4) 当日が[1]日連続で、[終値]が[大きい]
- 5) [翌日寄付]で[買い]を仕掛ける
(4)終値が下落中のMAを大幅に下回って乖離が大きくなったら買い(リバウンド狙い)
【買いルール】
- 1) 当日が[5]日連続で、[移動平均(終値)(25)]より[小さい]
- 2) 当日の[終値]が、[移動平均(終値)(25)(-10.00%)]より[小さい(同じ含む)]
- 3) [翌日寄付]で[買い]を仕掛ける
今回は、マルチストラテジーを一度に実行することになります。
ソースコード
実運用する場合は、順張り、逆張り、空売り(やらない人もいる)・・・のように複数のストラテジーを動かす必要があります。
それを別々にバックテストすると、時間がいくらあっても足りません。
今回は、マルチストラテジーをどのように実装するのか?という例にもなります。
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 |
# loop-type: date-only //============================== require "TIlib" require "Utility" require "TrendCheck" // ====================================== // イザナミのサンプル手法 // ====================================== // //【仕掛けのルール】 //■ 終値が下向きから横ばいか上向きになったMAを上抜けたら買い // 1) 1日前まで5日連続で移動平均(終値)(25)が[小さい] // 2) 1日前まで5日連続で[終値]が[移動平均(終値)(25)]より[小さい] // 3) 当日の[終値]が[移動平均(終値)(25)]より[大きい(同じ含む)] // //■ 終値が上昇中のMAを下回ったが、MAを再度上抜けたら買い(押し目買い) // 1) 当日まで[5]日連続で、[移動平均(終値)(25)]が[大きい] // 2) 1日前まで[終値]が、[移動平均(終値)(25)]より[小さい] // 3) 当日の[終値]が、[移動平均(終値)(25)]より[大きい(同じものを含む)] // //■ 終値が上昇中のMA上側で下落したが、MAに達せずに反発したら買い // 1) 当日まで[5]日連続で、[移動平均(終値)(25)]が[大きい] // 2) 当日まで[5]日連続で、[終値]が[移動平均(終値)(25)]より[大きい] // 3) 1日前まで[2]日連続で、[終値]が[小さい] // 4) 当日まで[1]日連続で、[終値]が[大きい] // //■ 終値が下落中のMAを大幅に下回って乖離が大きくなったら買い(リバウンド狙い) // 1) 当日まで[5]日連続で、[移動平均(終値)(25)]より[小さい] // 2) 当日の[終値]が、[移動平均(終値)(25)(-10.00%)]より[小さい(同じ含む)] // //【手仕舞いのルール】 // 1) 3日以上持っていた場合 // 2) 5%以上の含み損が出た場合 // 3) 5%以上の含み益が出た場合 codes = CodeList if $code_num && $code_num != Length(codes) Print("前回と異なる銘柄リストでは実行できません。") Dummy end $code_num = Length(codes) //グローバル変数を初期化 if ! ($__INIT__) $budgetIni = 10000000 $budget = $budgetIni // 投資総額 (1000万円) $buyUnit = 1000000 // 1回の購入資金 (100万円) $MaxHoldDay = 3 // 最大保有日数 $Interest = 1 // 無制限(0) / 単利(1) / 複利(2) $reverse = 0 // 購入順序 昇順(0) / 降順(1) $ratiodate = 0 // 騰落レシオ日数 //------------------------------------------------ Init() $__INIT__ = 1 end // ○日間の移動平均(終値)を返す def MAClose(num) i = -1 + at av = 0 while (-1 * num - 1 < i) if ! ({i}Close) return 0 end av = av + {i}Close i = i - 1 end return (av / num) end def Main(i) //================================================== // 条件(買条件, 売条件共通部分) //================================================== //まだ上場していない銘柄は株価データがないためnullが返る if (Index == null) return end if ! ($order[(int)Code]) $order[(int)Code] = i end // ここまで ======================================== if (1 == PricedataExistCheck(Close)) return end //================================================== // 保有してない→購入 //================================================== if ! ($hold[i]) if ! ({-1}Close && {-2}Close && {-3}Close && {-4}Close && {-5}Close) return end ma = MAClose(25) ma1 = {-1}MAClose(25) ma2 = {-2}MAClose(25) ma3 = {-3}MAClose(25) ma4 = {-4}MAClose(25) ma5 = {-5}MAClose(25) // 1) 1日前まで5日連続で移動平均(終値)(25)が[小さい] // 2) 1日前まで5日連続で[終値]が[移動平均(終値)(25)]より[小さい] // 3) 当日の[終値]が[移動平均(終値)(25)]より[大きい(同じ含む)] rule11 = (ma5 >= ma4 && ma4 >= ma3 && ma3 >= ma2 && ma2 >= ma1) rule12 = ({-1}Close < ma1 && {-2}Close < ma2 && {-3}Close < ma3 && {-4}Close < ma4 && {-5}Close < ma5) rule13 = (ma <= Close) //1) 当日まで[5]日連続で、[移動平均(終値)(25)]が[大きい] //2) 1日前まで[終値]が、[移動平均(終値)(25)]より[小さい] //3) 当日の[終値]が、[移動平均(終値)(25)]より[大きい(同じものを含む)] rule21 = (ma4 < ma3 && ma3 < ma2 && ma2 < ma1 && ma1 < ma) rule22 = ({-1}Close < ma1) rule23 = (ma <= Close) //1) 当日まで[5]日連続で、[移動平均(終値)(25)]が[大きい] //2) 当日まで[5]日連続で、[終値]が[移動平均(終値)(25)]より[大きい] //3) 1日前まで[2]日連続で、[終値]が[小さい] //4) 当日まで[1]日連続で、[終値]が[大きい] rule31 = rule21 rule32 = (Close > ma && {-1}Close > ma1 && {-2}Close > ma2 && {-3}Close > ma3 && {-4}Close > ma4) rule33 = ({-3}Close > {-2}Close && {-2}Close > {-1}Close) rule34 = (Close > {-1}Close) //1) 当日まで[5]日連続で、[移動平均(終値)(25)]より[小さい] //2) 当日の[終値]が、[移動平均(終値)(25)(-10.00%)]より[小さい(同じ含む)] rule41 = (ma4 > ma3 && ma3 > ma2 && ma2 > ma1 && ma1 > ma) rule42 = (Close <= ma * 0.9) if (rule11 && rule12 && rule13) PrintLog("ルール1") $buyflag[i][0] = 1 elsif (rule21 && rule22 && rule23) PrintLog("ルール2") $buyflag[i][0] = 1 // elsif (rule31 && rule32 && rule33 && rule34) // PrintLog("ルール3") // $buyflag[i][0] = 1 elsif (rule41 && rule42) PrintLog("ルール4") $buyflag[i][0] = 1 end if ($buyflag[i][0]) $buyflag[i][0] = 1 $buyflag[i][1] = MAClose(25) $buyCnt = $buyCnt + 1 end //================================================== // 保有している→売却 //================================================== elsif ($hold[i]) if ($set[i] < 1) $set[i] = 1 return end $set[i] = $set[i] + 1 //================================================== // 売買(売り) //================================================== // 1) 利食い:含み益が10%を上回った if (Close >= 1.05 * $buy[i]) PrintLog("利食い") $sellflag[i] = 1 $set[i] = 0 // 2) 損切り:含み益が5%を下回った elsif (Close <= 0.95 * $buy[i]) PrintLog("損切り") $sellflag[i] = 1 $set[i] = 0 // 3) 損切り:実働3日経過 elsif ($set[i] >= $MaxHoldDay) PrintLog("損切り") $sellflag[i] = 1 $set[i] = 0 end end end //==================== // 買い処理 //==================== def SortBuy(i) if (PricedataExistCheck(Close)) return end $long = 0 $long = Num($buyUnit, Close) codeset = $order[(int)Code] Buying(codeset) end //==================== // 売り処理 //==================== def Sell_(i) if (PricedataExistCheck(Close)) return end if ($sellflag[i]) Selling(i) $sellflag[i] = 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 if ($buyCnt) 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)2)4)のみで実験しました。
必要時間は約4時間です。
単利でバックテストを行ったはずが、必要資金が億を越えてます。
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 |
株価データ: 日足 銘柄リスト: 全銘柄 1998/01/05~2019/08/19における成績です。 ---------------------------------------- 全トレード数 11513 勝ちトレード数(勝率) 4089(35.52%) 負けトレード数(負率) 7424(64.48%) 全トレード平均利率 -0.95% 勝ちトレード平均利率 7.44% 負けトレード平均損率 -5.57% 勝ちトレード最大利率 138.29% 負けトレード最大損率 -54.21% 全トレード平均期間 3.98 勝ちトレード平均期間 4.02 負けトレード平均期間 3.96 ---------------------------------------- 必要資金 ¥122,816,700 最大ポジション(簿価) ¥11,172,400 最大ポジション(時価) ¥12,638,700 純利益 -¥111,107,200 勝ちトレード総利益 ¥294,879,700 負けトレード総損失 -¥405,986,800 全トレード平均利益 -¥9,651 勝ちトレード平均利益 ¥72,115 負けトレード平均損失 -¥54,686 勝ちトレード最大利益 ¥1,418,100 負けトレード最大損失 -¥558,000 プロフィットファクター 0.73 最大ドローダウン(簿価) -¥112,554,000 最大ドローダウン(時価) -¥112,788,200 ---------------------------------------- 現在進行中のトレード数 9 ---------------------------------------- [年度別レポート] 年度 取引回数 運用損益 勝率 PF 最大DD 2000年 622回 -¥5,739,300円 40.68% 0.68倍 -34.91% 2001年 597回 -¥6,808,800円 39.53% 0.65倍 -28.05% 2002年 618回 -¥8,623,000円 39.16% 0.59倍 -27.74% 2003年 584回 -¥1,706,900円 44.69% 0.90倍 -20.90% 2004年 528回 -¥4,777,400円 40.91% 0.69倍 -32.84% 2005年 514回 -¥2,207,964円 42.22% 0.83倍 -18.58% 2006年 594回 -¥11,512,300円 37.04% 0.48倍 -30.45% 2007年 634回 -¥9,728,500円 40.22% 0.60倍 -54.21% 2008年 666回 -¥4,789,500円 43.99% 0.83倍 -36.15% 2009年 634回 -¥9,203,100円 42.59% 0.66倍 -48.59% 2010年 567回 -¥7,943,194円 42.86% 0.63倍 -50.00% 2011年 585回 -¥5,601,677円 42.91% 0.76倍 -47.14% 2012年 578回 -¥6,600,841円 41.35% 0.71倍 -33.33% 2013年 605回 -¥2,558,747円 42.64% 0.89倍 -33.57% 2014年 608回 -¥7,933,317円 42.43% 0.68倍 -41.31% 2015年 596回 -¥5,709,773円 38.42% 0.74倍 -31.51% 2016年 592回 -¥1,644,293円 47.80% 0.91倍 -28.57% 2017年 528回 ¥1,106,297円 44.89% 1.08倍 -22.38% 2018年 574回 -¥7,208,322円 40.77% 0.65倍 -32.76% 2019年 289回 -¥1,916,614円 42.91% 0.79倍 -49.64% |
年利はよく分かりません。
利益曲線は次のとおりです。
見ろ!この単調カーブ!!
・・・・?
あら?
あり?
ある?
あれ?
あろ?
まとめ
うーん、予想を反してキレイな単調減少です。
なら、売りで入れば?
と単純に考えがちですが、売りは逆日歩があります。
また、ストップ安や出来高の小さい銘柄でも空売りをしてしまうということによって、実際と異なる検証結果となる可能性があります。
また、売り禁のパターンになる可能性もあります。
とは言え、最近実装するストラテジーは2008年のリーマンショックを全く気にする必要ないぐらい単調グラフです。