コロナ感染したため、すぐにコロナ予防接種を受けることが出来ず、今月に入りようやく一回目の摂取を行った。
ご多分に漏れずワクチンの副反応により微熱が出て、左肩が上がらず、倦怠感に苛まれた。
コロナに感染した方が楽だったわww
システムトレードの事を微塵も思い出さなくなっていたが、釣りも全く興味が無くなってきた。
近辺では夜釣りでしか釣果が上がってない。
毎日、週末の睡眠と夕食とお風呂を楽しみにしている私としては夜を潰してまで、ダイオキシン+ゲオスミン臭まみれな魚を捕まえたいとは思わない。
仕事量も3倍に増えたしね……。
株取引の完全自動化に向けて重い腰を上げて少しでも進めないといけない。
実はProtraの呼び出しライブラリを修正したことで、複数のストラテジーの呼び出しが出来なくなっていた。
今回は、それを修正しておいた。
ストラテジーの合体手法のおさらい
勝率やプロフィットファクターに応じて、ストラテジーには優先度がつけたくなるもの。
ようするに、
優先度の高いストラテジーのシグナルを優先して購入する
多くの人は複数のストラテジーをバラバラに走らせていると思うけど資金には限界がある訳で、購入できる範囲で買った時のバックテストをやるためには必須の考え方だと思ってる。
利用したストラテジー
今回はあくまで実装変更が目的なので、ストラテジーは有名な「斉藤正章氏の手法」と「三点チャージ法」を組み合わせた。
斉藤正章氏の手法は次のとおり。
【買い】
- 1) 25日間移動平均との乖離率が-25%を下回った。
- 2) 5日間移動平均との乖離率が-10%を下回った。
- 3) 急落している銘柄数が、過去100営業日の平均と比べて7倍以上
【売り】
- 1) 買値の10%を上回った
- 2) 4営業日経過
3点チャージ法は次のとおり。
【買い】
- 1) 移動平均線の乖離率(26日)の乖離率が-15%以下
- 2) VR(25日)が70%以下
- 3) RSI(14日)が25%以下
【売り】
- 1) 買値の10%を上回った
- 2) 2営業日経過 or 買値5%を下回った
バックテスト結果
全銘柄の実行で1時間15分。
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 |
株価データ: 日足 銘柄リスト: 全銘柄 2000/01/06~2021/10/15における成績です。 ---------------------------------------- 全トレード数 7222 勝ちトレード数(勝率) 3570(49.43%) 負けトレード数(負率) 3652(50.57%) 全トレード平均利率 0.67% 勝ちトレード平均利率 5.70% 負けトレード平均損率 -4.24% 勝ちトレード最大利率 67.58% 負けトレード最大損率 -38.59% 全トレード平均期間 2.99 勝ちトレード平均期間 3.02 負けトレード平均期間 2.96 ---------------------------------------- 必要資金 ¥2,908,600 最大ポジション(簿価) ¥3,000,000 最大ポジション(時価) ¥3,580,300 純利益 ¥21,924,810 勝ちトレード総利益 ¥90,003,680 負けトレード総損失 -¥68,078,870 全トレード平均利益 ¥3,036 勝ちトレード平均利益 ¥25,211 負けトレード平均損失 -¥18,642 勝ちトレード最大利益 ¥319,800 負けトレード最大損失 -¥184,000 プロフィットファクター 1.32 最大ドローダウン(簿価) -¥1,504,460 最大ドローダウン(時価) -¥1,665,670 ---------------------------------------- 現在進行中のトレード数 4 ---------------------------------------- 平均年利 34.26% 平均年利(直近5年) 19.18% 最大連勝 10回 最大連敗 10回 ---------------------------------------- [年度別レポート] 年度 取引回数 運用損益 年利 勝率 PF 最大DD 2021年 286回 ¥582,181円 20.02% 46.85% 1.30倍 -14.24% 2020年 392回 ¥329,637円 11.33% 52.55% 1.08倍 -22.73% 2019年 366回 ¥1,250,383円 42.99% 54.64% 1.61倍 -12.29% 2018年 486回 -¥259,132円 -8.91% 50.62% 0.94倍 -32.47% 2017年 293回 ¥885,920円 30.46% 52.56% 1.53倍 -13.03% 2016年 341回 ¥853,068円 29.33% 50.73% 1.32倍 -13.76% 2015年 327回 ¥125,864円 4.33% 49.24% 1.04倍 -23.71% 2014年 321回 ¥1,097,830円 37.74% 51.40% 1.40倍 -20.25% 2013年 254回 ¥834,900円 28.70% 51.18% 1.33倍 -23.47% 2012年 266回 ¥795,400円 27.35% 54.14% 1.36倍 -14.72% 2011年 247回 ¥1,227,600円 42.21% 55.06% 1.50倍 -38.59% 2010年 274回 ¥1,339,120円 46.04% 59.49% 1.61倍 -14.42% 2009年 264回 ¥1,445,620円 49.70% 57.58% 1.53倍 -29.35% 2008年 466回 ¥996,705円 34.27% 47.64% 1.16倍 -25.97% 2007年 462回 -¥760円 -0.03% 46.97% 1.00倍 -22.27% 2006年 377回 ¥660,900円 22.72% 51.46% 1.15倍 -22.85% 2005年 247回 ¥2,110,870円 72.57% 53.85% 2.14倍 -18.52% 2004年 280回 ¥1,013,700円 34.85% 53.57% 1.34倍 -22.92% 2003年 242回 ¥1,964,800円 67.55% 59.50% 2.07倍 -21.74% 2002年 312回 ¥1,282,200円 44.08% 53.85% 1.40倍 -23.08% 2001年 354回 ¥1,003,200円 34.49% 53.95% 1.27倍 -29.23% 2000年 365回 ¥2,384,800円 81.99% 52.88% 1.56倍 -24.53% |
利益曲線は次のとおり。
うん。
ちゃんと動いている。
まとめ
稼働するようになったので、毎日自動的に起動させシグナルをメールで送るようにスケジュール登録しておいた。
本業で自動化ばかりやっているせいか、趣味で自動化やるのが面倒なんだよね。
さてさて。
ソースコード
バックテストには無料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 251 252 253 254 255 256 257 258 259 260 261 262 263 264 |
# loop-type: date-only //============================== require "TIlib" require "Utility" require "TrendCheck" //============================== // 斎藤氏の手法 → 3点チャージ法 の順で購入 //============================== // 1) 株価の高い場合はランキングしない[200]円以下 // 2) 売買代金の少ない場合はランキングしない(売買代金の[3]日間平均が[1]千万円以下の場合) // // 斉藤正章氏の手法 // 【買い】 // 1) 25日間移動平均との乖離率が-25%を下回った。 // 2) 5日間移動平均との乖離率が-10%を下回った。 // 3) 急落している銘柄数が、過去100営業日の平均と比べて7倍以上 // 【売り】 // 1) 買値の10%を上回った // 2) 4営業日経過 // // 3点チャージ法 // 【買い】 // 1) 移動平均線の乖離率(26日)の乖離率が-15%以下 // 2) VR(25日)が70%以下 // 3) RSI(14日)が25%以下 // 【売り】 // 1) 買値の10%を上回った // 2) 2営業日経過 or 買値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 = 3 // 最大保有日数 $shortSelling = 0 // 空売り戦略 Yes(1)/No(0) $Interest = 1 // 無制限(0) / 単利(1) / 複利(2) $reverse = 0 // 購入順序 昇順(0) / 降順(1) $udcount = 0 // 騰落レシオ利用数 Init() //------------------------------------------------ // 斎藤氏の手法 $MA5 = [$code_num] $MA25 = [$code_num] // 3点チャージ法 $VR = [$code_num] $Diff = [$code_num] $RSI = [$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 ! ($MA5[i] && $MA25[i]) // 斎藤氏 $MA5[i] = MA_new(5) $MA25[i] = MA_new(25) // 3点チャージ法 $Diff[i] = DiffMA_new(26) $VR[i] = VR_new(25, 0) $RSI[i] = RSI_new(14, 0) // グローバル変数を初期化 $hold[i] = 0 return end // 斉藤正章氏の指標の計算を1日進める MA_next($MA5[i]) MA_next($MA25[i]) // 3点チャージの指標の計算を1日進める DiffMA_next($Diff[i]) VR_next($VR[i]) RSI_next($RSI[i]) // ここまで ======================================== //================================================== // 保有してない→購入 //================================================== if ! ($hold[i]) // 1) 株価の高い場合はランキングしない[200]円以下 // 2) 売買代金の少ない場合はランキングしない(売買代金の[3]日間平均が[1]千万円以下の場合) if ! ({-1}Close && Close && {-2}Close && {-3}Close) return end if ! (Volume && {-1}Volume && {-2}Volume) return end if ! (SalesValue()/3 + {-1}SalesValue()/3 + {-2}SalesValue()/3 > 50000 && Close > 50) return end // 斉藤正章氏の手法 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 // 3点チャージ法 diff = DiffMA_value($Diff[i]) vr = VR_value($VR[i]) rsi = RSI_value($RSI[i]) if ! (diff && vr && rsi && Close) return end // 購入ロジック saito = r25 <= -25 && r5 <= -10 chage3 = diff <= -15 && vr <= 70 && rsi <= 25 if (saito) PrintLog("斉藤正章氏の手法") $buyflag[i][0] = 1 // 購入フラグ $buyflag[i][1] = r25 // 好きなパラメータをもとにソート $buyflag[i][2] = $buyflag[i][0] // 呪文(複数ロジック用) $buyCnt = $buyCnt + 1 elsif (chage3) PrintLog("3点チャージ法") $buyflag[i][0] = 2 // 購入フラグ $buyflag[i][1] = diff // 好きなパラメータをもとにソート $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) 利食い if ($buyflag[i][2] == 1 && (Close >= 1.10 * $buy[i])) PrintLog("斉藤正章氏_利食い") $sellflag[i] = 1 $set[i] = 0 elsif ($buyflag[i][2] == 2 && (Close >= 1.10 * $buy[i])) PrintLog("3点チャージ_利食い") $sellflag[i] = 1 $set[i] = 0 // 2) 損切り elsif ($buyflag[i][2] == 1 && ($set[i] >= 4)) PrintLog("斉藤正章氏_損切り") $sellflag[i] = 1 $set[i] = 0 elsif ($buyflag[i][2] == 2 && (Close <= 0.95 * $buy[i] || $set[i] >= 2)) PrintLog("3点チャージ_損切り") $sellflag[i] = 1 $set[i] = 0 end end 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 //==================== // 買い処理 //==================== def SortBuy() if ! (HasPricedata(Close)) return end $long = 0 $long = Num($buyUnit, Close) codeset = $order[(int)Code] Buying(codeset) end //==================== // 銘柄コードを変えながらMain関数,BuySell関数を実行 //==================== Print("-------------------------------------------------") Print("日付 = "+ Year + "/" + Month + "/" + Day) $buyCnt = 0 // 購入数初期化 i = 0 while (i < $code_num) {codes[i]}Main(i) i = i + 1 end // ストラテジーによって買いの優先度を変える if ($buyCnt) // 斉藤正章氏の手法 sg = SignalCount(100) // 突入タイミング 過去100日平均サイン点灯数の7倍以上 Print("過去100日平均サイン点灯数 =" + sg + " $sflag=" + $sflag) // 第二引数と同じ$buyflag[i][0]をSortする sortList = SelectionSort(10, 1) cnt = 0 while (cnt < $buyCnt) // 購入の場合$buyflag[i][0]は0以外 Print(sortList[cnt]) if ! (sortList[cnt]) break end cnt = cnt + 1 end if (cnt > sg * 7) i = 0 while i < cnt {sortList[i]}SortBuy() i = i + 1 end end // 3点チャージ法 // 第二引数と同じ$buyflag[i][0]をSortする sortList = SelectionSort(10, 2) cnt = 0 while (cnt < $buyCnt) // 購入の場合$buyflag[i][0]は0以外 if ! (sortList[cnt]) break end cnt = cnt + 1 end i = 0 while i < cnt {sortList[i]}SortBuy() i = i + 1 end end //---------------------------------------------- i = 0 while i < $code_num {codes[i]}Sell_(i) i = i + 1 end |