金融庁の調査では70%の個人投資家が資産を減らしている。
損しているほうがずっと多い。
ところが、S&P500の価額はこの5年で94%も増えている。
もし買って何もしなければ、減らすどころか約2倍に増えていたことになる。
利益を出すにはインデックスを購入し、ただ保有し続けるだけ。
テクニカル投資を学習して得たのは統計学とか機械学習の知識であり、投資の知識は全く身に付かなかった。
システムトレードのバックテストばかりやってる場合じゃないわ。
ネタも尽きたし……。
小次郎講師(手塚宏二)氏とは誰か?
「日本に正しい投資教育を根付かせる」ことをライフワークとし、現在門下生2千人を超える大人気講師らしい。
「移動平均線大循環分析」「大循環MACD」などを独自開発し、DVDも発売している。
今年の3月までラジオNIKKEI第1 毎週木曜日 17:30~17:45にて番組「小次郎講師のチャートラボラトリー」も放送していた。
移動平均線大循環分析の期待値検証
その氏の提案である「移動平均線大循環分析」について次のように紹介されていた。
移動平均線大循環分析は3本の移動平均線を使います。
2本の移動平均線を使ってゴールデンクロスやデッドクロスでトレードする方法もありますが、もみ合い相場ではだましが増加します。
ところが、移動平均線を3本使うことによって、だましを減らすことができます。
【基本の仕掛けポイント】
ステージ1(上から短期・中期・長期)で3本の線が右肩上がりを確認した
- 移動平均線の並び順が上から短期・中期・長期
- 3本の移動平均線が右肩上がり
【基本の手じまいポイント】
- 3本の線の並び順が変わったら(変わると予見出来たら)
デフォルトは5日、20日、40日で「指数平滑移動平均線(EMA)」が最適とのこと。
[引用] auカブコム証券
これ相場師朗氏の「パンパカパン」に似ている。
上から5日線・20日線・60日線・100日線・300日線の順番になっていて、このシグナルが出ているときは相場が強い状態なので「買い」。
それを踏まえてストラテジーを次のようにした。
【買いルール】
次を満たす場合に翌日の始値の成行で買う。
- 5日移動平均 > 20日移動平均 > 40日移動平均
- 5日前と比較して40日、20日移動平均が右肩上がり
【手仕舞いルール】
次を満たす場合に翌日の始値の成行で手仕舞いする。
- 3本の線の並び順が変わった
- 営業日で20日経過
期待はしてない。
バックテスト結果
時価総額等の指標が一切含まれていないストラテジーなのでプライム市場だけ利用。
計算時間は約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/04/18における成績です。 ---------------------------------------- 全トレード数 2413 勝ちトレード数(勝率) 913(37.84%) 負けトレード数(負率) 1500(62.16%) 全トレード平均利率 0.98% 勝ちトレード平均利率 11.19% 負けトレード平均損率 -5.24% 勝ちトレード最大利率 201.35% 負けトレード最大損率 -33.09% 全トレード平均期間 19.35 勝ちトレード平均期間 28.28 負けトレード平均期間 13.91 ---------------------------------------- 必要資金 ¥3,525,200 最大ポジション(簿価) ¥3,484,000 最大ポジション(時価) ¥5,167,800 純利益 ¥11,597,300 勝ちトレード総利益 ¥48,173,900 負けトレード総損失 -¥36,576,600 全トレード平均利益 ¥4,806 勝ちトレード平均利益 ¥52,764 負けトレード平均損失 -¥24,384 勝ちトレード最大利益 ¥1,159,600 負けトレード最大損失 -¥193,500 プロフィットファクター 1.32 最大ドローダウン(簿価) -¥2,793,400 最大ドローダウン(時価) -¥2,820,500 ---------------------------------------- 現在進行中のトレード数 5 ---------------------------------------- 平均年利 14.30% 平均年利(直近5年) 4.73% 最大連勝 8回 最大連敗 18回 ---------------------------------------- [年度別レポート] 年度 取引回数 運用損益 年利 勝率 PF 最大DD 2022年 35回 ¥20,800円 0.59% 40.00% 1.05倍 -12.73% 2021年 105回 ¥616,100円 17.48% 40.00% 1.52倍 -18.29% 2020年 117回 -¥143,000円 -4.06% 34.19% 0.94倍 -25.20% 2019年 95回 ¥910,100円 25.82% 41.05% 1.68倍 -15.34% 2018年 127回 -¥570,400円 -16.18% 29.92% 0.76倍 -31.36% 2017年 103回 ¥967,800円 27.45% 48.54% 2.00倍 -24.62% 2016年 102回 ¥1,015,700円 28.81% 45.10% 1.64倍 -20.51% 2015年 101回 ¥632,400円 17.94% 48.51% 1.44倍 -26.11% 2014年 108回 ¥866,500円 24.58% 42.59% 1.58倍 -20.86% 2013年 99回 ¥1,165,100円 33.05% 45.45% 1.73倍 -27.85% 2012年 109回 ¥572,400円 16.24% 43.12% 1.42倍 -20.00% 2011年 115回 -¥333,200円 -9.45% 37.39% 0.85倍 -27.59% 2010年 111回 ¥861,600円 24.44% 37.84% 1.59倍 -18.18% 2009年 102回 ¥1,013,300円 28.74% 47.06% 1.52倍 -33.09% 2008年 121回 -¥989,200円 -28.06% 28.93% 0.67倍 -29.90% 2007年 112回 -¥350,500円 -9.94% 37.50% 0.79倍 -31.13% 2006年 114回 -¥540,400円 -15.33% 35.96% 0.64倍 -16.96% 2005年 88回 ¥2,125,600円 60.30% 62.50% 5.42倍 -10.77% 2004年 98回 ¥1,565,500円 44.41% 42.86% 2.23倍 -17.97% 2003年 96回 ¥1,957,500円 55.53% 52.08% 2.82倍 -17.90% 2002年 112回 ¥315,800円 8.96% 40.18% 1.19倍 -17.97% 2001年 116回 ¥167,900円 4.76% 39.66% 1.08倍 -32.71% 2000年 127回 -¥250,100円 -7.09% 31.50% 0.88倍 -21.51% |
利益曲線は次の通り。
なんと、勝率が3割だけど年利10%程度で全体的には利益が出ている。
ただし1ヶ月程度の保有によりドローダウンが30%程度となっており辛いだろうね。
まとめ
2006年から2013年までの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 |
# loop-type: date-only //============================== require "TIlib" require "Utility" require "TrendCheck" // ====================================== // 小次郎講師氏の移動平均線大循環分析 // ====================================== // //【買い条件】 // //1) 5日移動平均 > 20日移動平均 > 40日移動平均 //2) 5日前と比較して40日、20日移動平均が右肩上がり // //【売り条件】 // //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] $EMA20_1 = [$code_num] $EMA40_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) $EMA20_1[i] = {-1}EMA_new(20) $EMA40_1[i] = {-1}EMA_new(40) $hold[i] = 0 return end //指標の計算を1日進める EMA_next($EMA05[i]) EMA_next($EMA20[i]) EMA_next($EMA40[i]) EMA_next($EMA20_1[i]) EMA_next($EMA40_1[i]) //================================================== // 保有してない→購入 //================================================== if (! $hold[i]) ema05 = EMA_value($EMA05[i]) ema20 = EMA_value($EMA20[i]) ema40 = EMA_value($EMA40[i]) ema20_1 = EMA_value($EMA20_1[i]) ema40_1 = EMA_value($EMA40_1[i]) if ! (ema05 && ema20 && ema40 && ema20_1 && ema40_1 && Close) return end //================================================== // 売買(買い) //================================================== //1) 5日移動平均 > 20日移動平均 > 40日移動平均 flag1 = ema05 > ema20 && ema20 > ema40 if ! (flag1) return end //2) 40日と20日の移動平均の順序が前日から入れ替わった flag2 = ema40_1 > ema20_1 if (flag2) 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 = EMA_value($EMA05[i]) ema20 = EMA_value($EMA20[i]) ema40 = EMA_value($EMA40[i]) if ! (ema05 && ema20 && ema40) return end //================================================== // 売買(買い) //================================================== // 1) 3本の線の並び順が変わった flag1 = ! (ema05 > ema20 && ema20 > ema40) if (flag1) PrintLog("利食い") $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 |