システムトレードなんて実は単にコンピューター化した事によってあたかも科学的手法のように見せかけてるだけで、原理的には古い罫線屋の手法と同じで過去の値動きによって売買判断を行っているだけです。
考えても見てください。
もし本当にシステムトレードで儲かるものなら世界中の富はそのシステム運用者に集まる事になる筈です。
それなのに未だかってシステムトレードで巨万の富を築いた人は誰もいません。
何故システムトレードで大儲けしたと吹聴するカリスマトレーダーがその儲かるシステムを一生懸命販売するのですか?
何故、一生懸命、システムトレードの方法を本に書いて売るのですか?
何故、相場から撤退して他のビジネスなんてやり始めるのですか?
答えは簡単ですよねw
システムトレードでは根本的に儲からない事を運用者自身が知ってしまったからなのです。
「システムトレードが儲かるなんて、貴方はまだ本気で思っているのですか?」より
駄目じゃん。
前回ソートを改善するにあたり独自ライブラリを作り変えた。
動作検証をするために、いつもの「3点チャージ投資法」……
では面白くないので「3点チャージ投資法」の「売り戦略」のバックテストをやってみる。
「くろけん株ブログ – 裁量とシステムトレード日記」に2018年頃まではイザナミで行ったストラテジーが公開されていた。
よくある系のイザナミのアフィリエイトサイトだが現在は閉鎖。儲からないんだろうね。
URLをメモっておいたのでアーカイブから掘り出してみた。
URLって住所みたいなものだ。
住所さえ知っていれば先祖調査と同じく、既に存在してなくても当時の情報を見つけ出すことができる。ロマンだね。
3点チャージ投資法「売り戦略」の有効性検証
「3点チャージ投資法」は学生時代から取り組んで調査してたので、まるで青春の一部のような懐かしささえ感じる。
でも「売り戦略」は全く知らなかった。
【買い条件】
- 1) 当日:[RSI(14)]が[75]より[大きい]
- 2) 当日:[移動平均乖離率(15)]が[18]より[大きい]
- 3) 当日:[VRI(25)]が[150]より[大きい]
- 4) [当日引け]で[売り]を仕掛ける
【手仕舞い条件】
- 1) 当日:[RSI(14)]が[60]より[小さい]
- 1.1) [当日引け]で手仕舞いする
- 2) 当日:[移動平均乖離率(15)]が[6]より[小さい]
- 2.1) [当日引け]で手仕舞いする
この手法は「当日引け」となっている。
実用で使うには当日のデータを入手し、かつバックテストを実施する必要があり現実的ではない。
バックテスト結果
借貸銘柄(一部、二部)を使って、バックテスト時間は26分。シンプルだ。
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/11~2021/04/26における成績です。 ---------------------------------------- 全トレード数 361 勝ちトレード数(勝率) 266(73.68%) 負けトレード数(負率) 95(26.32%) 全トレード平均利率 2.54% 勝ちトレード平均利率 9.82% 負けトレード平均損率 -17.84% 勝ちトレード最大利率 46.15% 負けトレード最大損率 -160.81% 全トレード平均期間 9.12 勝ちトレード平均期間 6.35 負けトレード平均期間 16.86 ---------------------------------------- 必要資金 ¥745,500 最大ポジション(簿価) ¥1,926,400 最大ポジション(時価) ¥2,334,000 純利益 ¥3,941,400 勝ちトレード総利益 ¥11,675,300 負けトレード総損失 -¥7,733,900 全トレード平均利益 ¥10,918 勝ちトレード平均利益 ¥43,892 負けトレード平均損失 -¥81,409 勝ちトレード最大利益 ¥228,000 負けトレード最大損失 -¥773,500 プロフィットファクター 1.51 最大ドローダウン(簿価) -¥1,539,800 最大ドローダウン(時価) -¥1,969,400 ---------------------------------------- 現在進行中のトレード数 1 ---------------------------------------- 平均年利 24.03% 平均年利(直近5年) 20.84% 最大連勝 14回 最大連敗 4回 ---------------------------------------- [年度別レポート] 年度 取引回数 運用損益 年利 勝率 PF 最大DD 2021年 9回 ¥73,700円 9.89% 55.56% 1.70倍 -17.15% 2020年 14回 ¥98,100円 13.16% 71.43% 1.21倍 -91.23% 2019年 13回 ¥194,400円 26.08% 69.23% 2.13倍 -13.14% 2018年 16回 ¥275,100円 36.90% 62.50% 2.96倍 -10.53% 2017年 16回 ¥135,400円 18.16% 68.75% 1.59倍 -17.38% 2016年 16回 ¥397,100円 53.27% 81.25% 2.30倍 -32.13% 2015年 24回 ¥395,400円 53.04% 75.00% 2.17倍 -31.29% 2014年 18回 ¥382,500円 51.31% 88.89% 1.71倍 -84.39% 2013年 15回 -¥999,800円 -134.11% 46.67% 0.18倍 -160.81% 2012年 17回 ¥78,600円 10.54% 76.47% 1.27倍 -25.36% 2011年 14回 ¥228,800円 30.69% 71.43% 2.32倍 -17.67% 2010年 18回 ¥480,900円 64.51% 77.78% 2.52倍 -31.87% 2009年 10回 ¥449,800円 60.34% 90.00% 10.18倍 -9.86% 2008年 10回 ¥482,900円 64.78% 90.00% 11.78倍 -9.03% 2007年 16回 -¥52,000円 -6.98% 68.75% 0.87倍 -44.59% 2006年 13回 ¥58,600円 7.86% 61.54% 1.35倍 -13.33% 2005年 29回 -¥660,900円 -88.65% 65.52% 0.47倍 -156.06% 2004年 29回 -¥643,500円 -86.32% 65.52% 0.47倍 -96.00% 2003年 16回 ¥363,100円 48.71% 81.25% 3.27倍 -20.53% 2002年 23回 ¥1,083,900円 145.39% 91.30% 38.77倍 -4.96% 2001年 15回 ¥686,300円 92.06% 93.33% 17.34倍 -8.57% 2000年 10回 ¥433,000円 58.08% 90.00% 6.70倍 -18.81% |
利益曲線は次の通り。
「くろけん株ブログ」には次のように書かれており、何となく似た結果になった。
総取引回数:470回
平均保有期間:8.24日
勝率:75.74%
平均利益:8.74%
平均損失:13.00%
期待値:+3.47%
そして検証期間が「2006年〜2016年」になっているので、丁度うまく行っていた期間だね。
実は、この手法は数年前にバックテストをして「くろけん株ブログ」のような結果にならずにお蔵入りにしていたものだ。
これ……借貸銘柄を東証一部にすると
次のようにボロボロになる。
1 2 3 4 5 6 |
全トレード数 3067 勝ちトレード数(勝率) 1968(64.17%) 負けトレード数(負率) 1099(35.83%) 全トレード平均利率 -0.23% 勝ちトレード平均利率 7.23% プロフィットファクター 0.94 |
そして東証一部/二部を合わせると、東証一部の結果に引っ張られ これまたボロボロの結果となる。
1 2 3 4 5 6 |
全トレード数 3428 勝ちトレード数(勝率) 2234(65.17%) 負けトレード数(負率) 1194(34.83%) 全トレード平均利率 0.07% 勝ちトレード平均利率 7.54% プロフィットファクター 1.00 |
東証二部だけしか有効じゃないストラテジーって……偶然でしょ……。
よい部分だけ見せるのは、アフィリエイターの特徴。
なお、元のサイトには次のようにも書いてある。
高値空間の売り戦略には、注意点があります。
それは、短期的に急騰を続けている銘柄は売り禁になりやすいことです。
相場が過熱してきて空売り注文が入り株不足になると、株を貸せなくなり売り禁になってしまうことがあります。
売り禁になると、せっかくイザナミで売りシグナルが出ても空売り注文を入れることが出来ません。
何だよ、「当日引け」といい全く役に立たねストラテジーじゃん!
まとめ
再現できずにお蔵入りにしていたけど、東証二部だけに絞ると取引回数も勝率もグラフも似た形となった。
そんな事には気づかないわ。
めでたしめでたし……。
って、全然使える手法じゃねーじゃねーか!!
まっ、今回は独自ライブラリ(選択ソート)の動作検証が目的のバックテストということで。
ソースコード
バックテストには無料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 |
# loop-type: date-only //============================== require "TIlib" require "Utility" require "TrendCheck" // ====================================== // 3点チャージ投資法「売り戦略」 // ====================================== // //【買い条件】 //1) 当日:[RSI(14)]が[75]より[大きい] //2) 当日:[移動平均乖離率(15)]が[18]より[大きい] //3) 当日:[VRI(25)]が[150]より[大きい] //4) [当日引け]で[売り]を仕掛ける // //【手仕舞い条件】 //1) 当日:[RSI(14)]が[60]より[小さい] //1.1) [当日引け]で手仕舞いする //2) 当日:[移動平均乖離率(15)]が[6]より[小さい] //2.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 = 1 // 空売り戦略 Yes(1)/No(0) $Interest = 1 // 無制限(0) / 単利(1) / 複利(2) $reverse = 0 // 購入順序 昇順(0) / 降順(1) $udcount = 0 // 騰落レシオ利用数 Init() //------------------------------------------------ $MA = [$code_num] $VR = [$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 ! ($MA[i] && $VR[i] && $RSI[i]) //Tilibのオブジェクト生成 $MA[i] = MA_new(15) $VR[i] = VR_new(25,0) $RSI[i] = RSI_new(14,0) //銘柄ごとのグローバル変数を初期化する $hold[i] = 0 return end //指標の計算を1日進める MA_next($MA[i]) VR_next($VR[i]) RSI_next($RSI[i]) //================================================== // 保有してない→購入 //================================================== if (! $hold[i]) if ! (Close && $MA[i] && $VR[i] && $RSI[i]) return end ma = MA_value($MA[i]) vr = VR_value($VR[i]) rsi = RSI_value($RSI[i]) if ! (ma && vr && rsi) return end // 移動平均乖離率を計算する r = 100 * (Close - ma) / ma //================================================== // 売買(買い) //================================================== // 1) 当日:[RSI(14)]が[75]より[大きい] flag1 = rsi > 75 // 2) 当日:[移動平均乖離率(15)]が[18]より[大きい] flag2 = r > 18 // 3) 当日:[VRI(25)]が[150]より[大きい] flag3 = vr > 150 if (flag1 && flag2 && flag3) $buyflag[i][0] = 1 $buyflag[i][1] = r $buyflag[i][2] = 1 $buyCnt = $buyCnt + 1 end //================================================== // 保有している→売却 //================================================== elsif ($hold[i]) rsi = RSI_value($RSI[i]) ma = MA_value($MA[i]) if ! (ma && rsi) return end // 移動平均乖離率を計算する r = 100 * (Close - ma) / ma if ($set[i] < 1) $set[i] = 1 return end $set[i] = $set[i] + 1 //================================================== // 売買(売り) //================================================== // 1) 当日:[RSI(14)]が[60]より[小さい] // 2) 当日:[移動平均乖離率(15)]が[6]より[小さい] if (60 > rsi) PrintLog("売り1") $sellflag[i] = 1 $set[i] = 0 elsif (6 > r) PrintLog("売り2") $sellflag[i] = 1 $set[i] = 0 end end end //================================================== // 翌日逆指値チェック //================================================== def CheckHighLow2(t) if ! ({1}High > t && t > {1}Low) return 0 end if ({1}Open > t) return {1}Open else return t end end //================================================== // 買い //================================================== def Buying2(i) BuyingLimitedPrice(i, 1, Close) end //==================== // 買い処理([当日引け]で[売り]を仕掛ける) //==================== def SortBuy() PrintLog("購入予定") if ! (HasPricedata(Close)) return end $long = 0 $long = Num($buyUnit, Close) codeset = $order[(int)Code] Buying2(codeset) end //==================== // 売り処理( [当日引け]で手仕舞いする) //==================== def Sell_(i) if (HasPricedata(Close)) if ($sellflag[i]) SellingLimitedPrice(i, 0, Close) $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 // 購入数初期化 i = -1 while (i + 1 < $code_num) i = i + 1 {codes[i]}Main(i) end i = 0 if ($buyCnt) sortList = SelectionSort($buyCnt, 0) while i < $buyCnt {sortList[i]}SortBuy() i = i + 1 end end //---------------------------------------------- i = -1 while (i + 1 < $code_num) i = i + 1 {codes[i]}Sell_(i) end |