普通の会社員がお金持ちになる唯一の方法
それが「投資」。
でも次のような残念な投資家が多いらしい。
- ① ムダに努力をしてしまう
- ② 科学的に考えようとし過ぎる
- ③ 世の中に対して悲観的である
© テニスの王子様/許斐剛/集英社
試行錯誤せずに「長期投資」と決めて、S&P500やオルカンを積立購入して、購入していることさえ忘れてしまう事が一番良いんじゃないかな?
ただ長期投資家は暴落時に流動的な資金が無く儲ける事が出来ない。
だから短期のシステムトレードを調査中……だと自分に言い聞かせて今日もまたバックテストを行ってみる。
MACD大循環分析戦略の期待値検証
前回は、小次郎講師氏の移動平均線大循環分析の期待値検証を行った。
「移動平均線大循環分析」は初心者向け。
大きなトレンドでは勝てるが、売買サインの出るタイミングが遅いという弱点があるとの事。
その弱点を克服し小さなトレンドも逃さずに獲れるのが今回の「大循環MACD」。
MACD大循環分析戦略は、3本(短期、中期、長期)のEMA(指数平滑移動平均線)を使って、相場の状態を読む戦略。
MACDの計算式は「MACD=短期移動平均線-長期移動平均線」なので、2本の指数平滑移動平均線の間隔を見てゴールデンクロス・デッドクロスを判断するのに適しているらしい。
大循環MACDでは短期(5)、中期(20)、長期(40)の3本のEMA(指数平滑移動平均線)を基に、3種類のMACDを算出して分析を行う。
- MACD1:短期(5)EMA – 中期(20)EMA
- MACD2:短期(5)EMA – 長期(40)EMA
- MACD3(帯MACD):中期(20)EMA – 長期(40)EMA
- シグナル:帯MACDの9日EMA
また、短期(5)、中期(20)、長期(40)のEMAの価格によって、相場を次の6つのステージに分類する。
- ステージ1:短期>中期>長期 上昇期(※上昇トレンド持続中)
- ステージ2:中期>短期>長期 上昇期の終わり
- ステージ3:中期>長期>短期 下降期の始まり
- ステージ4:長期>中期>短期 下降期(※下降トレンド持続中)
- ステージ5:長期>短期>中期 下降期の終わり
- ステージ6:短期>長期>中期 上昇期の始まり
それぞれの線のすべてが、細い中央線(ゼロライン)の上にある時は相場が上昇トレンドで、下にある時は下降トレンドにあると判断する。
Protraでのチャート表示方法は、なるぞう氏が公開している。
実際のトレードでは、
- ステージ6(上昇期の始まり)で買って、
- ステージ1(上昇期)で含み益を拡大し、
- ステージ2(上昇期の終わり)やステージ3(下降期の始まり)で売る、
といった、トレンドフォロー戦略に用いる。
【基本の仕掛けポイント】
ステージ6になったとき
- MACD3がMACD3のシグナルとゴールデンクロスを済ませている
- 3本のMACDが右肩上がり
【基本の手じまいポイント】
ステージ3のときに
- MACD3がMACD3のシグナルとデッドクロスを済ませている
- 3本のMACDが右肩下がり
それを踏まえてストラテジーを次のようにした。
【買いルール】
次を満たす場合に翌日の始値の成行で買う。
- MACD1、MACD2、MACD3がゼロ以上
- 5日移動平均 > 40日移動平均 > 20日移動平均
- 前日は40日EMA > 5日MMA > 20日EMA
- MACD3とMACD3シグナルがゴールデンクロス(MACDがシグナルを上回った)
- MACD1、MACD2、MACD3が5日前と比較して上昇している
【手仕舞いルール】
次を満たす場合に翌日の始値の成行で手仕舞いする。
- 3本の線の並び順が変わった
- 営業日で20日経過
書籍には「ニチレイ(2871)」が紹介されており、バックテストをする限り2014/10/30に買いが入っているので動作はしてそうだ。
……と思った時期が僕にもありました。
バックテスト結果
時価総額等の指標が一切含まれていないストラテジーなのでプライム市場だけ利用。
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 |
株価データ: 日足 銘柄リスト: プライム市場20220403 2000/01/06~2022/05/06における成績です。 ---------------------------------------- 全トレード数 12156 勝ちトレード数(勝率) 5499(45.24%) 負けトレード数(負率) 6657(54.76%) 全トレード平均利率 -0.18% 勝ちトレード平均利率 2.73% 負けトレード平均損率 -2.60% 勝ちトレード最大利率 33.87% 負けトレード最大損率 -35.43% 全トレード平均期間 3.01 勝ちトレード平均期間 3.07 負けトレード平均期間 2.96 ---------------------------------------- 必要資金 ¥12,750,500 最大ポジション(簿価) ¥3,446,300 最大ポジション(時価) ¥3,645,700 純利益 -¥9,626,200 勝ちトレード総利益 ¥60,520,700 負けトレード総損失 -¥70,146,900 全トレード平均利益 -¥792 勝ちトレード平均利益 ¥11,006 負けトレード平均損失 -¥10,537 勝ちトレード最大利益 ¥171,000 負けトレード最大損失 -¥144,000 プロフィットファクター 0.86 最大ドローダウン(簿価) -¥9,784,600 最大ドローダウン(時価) -¥9,794,600 ---------------------------------------- 現在進行中のトレード数 6 ---------------------------------------- 平均年利 -3.28% 平均年利(直近5年) -2.08% 最大連勝 12回 最大連敗 15回 ---------------------------------------- [年度別レポート] 年度 取引回数 運用損益 年利 勝率 PF 最大DD 2022年 191回 -¥337,200円 -2.64% 44.50% 0.72倍 -17.81% 2021年 581回 -¥212,000円 -1.66% 47.50% 0.92倍 -10.19% 2020年 533回 -¥227,600円 -1.79% 45.59% 0.93倍 -24.70% 2019年 567回 -¥27,600円 -0.22% 46.03% 0.99倍 -13.08% 2018年 574回 -¥519,900円 -4.08% 47.91% 0.84倍 -15.28% 2017年 565回 ¥466,800円 3.66% 54.16% 1.25倍 -16.13% 2016年 559回 ¥247,500円 1.94% 52.42% 1.09倍 -17.17% 2015年 552回 -¥455,600円 -3.57% 49.46% 0.84倍 -17.67% 2014年 546回 -¥310,400円 -2.43% 48.53% 0.90倍 -30.31% 2013年 470回 ¥181,500円 1.42% 50.21% 1.07倍 -12.84% 2012年 535回 ¥184,600円 1.45% 49.91% 1.07倍 -16.71% 2011年 532回 -¥804,900円 -6.31% 50.56% 0.73倍 -35.43% 2010年 547回 -¥350,700円 -2.75% 48.99% 0.86倍 -23.33% 2009年 552回 ¥177,300円 1.39% 50.18% 1.06倍 -20.11% 2008年 561回 -¥2,025,500円 -15.89% 46.35% 0.63倍 -24.53% 2007年 572回 -¥682,800円 -5.36% 45.98% 0.80倍 -15.96% 2006年 544回 -¥1,027,200円 -8.06% 43.01% 0.70倍 -15.68% 2005年 536回 ¥580,100円 4.55% 51.31% 1.28倍 -10.19% 2004年 512回 -¥312,900円 -2.45% 49.80% 0.87倍 -11.45% 2003年 517回 ¥255,800円 2.01% 53.00% 1.10倍 -9.44% 2002年 539回 -¥1,756,300円 -13.77% 43.78% 0.58倍 -17.18% 2001年 519回 -¥1,271,700円 -9.97% 46.82% 0.70倍 -22.50% 2000年 552回 -¥1,397,500円 -10.96% 42.39% 0.70倍 -16.67% |
利益曲線は次の通り。
なんだよ これww
単調減少じゃんww
仕方ないので貸借銘柄で「売り」でやってみた。
計算時間は2時間45分。
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 |
株価データ: 日足 銘柄リスト: 貸借 2000/01/06~2022/05/06における成績です。 ---------------------------------------- 全トレード数 12477 勝ちトレード数(勝率) 6513(52.20%) 負けトレード数(負率) 5964(47.80%) 全トレード平均利率 0.21% 勝ちトレード平均利率 2.83% 負けトレード平均損率 -2.66% 勝ちトレード最大利率 40.70% 負けトレード最大損率 -78.92% 全トレード平均期間 3.02 勝ちトレード平均期間 2.97 負けトレード平均期間 3.07 ---------------------------------------- 必要資金 ¥2,929,600 最大ポジション(簿価) ¥3,439,800 最大ポジション(時価) ¥3,531,000 純利益 ¥10,874,700 勝ちトレード総利益 ¥74,454,370 負けトレード総損失 -¥63,579,670 全トレード平均利益 ¥872 勝ちトレード平均利益 ¥11,432 負けトレード平均損失 -¥10,661 勝ちトレード最大利益 ¥210,000 負けトレード最大損失 -¥368,400 プロフィットファクター 1.17 最大ドローダウン(簿価) -¥951,900 最大ドローダウン(時価) -¥963,500 ---------------------------------------- 現在進行中のトレード数 7 ---------------------------------------- 平均年利 16.14% 平均年利(直近5年) 6.69% 最大連勝 16回 最大連敗 17回 ---------------------------------------- [年度別レポート] 年度 取引回数 運用損益 年利 勝率 PF 最大DD 2022年 191回 ¥210,600円 7.19% 53.40% 1.23倍 -11.91% 2021年 595回 ¥212,700円 7.26% 52.77% 1.09倍 -12.01% 2020年 546回 -¥295,900円 -10.10% 55.13% 0.91倍 -78.92% 2019年 568回 ¥125,900円 4.30% 54.40% 1.05倍 -17.58% 2018年 585回 ¥726,300円 24.79% 55.73% 1.23倍 -39.54% 2017年 581回 -¥77,800円 -2.66% 52.67% 0.96倍 -22.02% 2016年 561回 ¥131,500円 4.49% 51.87% 1.05倍 -10.57% 2015年 568回 ¥861,400円 29.40% 55.63% 1.40倍 -13.97% 2014年 547回 -¥72,900円 -2.49% 54.84% 0.98倍 -54.83% 2013年 502回 ¥241,500円 8.24% 53.78% 1.09倍 -15.50% 2012年 549回 -¥77,500円 -2.65% 53.73% 0.97倍 -19.05% 2011年 537回 ¥1,091,100円 37.24% 55.87% 1.49倍 -35.35% 2010年 563回 ¥622,400円 21.25% 56.48% 1.28倍 -10.61% 2009年 562回 -¥675,300円 -23.05% 51.07% 0.83倍 -60.67% 2008年 577回 ¥1,879,400円 64.15% 56.67% 1.47倍 -37.11% 2007年 582回 ¥899,900円 30.72% 57.22% 1.32倍 -32.97% 2006年 563回 ¥1,133,600円 38.69% 60.57% 1.44倍 -19.94% 2005年 558回 -¥137,200円 -4.68% 54.30% 0.95倍 -18.66% 2004年 533回 ¥590,400円 20.15% 56.47% 1.27倍 -24.75% 2003年 538回 -¥334,600円 -11.42% 51.67% 0.89倍 -21.67% 2002年 558回 ¥1,349,200円 46.05% 60.22% 1.45倍 -39.39% 2001年 543回 ¥641,700円 21.90% 57.27% 1.18倍 -29.67% 2000年 570回 ¥1,828,300円 62.41% 63.16% 1.57倍 -22.22% |
利益曲線は次の通り。
直近5年間でも7%の利益率となった。
なんだ、この結果……
まとめ
正しく動作しないので試行錯誤を繰り返し中でお蔵入りの記事にしていた。
だけど、何人かの先人が既に実装して「上手くいかなかった」とのコメントを貰った。
だったらこの結果も正常だと思うので公開しておく。
ソースコード
バックテストには無料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 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 |
# loop-type: date-only //============================== require "TIlib" require "Utility" require "TrendCheck" // ====================================== // 小次郎講師氏のMACD大循環分析戦略 // ====================================== // //【買い条件】 // //1) 40日EMA > 5日MMA > 20日EMA から 5日MMA > 40日EMA > 20日EMA になった //2) MACD3とMACD3シグナルがゴールデンクロスを済ませている //3) MACD1、MACD2、MACD3が5日前と比較して上昇している // //【売り条件】 // //1) 3本の線の並び順が変わった 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 = 20 // 最大保有日数(営業日) $shortSelling = 0 // 空売り戦略 Yes(1)/No(0) $Interest = 1 // 無制限(0) / 単利(1) / 複利(2) $reverse = 0 // 購入順序 昇順(0) / 降順(1) $udcount = 0 // 騰落レシオ利用数 Init() //------------------------------------------------ $EMA05 = [$code_num] $EMA20 = [$code_num] $EMA40 = [$code_num] $EMA05_1 = [$code_num] $EMA20_1 = [$code_num] $EMA40_1 = [$code_num] $MACD1 = [$code_num] $MACD2 = [$code_num] $MACD3 = [$code_num] $MACD1_1 = [$code_num] $MACD2_1 = [$code_num] $MACD3_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 ! ($EMA05[i]) // 銘柄ごとのグローバル変数を初期化する $EMA05[i] = EMA_new(5) $EMA20[i] = EMA_new(20) $EMA40[i] = EMA_new(40) $EMA05_1[i] = {-1}EMA_new(5) $EMA20_1[i] = {-1}EMA_new(20) $EMA40_1[i] = {-1}EMA_new(40) $MACD1[i] = MACD_new(5, 20, 9) $MACD2[i] = MACD_new(5, 40, 9) $MACD3[i] = MACD_new(20,40, 9) $MACD1_1[i] = {-5}MACD_new(5, 20, 9) $MACD2_1[i] = {-5}MACD_new(5, 40, 9) $MACD3_1[i] = {-5}MACD_new(20,40, 9) $hold[i] = 0 return end //指標の計算を1日進める EMA_next($EMA05[i]) EMA_next($EMA20[i]) EMA_next($EMA40[i]) EMA_next($EMA05_1[i]) EMA_next($EMA20_1[i]) EMA_next($EMA40_1[i]) MACD_next($MACD1[i]) MACD_next($MACD2[i]) MACD_next($MACD3[i]) MACD_next($MACD1_1[i]) MACD_next($MACD2_1[i]) MACD_next($MACD3_1[i]) //================================================== // 保有してない→購入 //================================================== if (! $hold[i]) ema05 = EMA_value($EMA05[i]) ema20 = EMA_value($EMA20[i]) ema40 = EMA_value($EMA40[i]) ema05_1 = EMA_value($EMA05_1[i]) ema20_1 = EMA_value($EMA20_1[i]) ema40_1 = EMA_value($EMA40_1[i]) macd1 = MACD_value($MACD1[i]) macd2 = MACD_value($MACD2[i]) macd3 = MACD_value($MACD3[i]) macd1_1 = MACD_value($MACD1_1[i]) macd2_1 = MACD_value($MACD2_1[i]) macd3_1 = MACD_value($MACD3_1[i]) signal3 = MACD_signal($MACD3[i]) signal3_1 = MACD_signal($MACD3_1[i]) if ! (ema05 && ema20 && ema40 && ema05_1 && ema20_1 && ema40_1 && Close) return end if ! (macd1 && macd2 && macd3 && macd1_1 && macd2_1 && macd3_1 && signal3 && signal3_1) return end //================================================== // 売買(買い) //================================================== //1) 5日移動平均 > 40日移動平均 > 20日移動平均 flag1 = ema05 > ema20 && ema40 > ema20 if ! (flag1) return end //2) 前日は40日EMA > 5日MMA > 20日EMA flag2 = ema40_1 > ema05_1 && ema05_1 > ema20_1 if ! (flag2) return end //2) MACD3とMACD3シグナルがゴールデンクロスを済ませている(シグナルを上回った) flag3 = macd3_1 < signal3_1 && macd3 > signal3 if ! (flag3) return end //3) MACD1、MACD2、MACD3が5日前と比較して上昇している flag4 = macd1 > macd1_1 && macd2 > macd2_1 && macd3 > macd3_1 if (flag4) PrintLog("買い候補") $buyflag[i][0] = 1 $buyflag[i][1] = ema05 $buyflag[i][2] = 1 $buyCnt = $buyCnt + 1 end //================================================== // 保有している→売却 //================================================== elsif ($hold[i]) if ($set[i] < 1) $set[i] = 1 return end $set[i] = $set[i] + 1 //================================================== // 売買(売り) //================================================== ema05_1 = EMA_value($EMA05_1[i]) ema05 = EMA_value($EMA05[i]) ema20 = EMA_value($EMA20[i]) ema40 = EMA_value($EMA40[i]) if ! (ema05_1 && ema05 && ema20 && ema40) return end //================================================== // 売買(買い) //================================================== // 2) 3本の線の並び順が変わった flag1 = ! (ema05 > ema20 && ema40 > ema20) if (flag1) PrintLog("利食い2") $sellflag[i] = 1 $set[i] = 0 // 2) 損切り:指定日以上持っていた場合 elsif ($set[i] >= $MaxHoldDay) PrintLog("損切り") $sellflag[i] = 1 $set[i] = 0 end end end //==================== // 買い処理 //==================== def SortBuy() if ! (HasPricedata(Close)) return end $long = 0 $long = Num($buyUnit, Close) codeset = $order[(int)Code] Buying(codeset) end //==================== // 売り処理 //==================== def Sell_(i) 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 //==================== // 銘柄コードを変えながら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(10, 0) cnt = $buyCnt if ($buyCnt > 10) cnt = 10 end while i < cnt {sortList[i]}SortBuy() i = i + 1 end end //---------------------------------------------- i = -1 while (i + 1 < $code_num) i = i + 1 {codes[i]}Sell_(i) end |