高速取引の個人取引解禁に伴い、多くのシステムトレーダーが参戦しそうな勢いです。
今回は、スイングトレードではなくデイトレードをバックテストをしていきます。
また、高速アルゴだとスキャルピングがメインだと思いますが。
Protraは同日売買ができないという致命的な制約があるため、少し工夫が必要です。
徳山秀樹氏とは誰?
徳山秀樹氏は、1966年神奈川県生まれ。
約12年間のサラリーマン生活を経て、2001年に専業トレーダーとして独立。
約20年の株式投資経験とサラリーマン時代に培った管理手法をもとに 、株式投資の不確実性を極力排除して年間1000万円以上の収益を得ている。
その後、このデイトレード理論を、自動売買システムにして運用。
2006年頃は斎藤氏と並んで人気の高いシステムトレーダーで、16000円のセミナーを開けば常に満席でした。
徳山秀樹式デイトレード理論の有効性検証
【基本ルール】
- 東証一部上場銘柄
- 出来高が5万以上、20万未満で推移している銘柄
【買いルール】
- 朝9:10-9:20の時間帯で前日比-2%以下となった銘柄
【手仕舞いルール】
- 前日比+1%をメドに利益確定
- 当日終値
前提の考え方は次のとおり。
東証一部上場で出来高5-20万程度の地味な銘柄は株価を動かす材料に乏しい。
従ってこれらの銘柄が9:10-9:20の時間帯で前日比±2%以上の乖離を見せた場合、それは異常な値動きであり、自然と前日比0%を目指して収束していくはず
要するに、朝9:10-9:20の時間帯で前日比±2%以上となった場合、自立反発(+の場合は自立反落)を予測できるのでそれぞれ売り買いを立てる。
後は待っていれば自然と前日比0%を目指して収束していくので原則として買玉は前日比-1%、売玉は前日比+1%をメドに利益確定を図る。
徳山氏は、当時 Excelマクロと楽天RSSを利用して、対象銘柄に±2%以上の値動きが出たら自動的に売買注文を出すシステムを作っていたそうだ。
ソースコード
独自ライブラリの取り込みが必要です。
実装としては次のようになります。
※ 乖離率の計算も入ってますが使ってません(機械学習で有効な指標と判断されたので追加のフィルタ用に計算だけ行ってます)。
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 |
# loop-type: date-only //============================== require "TIlib" require "Utility" require "TrendCheck" //============================== // 徳山秀樹式デイトレード //============================== // // 下記のルールに従い5日移動平均乖離率の小さい順に銘柄を決める // // 【銘柄選定】 // 1) 東証1部 // 2) 出来高が5万以上、20万未満 // // 【買いルール】 // 3) 始値-2% // //【手仕舞いルール】 // 1) 利食い:+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() //------------------------------------------------ $DiffMA25 = [$code_num] $DiffMA5 = [$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 ! ($DiffMA25[i] && $DiffMA5[i]) //銘柄ごとのグローバル変数を初期化する $DiffMA25[i] = DiffMA_new(25) $DiffMA5[i] = DiffMA_new(5) $hold[i] = 0 return end //指標の計算を1日進める DiffMA_next($DiffMA25[i]) DiffMA_next($DiffMA5[i]) // ここまで ======================================== //================================================== // 保有してない→購入 //================================================== if ! ($hold[i]) diffma25 = DiffMA_value($DiffMA25[i]) diffma5 = DiffMA_value($DiffMA5[i]) if ! (diffma25 && diffma5 && {-1}Close && Close && {-2}Close && {-3}Close) return end if ! (Volume && {-10}Volume) return end // 1) 出来高が5万以上、20万未満で推移 flag1 = (Volume * 1000 >= 50000) && (200000 > Volume * 1000) flag2 = ({-10}Volume * 1000 >= 50000) && (200000 > {-10}Volume * 1000) if (flag1 && flag2) $buyflag[i][0] = 1 // 購入フラグ $buyflag[i][1] = diffma5 // 好きなパラメータをもとにソート $buyflag[i][2] = $buyflag[i][0] // 手法別に売りを変える場合 $buyCnt = $buyCnt + 1 end //================================================== // 保有している→売却 //================================================== elsif ($hold[i]) if $set[i] < 1 $set[i] = 1 return end $set[i] = $set[i] + 1 //================================================== // 売買(売り) //================================================== // 1) 利食い:含み益が10%を上回った if ($set[i] >= $MaxHoldDay) $sellflag[i] = 1 $set[i] = 0 end end end def CheckHighLow2(t) if (t > {1}Open) return {1}Open end end //================================================== // 買い(指値) //================================================== def Buying2(i) if (0 == PricedataExistCheck({1}Open)) if ($buyflag[i][0] == 1) // 10) [翌日指値(寄付)][終値(-2.00%)]で[買い]を仕掛ける t = CheckHighLow2(Close * 0.98) end if (t) PrintLog("徳山式 Close = " + Close) BuyingLimitedPrice(i, 1, t) end end end //==================== // 売り処理(デイトレ模倣) //==================== def Sell_(i) if ($sellflag[i]) if ({-1}High > (int)({-2}Close * 0.99)) // デイトレの日に高値が前日Closeを超えたら、Closeで売る SellingLimitedPrice(i, 0, (int)({-2}Close * 0.99)) else // 超えてなければ、その日のCloseで売る SellingLimitedPrice(i, 0, {-1}Close) end $sellflag[i] = 0 end // 使用した$buyflag 配列を初期化 if ($buyflag[i][0]) $buyflag[i][0] = 0 $buyflag[i][1] = 0 end end //==================== // 買い処理 //==================== def SortBuy(i) if (PricedataExistCheck(Close)) return end $long = 0 $long = Num($buyUnit, Close) codeset = $order[(int)Code] Buying2(codeset) 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 // ストラテジーによって買いの優先度を変える ---- if ($buyCnt) BuyLoop(1, 1, codes) end //---------------------------------------------- i = -1 while i + 1 < $code_num i = i + 1 {codes[i]}Sell_(i) end |
Protraで作成するには工夫が必要です。
当日の売り買いができないため、買いの日は正しいですが手仕舞いは、
当日の高値 > 前日の終値 × 0.99 (前日比+1%)
か確認した上で、手仕舞い可能であれば翌日以降に指定の額で手仕舞いしています。
また、朝9:10-9:20の時間帯での価格は無いので始値を使ってます。
バックテスト結果
デイトレのため、時価のDDは意味がありません。
実行時間は2時間程度です。
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 |
株価データ: 日足 銘柄リスト: 東証1部 1998/01/05~2020/08/21における成績です。 ---------------------------------------- 全トレード数 8970 勝ちトレード数(勝率) 6438(71.77%) 負けトレード数(負率) 2532(28.23%) 全トレード平均利率 0.24% 勝ちトレード平均利率 0.98% 負けトレード平均損率 -1.63% 勝ちトレード最大利率 2.04% 負けトレード最大損率 -15.52% 全トレード平均期間 1.50 勝ちトレード平均期間 1.50 負けトレード平均期間 1.48 ---------------------------------------- 必要資金 ¥2,021,900 最大ポジション(簿価) ¥2,996,400 最大ポジション(時価) ¥3,242,700 純利益 ¥9,418,729 勝ちトレード総利益 ¥26,713,400 負けトレード総損失 -¥17,294,670 全トレード平均利益 ¥1,050 勝ちトレード平均利益 ¥4,149 負けトレード平均損失 -¥6,830 勝ちトレード最大利益 ¥9,800 負けトレード最大損失 -¥59,100 プロフィットファクター 1.54 最大ドローダウン(簿価) -¥217,671 最大ドローダウン(時価) -¥270,700 ---------------------------------------- 現在進行中のトレード数 0 ---------------------------------------- 平均年利 22.18% 平均年利(直近5年) 13.29% 最大連勝 39回 最大連敗 36回 ---------------------------------------- [年度別レポート] 年度 取引回数 運用損益 年利 勝率 PF 最大DD 2020年 298回 ¥129,500円 6.40% 71.14% 1.18倍 -11.12% 2019年 340回 ¥316,500円 15.65% 70.00% 1.57倍 -11.24% 2018年 429回 ¥377,300円 18.66% 71.79% 1.48倍 -8.11% 2017年 296回 ¥205,200円 10.15% 74.32% 1.36倍 -8.21% 2016年 410回 ¥314,900円 15.57% 73.17% 1.36倍 -10.36% 2015年 382回 ¥337,900円 16.71% 72.77% 1.45倍 -7.83% 2014年 388回 ¥495,600円 24.51% 74.74% 1.73倍 -5.65% 2013年 426回 ¥356,300円 17.62% 76.29% 1.36倍 -9.89% 2012年 421回 ¥664,100円 32.85% 80.05% 2.01倍 -5.67% 2011年 391回 ¥251,200円 12.42% 73.66% 1.29倍 -15.52% 2010年 423回 ¥593,500円 29.35% 78.25% 1.92倍 -7.62% 2009年 458回 ¥237,229円 11.73% 75.55% 1.21倍 -10.31% 2008年 500回 ¥281,000円 13.90% 75.40% 1.22倍 -10.69% 2007年 468回 ¥292,200円 14.45% 73.08% 1.29倍 -7.75% 2006年 455回 ¥292,400円 14.46% 71.21% 1.29倍 -9.05% 2005年 390回 ¥783,400円 38.75% 79.23% 2.77倍 -9.09% 2004年 436回 ¥803,000円 39.72% 78.21% 2.38倍 -12.18% 2003年 484回 ¥441,800円 21.85% 76.24% 1.41倍 -9.28% 2002年 516回 ¥687,800円 34.02% 75.78% 1.74倍 -6.23% 2001年 519回 ¥699,800円 34.61% 76.30% 1.77倍 -9.33% 2000年 540回 ¥858,100円 42.44% 77.22% 2.02倍 -6.93% |
利益曲線は次のとおりです。
おお!キレイな単調増加!!
ただし、全トレード平均利率が低すぎて手数料負けしそうです。
またストラテジーが人気になった2006年以降は、年利が下がってます。
多くの人が真似をしてるのかな。関連ブログも未だに見つかるし。
なお、実運用では、東証一部上場から当日の-2%を抽出する必要があります。
【2021.05.08】不具合修正(寄りで買って指値売りに変更)
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部 1998/01/05~2021/04/26における成績です。 ---------------------------------------- 全トレード数 9824 勝ちトレード数(勝率) 5640(57.41%) 負けトレード数(負率) 4184(42.59%) 全トレード平均利率 0.50% 勝ちトレード平均利率 2.26% 負けトレード平均損率 -1.86% 勝ちトレード最大利率 18.23% 負けトレード最大損率 -22.35% 全トレード平均期間 1.50 勝ちトレード平均期間 1.52 負けトレード平均期間 1.47 ---------------------------------------- 必要資金 ¥2,772,900 最大ポジション(簿価) ¥2,995,000 最大ポジション(時価) ¥3,373,500 純利益 ¥20,630,120 勝ちトレード総利益 ¥52,544,140 負けトレード総損失 -¥31,914,020 全トレード平均利益 ¥2,100 勝ちトレード平均利益 ¥9,316 負けトレード平均損失 -¥7,628 勝ちトレード最大利益 ¥76,800 負けトレード最大損失 -¥95,000 プロフィットファクター 1.65 最大ドローダウン(簿価) -¥490,200 最大ドローダウン(時価) -¥490,200 ---------------------------------------- 現在進行中のトレード数 3 ---------------------------------------- 平均年利 33.82% 平均年利(直近5年) 13.59% 最大連勝 14回 最大連敗 11回 ---------------------------------------- [年度別レポート] 年度 取引回数 運用損益 年利 勝率 PF 最大DD 2021年 140回 ¥233,000円 8.40% 55.71% 1.60倍 -4.85% 2020年 464回 ¥491,400円 17.72% 56.03% 1.28倍 -11.83% 2019年 398回 ¥690,200円 24.89% 60.05% 1.56倍 -10.55% 2018年 498回 ¥74,400円 2.68% 58.03% 1.03倍 -14.23% 2017年 370回 ¥394,600円 14.23% 56.22% 1.33倍 -11.05% 2016年 446回 ¥50,100円 1.81% 55.38% 1.03倍 -14.79% 2015年 412回 ¥538,400円 19.42% 58.50% 1.39倍 -16.63% 2014年 416回 ¥1,035,900円 37.36% 65.38% 1.89倍 -12.28% 2013年 457回 ¥1,166,700円 42.08% 60.39% 1.76倍 -9.98% 2012年 418回 ¥677,400円 24.43% 62.44% 1.47倍 -12.20% 2011年 388回 ¥603,800円 21.78% 60.57% 1.46倍 -22.35% 2010年 417回 ¥919,000円 33.14% 64.03% 1.74倍 -9.47% 2009年 473回 ¥661,720円 23.86% 60.68% 1.37倍 -12.75% 2008年 517回 ¥866,300円 31.24% 55.90% 1.36倍 -10.93% 2007年 486回 ¥1,259,100円 45.41% 65.23% 1.82倍 -10.56% 2006年 478回 ¥1,325,700円 47.81% 64.44% 1.89倍 -14.22% 2005年 416回 ¥1,547,900円 55.82% 74.76% 3.33倍 -9.09% 2004年 470回 ¥1,861,500円 67.13% 72.13% 2.80倍 -10.64% 2003年 505回 ¥1,205,600円 43.48% 64.16% 1.76倍 -10.43% 2002年 533回 ¥1,748,700円 63.06% 65.10% 2.18倍 -7.19% 2001年 552回 ¥1,794,600円 64.72% 68.48% 2.20倍 -12.68% 2000年 570回 ¥1,484,100円 53.52% 64.91% 1.89倍 -11.20% |
利益曲線は次のようになります。
まとめ
昔、私も思いついていた手法ですが、既に先行者がいたようです。
当時は、バックテストする環境がありませんでした・・・・。
今回、有効な手法だと改めて分かりました。
実運用する際には、Protraは不要です。
Pythonだけでサクッと作れそうですね。
ただ、手数料負けしますね・・・・。
sbiの信用取引ならデイトレは手数料無料か、作ってみるかなぁ・・・。
加えて、斉藤正章氏と西村剛氏のラジオにて・・
デイトレ系のシステムトレード(利益の小さいトレード)は年々優位性が落ちてきているので、スイング系などの日をまたぐストラテジーにシフトした方がよい
確かに・・・・。
だんだんとデイトレは優位性が下がっているようなので注意だな・・・・。
追伸:空売りの場合
【基本ルール】
- 東証一部の貸借銘柄
- 出来高が5万以上、20万未満で推移している銘柄
【売りルール】
- 朝9:10-9:20で前日比+2%以上となった銘柄(始値が+2%以上の銘柄)
【手仕舞いルール】
- 前日比-1%以下をメドに利益確定(最安値が前日比-1%より小さいと利益確定)
全てを逆にするだけです。
結果は次のとおり。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
株価データ: 日足 銘柄リスト: 借貸(東一)20190805 1998/01/05~2020/08/24における成績です。 ---------------------------------------- 全トレード数 9799 勝ちトレード数(勝率) 6617(67.53%) 負けトレード数(負率) 3182(32.47%) 全トレード平均利率 -0.16% 勝ちトレード平均利率 0.94% 負けトレード平均損率 -2.46% プロフィットファクター 0.78 最大ドローダウン(簿価) -¥9,139,200 最大ドローダウン(時価) -¥9,138,200 ---------------------------------------- 現在進行中のトレード数 2 ---------------------------------------- 平均年利 -3.37% 平均年利(直近5年) -1.22% |
利益曲線は次のとおり。
徳山式では空売りも有効と書いてありますが、結果を見る限り勝てませんでした。