マネックス証券が提供する優秀なトレードツール「トレードステーション」のサービスが2020年の8月7日に終了となります。
「システムトレードの達人」も販売終了予定とツイッターに記載がありました。
西村剛@証券アナリスト @nishimuraFT
今日斉藤さんとも相談して、今年のどこかのタイミングでシス達の販売を終了することが決まりました。
#システムトレードの達人
午前1:56 · 2020年1月26日·今日斉藤さんとも相談して、今年のどこかのタイミングでシス達の販売を終了することが決まりました。#システムトレードの達人
— 西村剛@証券アナリスト (@nishimuraFT) January 25, 2020
システムトレードはやっぱり儲からないのか?ストラテジー作りが一般受けしなかったのか?理由は分かりません。
「イザナミ」は終わる様子はありません。
私が使っている「Protra」はオープンソースコードなので必要に応じて自分で更新でき、特に不便はありません。
今までに多くの手法をバックテストで確認してきました。
実は、作成途中の手法がまだ30種類ぐらいあり、日記も非公開状態で止まっています。
ですが、今回は初心に返って斉藤氏のストラテジーのバックテストを行ってみます。
おさらい・・・斉藤正章氏とは?
2年9ヶ月で1億1千万円にした個人投資家として注目を集めたトレーダーです。
経歴は次の通りです。
1975年、東京都生まれ。
システム開発会社でプログラマー兼システムエンジニアとして8年間勤務した後、独立。
2003年より独学でシステムトレードを開始してから約3年間で6000%近い利回りを達成。
2006年に運用資金の4割を失ってから新たなシステムを開発し、現在は年利40%前後で安定した運用を継続。
「斉藤正章氏(S式)」の逆張り手法とは?
2018年時点の最新のS式手法が次のページに記載されています。
【買い】
- 1) 25日間移動平均との乖離率が-25%を下回った。
- 2) 5日間移動平均との乖離率が-10%を下回った。
- 3) 急落している銘柄数が、過去100営業日の平均と比べて7倍以上(動的シグナル数フィルター)
【売買(売り)】
- 1) 買値の10%を上回った
- 2) 暦日2ヶ月経過、41営業日経過で近似
移動平均乖離率がマイナスが大きいほど、直近の株価より大きく下落していることを表し、反発を期待した買いのチャンスになります。
新規部分は「動的シグナル数フィルター」です。これにより、暴落時して急落銘柄数が多くなった時にだけ購入します。
例えば、リーマンショックなどの荒れている相場では、暴落が終わりそうになるまでは買わないという選択も可能になります。
で、斎藤氏の手法は過去も何度か挑戦しています。
順張りは「ボラティリティ」の定義がよく分かりませんでした。
逆張り手法はProtraを学んだ初期に実装したため、バックテストが不十分でした。
ソースコード
「Utility.pt」、「TrendCheck.pt」、「TIlib.pt」はGithubに置いてあります。
「動的フィルタ」は「25日間移動平均との乖離率」「5日間移動平均との乖離率」により買いシグナルが出た数を「急落している銘柄数」として計算しています。
これは「保田望氏の動的フィルタ」と同じ概念です。
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 |
# loop-type: date-only //============================== require "TIlib" require "Utility" require "TrendCheck" //============================== // 斉藤正章氏(S式)の逆張り手法 //------------------------------ // // 【買い】 // 1) 25日間移動平均との乖離率が-25%を下回った。 // 2) 5日間移動平均との乖離率が-10%を下回った。 // 3) 急落している銘柄数が、過去100営業日の平均と比べて7倍以上 // // 【売買(売り)】 // 1) 買値の10%を上回った // 2) 暦日2ヶ月経過、41営業日経過で近似 codes = CodeList if $code_num && $code_num != Length(codes) Print("前回と異なる銘柄リストでは実行できません。") Dummy end $code_num = Length(codes) //グローバル変数を初期化 if !$__INIT__ $budgetIni = 3000000 $buyUnit = 300000 // 1回の購入資金 (50万円) $MaxHoldDay = 40 // 最大保有日数(60日) $shortSelling = 0 // 空売り戦略 Yes(1)/No(0) $Interest = 1 // 無制限(0) / 単利(1) / 複利(2) $reverse = 0 // 購入順序 昇順(0) / 降順(1) $udcount = 0 // 騰落レシオ利用数 Init() //------------------------------------------------ $MA5 = [$code_num] $MA25 = [$code_num] // 値上がり銘柄のカウント ------------------------ InitDone() // 騰落レシオ初期化 $__INIT__ = 1 end def Main(i) //================================================== // 条件(買条件, 売条件共通部分) //================================================== //まだ上場していない銘柄は株価データがないためnullが返る if (Index == null) return end if ! ($order[(int)Code]) $order[(int)Code] = i end //================================================== if ! ($MA5[i] && $MA25[i]) //銘柄ごとのグローバル変数を初期化する $MA5[i] = MA_new(5) $MA25[i] = MA_new(25) $hold[i] = 0 return end //指標の計算を1日進める MA_next($MA5[i]) MA_next($MA25[i]) //================================================= //トレンド判定 //================================================= stpflg = 0 if 75 < Index stpflg = StockPosition(i) end // ここまで ======================================== //================================================== // 保有してない→購入 //================================================== if ! ($hold[i]) ma5 = MA_value($MA5[i]) ma25 = MA_value($MA25[i]) if ! (ma5 && ma25 && Close && Close >= 50) return end r25 = 100 * (Close - ma25) / ma25 r5 = 100 * (Close - ma5) / ma5 // 1) 25日間移動平均との乖離率が-25%を下回った。 // 2) 5日間移動平均との乖離率が-10%を下回った。 if (r25 <= -25 && r5 <= -10) $buyflag[i][0] = 1 $buyflag[i][1] = r25 // 好きなパラメータをもとにソート $buyCnt = $buyCnt + 1 end //================================================== // 保有している→売却 //================================================== elsif ($hold[i]) if $set[i] < 1 $set[i] = 1 return end $set[i] = $set[i] + 1 if ! (Close && Close >= 50) return end //================================================== // 売買(売り) //================================================== // 1) 利食い:含み益が10%を上回った if (Close >= 1.10 * $buy[i]) PrintLog("利食い") $sellflag[i] = 1 $set[i] = 0 // 2) 損切り:暦日2ヶ月経過、41営業日経過で近似 elsif ($set[i] >= $MaxHoldDay) $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] Print(codeset) Buying(codeset) end //==================== // 売り処理 //==================== def Sell_(i) if ($sellflag[i]) Selling(i) $sellflag[i] = 0 end // 使用した$buyflag 配列を初期化 if ($buyflag[i][0]) $buyflag[i][0] = 0 $buyflag[i][1] = 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 // 4) 突入タイミング 過去100日平均サイン点灯数の7倍以上 sg = SignalCount(100) Print("過去100日平均サイン点灯数 =" + sg + " $sflag=" + $sflag + " $buyCnt=" + $buyCnt) if ($buyCnt >= sg * 7) 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 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 |
株価データ: 日足 銘柄リスト: 全銘柄 1998/01/05~2020/07/10における成績です。 ---------------------------------------- 全トレード数 728 勝ちトレード数(勝率) 534(73.35%) 負けトレード数(負率) 194(26.65%) 全トレード平均利率 7.66% 勝ちトレード平均利率 17.47% 負けトレード平均損率 -19.36% 勝ちトレード最大利率 66.67% 負けトレード最大損率 -75.33% 全トレード平均期間 26.48 勝ちトレード平均期間 15.47 負けトレード平均期間 56.79 ---------------------------------------- 必要資金 ¥2,898,200 最大ポジション(簿価) ¥2,999,200 最大ポジション(時価) ¥3,779,200 純利益 ¥14,536,280 勝ちトレード総利益 ¥24,526,060 負けトレード総損失 -¥9,989,776 全トレード平均利益 ¥19,967 勝ちトレード平均利益 ¥45,929 負けトレード平均損失 -¥51,494 勝ちトレード最大利益 ¥200,000 負けトレード最大損失 -¥210,900 プロフィットファクター 2.46 最大ドローダウン(簿価) -¥760,454 最大ドローダウン(時価) -¥1,305,500 ---------------------------------------- 現在進行中のトレード数 0 ---------------------------------------- 平均年利 23.88% 平均年利(直近5年) 3.91% 最大連勝 13回 最大連敗 4回 ---------------------------------------- [年度別レポート] 年度 取引回数 運用損益 年利 勝率 PF 最大DD 2020年 15回 -¥470,900円 -16.25% 26.67% 0.27倍 -52.17% 2019年 16回 ¥258,400円 8.92% 68.75% 2.53倍 -26.44% 2018年 44回 -¥365,454円 -12.61% 59.09% 0.66倍 -49.45% 2017年 32回 ¥683,820円 23.59% 68.75% 3.89倍 -24.25% 2016年 22回 ¥460,300円 15.88% 72.73% 4.44倍 -12.76% 2015年 39回 ¥593,827円 20.49% 66.67% 1.88倍 -40.75% 2014年 47回 ¥1,480,020円 51.07% 87.23% 7.45倍 -44.78% 2013年 38回 ¥637,960円 22.01% 68.42% 2.61倍 -21.79% 2012年 23回 ¥257,200円 8.87% 65.22% 1.78倍 -35.88% 2011年 29回 ¥367,200円 12.67% 68.97% 1.65倍 -48.64% 2010年 29回 ¥441,407円 15.23% 72.41% 2.34倍 -29.38% 2009年 35回 ¥373,300円 12.88% 74.29% 1.46倍 -69.81% 2008年 48回 ¥522,600円 18.03% 77.08% 1.46倍 -75.33% 2007年 39回 ¥779,500円 26.90% 71.79% 2.60倍 -40.22% 2006年 64回 ¥2,280,500円 78.69% 90.63% 8.04倍 -48.04% 2005年 35回 ¥872,400円 30.10% 71.43% 3.49倍 -26.50% 2004年 41回 ¥936,500円 32.31% 75.61% 2.85倍 -27.01% 2003年 26回 ¥1,192,700円 41.15% 92.31% 6.65倍 -68.57% 2002年 41回 ¥1,176,600円 40.60% 73.17% 2.90倍 -45.51% 2001年 48回 ¥1,334,300円 46.04% 81.25% 3.08倍 -55.55% 2000年 17回 ¥724,100円 24.98% 88.24% 7.05倍 -37.20% |
利益曲線は次の通り。
やはりドローダウンが激しい。
そしてリーマンショックには負けていませんが、コロナでは「-16.25%」と打ち負けています。
発展として書かれている他のサイトの情報
「S式の逆張り手法」は、2006年以降は有効性が大きく低下し、2008年に至っては殆ど機能しなくなっている。
と書かれているサイト(シストレ魂開発者の元トレードテックの「中村義和」の情報商材)がありましたので抜粋します。
サブプライムショック(2007年8月)やリーマンショック(2008年10月)などのような大暴落局面では、全くといっていいほど無力で、そのために大変な痛手を被った個人投資家も続出しました。
そんなS式逆張りストラテジーの惨状をなんとかしようと、巷ではさまざまなチューニング方法が考案されました。
- 移動平均乖離率のパラメータを厳しくする
- シグナル数というフィルターを使って暴落局面だけ仕掛ける
多くのシステムトレーダーが使っていたこのようなチューニング方法は、逆張りストラテジーが抱えている本質的な問題点を踏まえていない的外れな方法です。
移動平均乖離率のパラメータを厳しくする
移動平均乖離率のパラメータを厳しくするという方法は、誰もが真っ先に思いつくものではないでしょうか?
たとえば、25日移動平均乖離率のパラメータを「-20%以下」ではなくて、「-25%以下」とか「-30%以下」にする、というものです。
しかし、バックテストを実際にやってみればすぐ分かりますが、このチューニング方法を使っても、パフォーマンスは依然として芳しくありません。
シグナル数というフィルターを使って暴落局面だけ仕掛ける
ここでいう「シグナル数」とは、「移動平均乖離率に関する条件を満たす銘柄数」という意味です。
- 「25日移動平均乖離率が-20%以下」
- 「5日移動平均乖離率が-10%以下」
という2つの条件を両方満たす銘柄数を数えて、その数によって相場判定フィルターにするという方法です。
- 「シグナル数が30個以上のときだけ仕掛ける」 : 固定的なフィルター
- 「シグナル数が過去90日間平均の3倍以上のときだけ仕掛ける」 : 動的なフィルター
このシグナル数というフィルターを使う方法も、斉藤氏が提唱していました。
しかし、この方法を使っても、リーマンショックのような大暴落局面ではあえなく撃沈してしまいます。
さらに、このシグナル数というフィルターを使い過ぎると、上昇局面でトレードが極端に少なくなるために、楽に稼げるはずの利益を犠牲にするという問題点があることも見逃せません。
楽に稼げる上昇局面でトレードが少なくなって、リーマンショックのような暴落では撃沈する・・・
斉藤式逆張りストラテジーでシグナル数フィルターを使うと、このような理不尽なことも起こり得るのです。
まとめ
中村氏が上記をどのように解決したのか気になりますが、2018年の記事内で斎藤氏が利用している仕組みは未だに「動的フィルタ」でした。
なお、最近では暴落時の対策は色々なサイトに書かれています。
- シグナル数が○日平均の△倍以上になったら<<買わない>>
- VIX指数(恐怖指数)が一定以上になったら買わない
- トレード期間を短期間にする
- 分割突入(一気に資金を入れず少しずつ入れる)
検討余地はありそうです。
[追伸]バックテスト結果(保有期間5日の場合)
最近のトレンドに合わせて保有期間を短くしてみました。
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 |
株価データ: 日足 銘柄リスト: 全銘柄 1998/01/05~2020/07/10における成績です。 ---------------------------------------- 全トレード数 1116 勝ちトレード数(勝率) 651(58.33%) 負けトレード数(負率) 465(41.67%) 全トレード平均利率 4.65% 勝ちトレード平均利率 14.22% 負けトレード平均損率 -8.75% 勝ちトレード最大利率 100.00% 負けトレード最大損率 -50.00% 全トレード平均期間 5.21 勝ちトレード平均期間 4.60 負けトレード平均期間 6.05 ---------------------------------------- 必要資金 ¥2,898,200 最大ポジション(簿価) ¥3,485,400 最大ポジション(時価) ¥7,249,800 純利益 ¥13,131,220 勝ちトレード総利益 ¥24,184,500 負けトレード総損失 -¥11,053,280 全トレード平均利益 ¥11,766 勝ちトレード平均利益 ¥37,150 負けトレード平均損失 -¥23,770 勝ちトレード最大利益 ¥295,200 負けトレード最大損失 -¥295,200 プロフィットファクター 2.19 最大ドローダウン(簿価) -¥789,800 最大ドローダウン(時価) -¥4,643,500 ---------------------------------------- 現在進行中のトレード数 2 ---------------------------------------- 平均年利 21.58% 平均年利(直近5年) -0.44% 最大連勝 10回 最大連敗 6回 ---------------------------------------- [年度別レポート] 年度 取引回数 運用損益 年利 勝率 PF 最大DD 2020年 41回 -¥39,045円 -1.35% 46.34% 0.93倍 -27.59% 2019年 7回 ¥28,500円 0.98% 42.86% 1.34倍 -14.13% 2018年 99回 -¥402,895円 -13.90% 44.44% 0.64倍 -26.52% 2017年 35回 ¥259,700円 8.96% 57.14% 2.26倍 -13.58% 2016年 23回 ¥89,300円 3.08% 56.52% 1.48倍 -11.24% 2015年 47回 ¥328,658円 11.34% 55.32% 1.88倍 -19.57% 2014年 58回 ¥882,540円 30.45% 74.14% 3.83倍 -22.28% 2013年 67回 ¥1,238,060円 42.72% 71.64% 4.27倍 -21.43% 2012年 45回 ¥1,159,800円 40.02% 71.11% 2.99倍 -50.00% 2011年 46回 ¥437,000円 15.08% 58.70% 1.91倍 -33.33% 2010年 39回 ¥112,706円 3.89% 46.15% 1.19倍 -29.77% 2009年 65回 ¥223,100円 7.70% 55.38% 1.23倍 -37.37% 2008年 73回 ¥332,000円 11.46% 54.79% 1.23倍 -46.80% 2007年 63回 -¥173,800円 -6.00% 42.86% 0.80倍 -35.81% 2006年 87回 ¥1,176,200円 40.58% 70.11% 2.33倍 -34.46% 2005年 42回 ¥670,700円 23.14% 69.05% 2.59倍 -41.32% 2004年 53回 ¥1,245,400円 42.97% 81.13% 6.70倍 -20.22% 2003年 48回 ¥1,521,600円 52.50% 70.83% 6.59倍 -19.88% 2002年 81回 ¥1,244,100円 42.93% 60.49% 2.59倍 -21.20% 2001年 73回 ¥2,032,800円 70.14% 71.23% 7.89倍 -13.79% 2000年 24回 ¥764,800円 26.39% 79.17% 20.12倍 -4.72% |
利益曲線は次の通り。