私のブログではシステムトレードのバックテストを定期的に公開している。
ヘッジファンドに勤務しているプロのシステムトレーダーとも交流があるが、駄犬氏やUKI氏のツイートにより私のサイトを見に来た事があるらしい。
つまり、私のサイトの記事に対するアクセス数で日本中のシステムトレーダーの母数が大体分かる。
日本上にシステムトレーダーは何人いると思ってるの?……
1万5000人
約1万人だよ。UKI氏のツイッターがフォロワーが2万人程度だから、どんなに多くても3万人はいないね。
そんな小さな母集団向けに新規ツールは愚か、書籍だって新規販売されないっしょww
と思ったら、korosuke氏が執筆した次の書籍が昨年販売されていた。
korosuke氏は(株)テラスの開発者で、Yahooファイナンス投資の達人などでコラムを執筆しながら、現在はnoteや、メルマガ「~相場の流れを読み解く!日経チャート解析~」などで記事を執筆。システムトレードのセミナーも多数開催……してるらしい。
目次
- 第1章 相場とトレード
- 第2章 なぜ、暴落を狙うのか?
- 第3章 システムトレードについて
- 第4章 基本売買ルールの構築
- 第5章 浅い下げを狙った買い戦略
- 第6章 深い下げを狙った買い戦略
- 第7章 マルチストラテジーについて
- 第8章 フォワードテストとまとめ
- 特別付録 銘柄検索までの流れ
Google ブックスで少し読める。ストラテジーも見ることができたのでバックテストしてみた。
深い下げを狙った買い戦略「売買ルール6」
他の書籍を読んだ経験上「章の最後のストラテジーが最も優秀に違いない」という推測のもと、6章の最後のストラテジーを紹介する。
【基本条件】
- 1) 初期費用 300万円
- 2) 単利運用
- 3) デイトレード
- 4) 現物取引:1銘柄当たり仕掛け金額50万円
- 5) 買い
- 売買対象:東証一部、東証二部、大証、JASDAQ、マザーズ、ヘラクレス
【仕掛け&決済(条件含む)】
- 1) 終値が100円以上
- 2) 20日平均売買代金 20億以上
- 3) 前日比ギャップ率が-6%より小さい銘柄数が700個以上(※銘柄数の対象は、東証一部、東証二部、大証、JASDAQ、マザーズ、ヘラクレス)
- 4) 仕掛け:「3)」の条件を満たしたら、該当銘柄(①~②を満たす銘柄)を、当日終値0%で、翌日、指値注文
- 5) 返済:(約定した)当日引け成り注文
【仕掛けの優先順位】
- 1) 5日移動平均線乖離率 昇順
ここで、
暴落を数値化するための方法として騰落レシオを使いましたが、それ以外の方法でも暴落を数値化することで、より良い戦略を考えてみたいと思います。
との事で「当日ギャップ率」という指標が書かれています。
当日ギャップ率(騰落率)=(当日終値÷前日終値ー1)×100
バックテスト結果
バックテスト時間は全銘柄で1時間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 |
株価データ: 日足 銘柄リスト: 全銘柄 2001/09/13~2020/03/16における成績です。 ---------------------------------------- 全トレード数 59 勝ちトレード数(勝率) 50(84.75%) 負けトレード数(負率) 9(15.25%) 全トレード平均利率 2.81% 勝ちトレード平均利率 3.82% 負けトレード平均損率 -2.78% 勝ちトレード最大利率 19.05% 負けトレード最大損率 -6.67% 全トレード平均期間 1.31 勝ちトレード平均期間 1.36 負けトレード平均期間 1.00 ---------------------------------------- 必要資金 ¥2,687,980 最大ポジション(簿価) ¥2,805,460 最大ポジション(時価) ¥2,967,750 純利益 ¥750,110 勝ちトレード総利益 ¥861,490 負けトレード総損失 -¥111,380 全トレード平均利益 ¥12,714 勝ちトレード平均利益 ¥17,230 負けトレード平均損失 -¥12,376 勝ちトレード最大利益 ¥94,000 負けトレード最大損失 -¥24,900 プロフィットファクター 7.73 最大ドローダウン(簿価) -¥90,020 最大ドローダウン(時価) -¥90,020 ---------------------------------------- 現在進行中のトレード数 0 ---------------------------------------- 平均年利 3.49% 平均年利(直近5年) 3.24% 最大連勝 21回 最大連敗 3回 ---------------------------------------- [年度別レポート] 年度 取引回数 運用損益 年利 勝率 PF 最大DD 2020年 13回 ¥211,300円 7.86% 100.00% ∞倍 0.00% 2018年 1回 ¥3,200円 0.12% 100.00% ∞倍 0.00% 2015年 6回 -¥4,210円 -0.16% 50.00% 0.65倍 -1.03% 2013年 6回 ¥38,630円 1.44% 100.00% ∞倍 0.00% 2008年 17回 ¥185,890円 6.92% 64.71% 2.87倍 -6.67% 2006年 9回 ¥217,300円 8.08% 100.00% ∞倍 0.00% 2004年 4回 ¥45,400円 1.69% 100.00% ∞倍 0.00% 2001年 3回 ¥52,600円 1.96% 100.00% ∞倍 0.00% |
利益曲線は次の通り。
結果を比較すると、大きく異なる。
トレード数は私の結果は半分程度だけど、勝率やPFは私の方が非常に高い。
とりあえず、もっとトレード数を増やして見ないと分からないや。
まとめ
ネタが既に尽きていたが、書籍を漁ったりブログ調査にやり1年間バックテストを紹介し続けることができた。
難易度の高いものから簡単なものまで様々に紹介してきたし、機械学習を使ってテクニカル指標だけでなくファンダメンタルズ指標を使った手法も紹介してきた。
バックテストばかりやっていてシステムトレードの自動化が全く進まなかったな……。
来年はちと考えよう……。
ソースコード
バックテストには無料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 |
# loop-type: date-only //============================== require "TIlib" require "Utility" require "TrendCheck" // ====================================== // 深い下げを狙った買い戦略「売買ルール6」 // ====================================== // // 【基本条件】 // 1) 初期費用 300万円 // 2) 単離運用 // 3) デイトレード // 4) 現物取引:1銘柄当たり仕掛け金額50万円 // 5) 買い // 売買対象:東証一部、東証二部、大証、JASDAQ、マザーズ、ヘラクレス // // 【仕掛け&決済(条件含む)】 // 1) 終値が100円以上 // 2) 20日平均売買代金 20億以上 // 3) 前日比ギャップ率が-6%より小さい銘柄数が700個以上(※銘柄数の対象は、東証一部、東証二部、大証、JASDAQ、マザーズ、ヘラクレス) // 4) 仕掛け:「3)」の条件を満たしたら、該当銘柄(①~②を満たす銘柄)を、当日終値0%で、翌日、指値注文 // 5) 返済:(約定した)当日引け成り注文 // // 【仕掛けの優先順位】 // 1) 5日移動平均線乖離率 昇順 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() //------------------------------------------------ $DiffMA = [$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 ! ($DiffMA[i]) // 銘柄ごとのグローバル変数を初期化する $DiffMA[i] = DiffMA_new(5) $hold[i] = 0 return end //指標の計算を1日進める DiffMA_next($DiffMA[i]) //================================================== // 保有してない→購入 //================================================== if (! $hold[i]) diffma = DiffMA_value($DiffMA[i]) if ! (diffma && Close && {-1}Close) return end //================================================== // 売買(買い) //================================================== // 1) 終値が100円以上 flag1 = Close >= 100 // 2) 20日平均売買代金 20億以上 tv = TradingValume(20) flag2 = tv >= 200000 // 前日比ギャップ率が-6%より小さい // 当日ギャップ率(騰落率)=(当日終値÷前日終値 - 1)×100 tmp = ((((float)Close / {-1}Close) - 1) * 100 < -6) $gap = $gap + tmp if (flag1 && flag2) // 当日終値0%で、翌日、指値注文 $buyflag[i][0] = Close * 1.00 $buyflag[i][1] = diffma $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 //================================================== // 売買(売り) //================================================== if ($set[i] >= $MaxHoldDay) PrintLog("利益確定") $sellflag[i] = 1 $set[i] = 0 end end end def CheckHighLow2(t) t = Yobine(t, 0) if ! ({1}High > t && t > {1}Low) return 0 end if (t > {1}Open) // if ({1}Open > t) return {1}Open end end //================================================== // 買い(当日終値0%で、翌日、指値注文) //================================================== def Buying2(i) if (HasPricedata(Close)) t = 0 if ($buyflag[i][0]) t = CheckHighLow2($buyflag[i][0]) end if (t) BuyingLimitedPrice(i, 1, t) end end end //==================== // 買い処理 //==================== def SortBuy() if ! (HasPricedata({1}Open)) return end $long = 0 $long = Num($buyUnit, Close) codeset = $order[(int)Code] Buying2(codeset) end //==================== // 売り処理(デイトレ模倣) //==================== def Sell_(i) if (HasPricedata(Open)) if ($sellflag[i]) if ({-1}Close) // [当日引け]で手仕舞いする SellingLimitedPrice(i, 0, {-1}Close) else PrintLog("売れない") end $sellflag[i] = 0 $buyflag[i][2] = 0 end // 使用した$buyflag 配列を初期化 if ($buyflag[i][0]) $buyflag[i][0] = 0 $buyflag[i][1] = 0 end end end //==================== // 銘柄コードを変えながらMain関数,BuySell関数を実行 //==================== Print("-------------------------------------------------") Print("日付 = "+ Year + "/" + Month + "/" + Day) $buyCnt = 0 // 購入数初期化 $gap = 0 // 前日比ギャップ率初期化 i = -1 while (i + 1 < $code_num) i = i + 1 {codes[i]}Main(i) end i = 0 // 3) 前日比ギャップ率が-6%より小さい銘柄数が700個以上 Print("前日比ギャップ率 = " + $gap) if ($gap >= 700 && $buyCnt) sortList = SelectionSort(10, 0) cnt = 10 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 |