ゴールデンウィークが終わった……。
働きたくない。
働きたくない。
働きたくない。
木曜日・金曜日と出社だったけど……休んだ人は多かったよね。
トレーダーがトレーディングシステムを使う理由は次のとおり。
- さまざまなマーケットの同時/継続的な分析
- トレードのときの人間の感情の排
- バックテストやデータの検証ができること
システムトレーダーは数学的公式を使って市場のトレンド傾向が読み取れると信じている。
つまり正しいフィルタを使えば、音楽(トレンド)からノイズ(揉み合いの動き)を除去できると信じている。
文字に起こせば起こすほど、オカルトや宗教と同じじゃん……。
書籍「究極のトレーディングガイド」を読んでみた
上記の言葉は次の書籍の8章に載っていた。
究極のトレーディングガイド~全米一の投資システム分析家が明かす「儲かるシステム」 (ウィザードブックシ...
この書籍はAmazonのコメント欄を見ると大反響。
今度はじっくりと読むことになりますが、他の本の10倍以上の濃密さがあるようで、しばらくはこれだけに絞り込むことになるかも。
たとえば、第9章だけ(それは50ページ足らず)は、約2万円の某高額大型本と同等かそれ以上の価値があります。
システム取引やプログラムに詳しくなくとも、取引の手法などで学べる点も非常に多く、多くの投資家に役立つこと請け合いです。本書で紹介されているテクニックのいくつかを実践で活用するだけでも、本書の定価の100倍の価値は十分あります。
中身を読むと、私が長年ずっと試していることを凝縮したような内容だった。
まず興味が湧いたのは、「勝率」以外にも注目すべき項目として紹介されている要因。
要因 | 説明 | |
---|---|---|
最大ドローダウン | 資産が最大のときのとその後の最小のときの最大価格差 | |
最長フラット期間 | トレーディングシステムの利益が出ない期間 | |
平均ドローダウン | 年間を通してのドローダウンの数字。資産の少ないトレーダーは最大ドローダウンより重要 | |
損益レシオ | 負けトレード損失に対する勝ちトレードの利益の比率。勝率よりずっと重要 | |
平均損益 | 各トレード全体の損益。この数字は勝率より重要 | |
利益/ドローダウン・レシオ | リスク。利益の前にまずリスクに目を向けるべき | |
異常値調整利益 | とんでもない利益や損失がでる確率 | |
最大連敗回数 | 連続して負けたトレード数 | |
シャープレシオ | 純資産のなだらかさを示す。月次または年次収益の平均をその標準偏差で割ったもの | |
買い/売りトレード純利益 | 堅牢なシステムであれば多くの市場で買い/売り双方から利益を上げる | |
勝ちトレード月の比率 | 年間で少なくとも5ヶ月は利益が出るシステムが欲しい |
「異常値調整利益」などの要因はProtraには実装されてない。イザナミなどにはあるのかな?
次にストラテジーが載ってるか確認すると「長らく機能し続ける堅牢なシステムは必ず次の5つの仕組みが含まれてる」として次の5つの手法が紹介されていた。
- ドンチャン・チャンネル・ブレイクアウト
- 移動平均のクロスオーバー
- 短期ボラティリティに基づくオープニング・レンジ・ブレイクアウト
- S&Pのディトレード
- パターン認識
うーん、パターン認識って……何でも当てはまるじゃん。
よく分からん。
ま、難しいことはさておき、私より何百倍も偉くて何百倍も高い年収を得ている人たちの手法をバックテストしてみっか!
ただ、どれも手仕舞いまでの期間が長く日本株での実用には耐えれなそうなので「S&Pのデイトレード手法」のみバックテストを試みる。
この手法は書籍の中で「もっとも複雑な手法」として最後に紹介されていた。
S&Pのデイトレード手法の有効性確認
トレーダーの多くはデイトレードという手法に常に引き付けられる。
それはその日のうちにすべてのポジションを手仕舞い、オーバーナイトのリスクはとらないというものである。
デイトレーダーはその日のうちに損益を知ることができるうえ、価格に大きな影響を及ぼすニュースなどに一喜一憂しなくてもよい。
10年前から言われる事は一緒だ。
【基本設定】
- 対象は全銘柄
- 終値200円以下は対象外
- 単利利用、通年
【買いルール】
- 始値と終値の平均レンジ÷実際の平均レンジ > 0.5 であればトーレードを行う
- 終値がキープライス((その日の高値+安値+終値)/3)よりも高ければ、翌日の買い対象の銘柄とする
- 今日のキープライス-実際のレンジの75%のに明日の指値買いを入れる
平均レンジは過去10日間の始値と終値で求め、実際の平均レンジは過去10日間の高値ー安値で求める。
【手仕舞いルール】
- 今日のキープライス-実際のレンジの25%のに指値売りを入れる
- 明日の大引けまでに全ての未決済ポジションを手仕舞う
説明文読むとよく分からなかったのでシンプル化した。吉と出るか凶とでるか……。
バックテスト結果
バックテスト結果は次の通り。
計算時間は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 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
株価データ: 日足 銘柄リスト: 全銘柄 1998/01/05~2021/04/26における成績です。 ---------------------------------------- 全トレード数 3117 勝ちトレード数(勝率) 2518(80.78%) 負けトレード数(負率) 599(19.22%) 全トレード平均利率 0.88% 勝ちトレード平均利率 1.48% 負けトレード平均損率 -1.65% 勝ちトレード最大利率 13.38% 負けトレード最大損率 -18.08% 全トレード平均期間 2.94 勝ちトレード平均期間 2.97 負けトレード平均期間 2.81 ---------------------------------------- 必要資金 ¥1,916,500 最大ポジション(簿価) ¥2,985,000 最大ポジション(時価) ¥3,002,500 純利益 ¥11,563,940 勝ちトレード総利益 ¥15,741,070 負けトレード総損失 -¥4,177,132 全トレード平均利益 ¥3,710 勝ちトレード平均利益 ¥6,251 負けトレード平均損失 -¥6,974 勝ちトレード最大利益 ¥57,600 負けトレード最大損失 -¥76,800 プロフィットファクター 3.77 最大ドローダウン(簿価) -¥76,800 最大ドローダウン(時価) -¥205,452 ---------------------------------------- 現在進行中のトレード数 0 ---------------------------------------- 平均年利 27.43% 平均年利(直近5年) 19.04% 最大連勝 25回 最大連敗 6回 ---------------------------------------- [年度別レポート] 年度 取引回数 運用損益 年利 勝率 PF 最大DD 2021年 29回 ¥69,796円 3.64% 82.76% 2.21倍 -4.92% 2020年 123回 ¥478,083円 24.95% 84.55% 3.91倍 -11.35% 2019年 145回 ¥470,648円 24.56% 81.38% 5.45倍 -4.88% 2018年 121回 ¥312,849円 16.32% 79.34% 2.51倍 -12.36% 2017年 179回 ¥493,566円 25.75% 83.24% 4.79倍 -3.91% 2016年 122回 ¥386,044円 20.14% 86.07% 3.87倍 -5.60% 2015年 123回 ¥413,370円 21.57% 82.93% 5.05倍 -5.24% 2014年 120回 ¥301,718円 15.74% 78.33% 2.92倍 -7.01% 2013年 139回 ¥458,344円 23.92% 79.14% 2.88倍 -5.88% 2012年 145回 ¥466,026円 24.32% 82.76% 3.43倍 -5.56% 2011年 140回 ¥487,052円 25.41% 86.43% 4.03倍 -7.13% 2010年 135回 ¥542,808円 28.32% 83.70% 3.53倍 -5.97% 2009年 155回 ¥658,017円 34.33% 78.06% 3.13倍 -6.41% 2008年 155回 ¥931,468円 48.60% 83.87% 6.49倍 -6.65% 2007年 155回 ¥588,434円 30.70% 83.87% 3.98倍 -7.09% 2006年 138回 ¥558,534円 29.14% 85.51% 7.65倍 -2.95% 2005年 226回 ¥727,582円 37.96% 81.42% 3.51倍 -6.67% 2004年 166回 ¥569,600円 29.72% 81.33% 3.23倍 -7.67% 2003年 176回 ¥920,200円 48.01% 83.52% 4.85倍 -8.54% 2002年 132回 ¥549,900円 28.69% 81.06% 3.70倍 -7.55% 2001年 163回 ¥591,600円 30.87% 80.98% 2.77倍 -9.94% 2000年 130回 ¥588,300円 30.70% 78.46% 3.58倍 -18.08% |
利益曲線は次の通り。
勝率 80.78%!
プロフィットファクター 3.77!
平均利益 3,710円!
キターーーーーー!!!
とは思わないよ。
今までに何度もあったもん。
これ未来チートしているやつ(=実装ミス)じゃない?。
という事が実は3回あって、このバックテストは3回目。
うーん、流石にもう正しそうだ。
え?まじ?
考察&修正
世の中でもっとも信じれないのは自分自身
(C)椎名高志 / GS美神 極楽大作戦!!
石橋を叩いて渡る……
どころか、私は更に人を先に渡らせて渡る。
もっと慎重に分析してみよう。
例えばバックテスト結果を見ると
21/01/19に丸八倉庫(9313)を768円で買い、774円で売ってる。
でもローソク足を見ると、この日は単調に下がっているから上記のような売買はできない。
要するに、売り買い両方が「当日指値」だとバックテスト結果がオカシクなると言うことね……。
これ「寄付き指値」でも前場中に寄り付かなかった場合には注文が後場に引き継がれるから、バックテストの結果がオカシクなるよね?
とりあえず「始値が指値より安い場合のみ始値買い」でバックテストをしてみるか……。
バックテスト結果は次の通り。
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 |
株価データ: 日足 銘柄リスト: 全銘柄 1998/01/05~2021/04/26における成績です。 ---------------------------------------- 全トレード数 1426 勝ちトレード数(勝率) 805(56.45%) 負けトレード数(負率) 621(43.55%) 全トレード平均利率 0.57% 勝ちトレード平均利率 1.88% 負けトレード平均損率 -1.13% 勝ちトレード最大利率 13.38% 負けトレード最大損率 -12.36% 全トレード平均期間 2.91 勝ちトレード平均期間 2.95 負けトレード平均期間 2.87 ---------------------------------------- 必要資金 ¥1,833,700 最大ポジション(簿価) ¥2,731,100 最大ポジション(時価) ¥2,805,500 純利益 ¥3,411,073 勝ちトレード総利益 ¥6,369,665 負けトレード総損失 -¥2,958,592 全トレード平均利益 ¥2,392 勝ちトレード平均利益 ¥7,913 負けトレード平均損失 -¥4,764 勝ちトレード最大利益 ¥57,600 負けトレード最大損失 -¥51,000 プロフィットファクター 2.15 最大ドローダウン(簿価) -¥103,332 最大ドローダウン(時価) -¥180,700 ---------------------------------------- 現在進行中のトレード数 0 ---------------------------------------- 平均年利 8.46% 平均年利(直近5年) 4.45% 最大連勝 10回 最大連敗 11回 ---------------------------------------- [年度別レポート] 年度 取引回数 運用損益 年利 勝率 PF 最大DD 2021年 13回 ¥22,200円 1.21% 69.23% 1.61倍 -3.82% 2020年 59回 ¥225,340円 12.29% 81.36% 4.82倍 -2.46% 2019年 42回 ¥127,666円 6.96% 83.33% 4.72倍 -3.09% 2018年 52回 -¥37,720円 -2.06% 65.38% 0.80倍 -12.36% 2017年 53回 ¥70,441円 3.84% 75.47% 2.13倍 -7.04% 2016年 47回 ¥112,850円 6.15% 63.83% 2.91倍 -2.29% 2015年 45回 -¥5,820円 -0.32% 64.44% 0.95倍 -6.72% 2014年 51回 ¥77,662円 4.24% 70.59% 2.03倍 -6.63% 2013年 46回 -¥79,832円 -4.35% 58.70% 0.65倍 -9.12% 2012年 73回 ¥183,990円 10.03% 76.71% 2.33倍 -5.45% 2011年 74回 ¥225,410円 12.29% 78.38% 3.84倍 -2.94% 2010年 62回 ¥214,818円 11.72% 79.03% 4.29倍 -3.94% 2009年 69回 ¥177,837円 9.70% 71.01% 1.89倍 -7.20% 2008年 84回 ¥418,000円 22.80% 78.57% 3.51倍 -7.47% 2007年 75回 ¥350,901円 19.14% 73.33% 4.14倍 -4.41% 2006年 59回 ¥18,884円 1.03% 66.10% 1.11倍 -5.98% 2005年 89回 ¥112,546円 6.14% 76.40% 1.78倍 -3.75% 2004年 79回 ¥67,100円 3.66% 69.62% 1.27倍 -10.56% 2003年 109回 ¥423,700円 23.11% 80.73% 3.41倍 -4.76% 2002年 61回 ¥86,500円 4.72% 77.05% 1.77倍 -4.74% 2001年 105回 ¥282,400円 15.40% 77.14% 2.05倍 -10.23% 2000年 79回 ¥336,200円 18.33% 74.68% 2.61倍 -6.52% |
利益曲線は次の通り。
平凡な手法になってしまった。
これが現実か……。
でも2013年頃までは調子良いだよね。日本株の動きが分かんねーーーー。
まとめ
これ、今までのデイトレ手法も実装が間違ってない?
一日の時系列データがないので、スイング投資と同じノリでバックテストしちゃ駄目だわ。
- 【可能】寄りで買って指値売り
- 【可能】場中指値で買って引け成り売り
- 【不可能】場中指値で買っての指値売り
過去の3Days投資法や、徳山秀樹式デイトレードも間違ってる事になる。
スイングトレード諦めて、手数料無料だしドローダウンを気にしなくて良いからデイトレ自動化を進めていた矢先なのに……。
最近は「バックテストの結果をまとめて書籍出版」する方が儲かるじゃないのか……。と思い始めてる。
出版社と話をしてみようとググったけど、持ち込みは通常「自費出版」を進められるっぽい。
100万円近く払って150冊程度刷ってもらい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 |
# loop-type: date-only //============================== require "TIlib" require "Utility" require "TrendCheck" require "TOPIX" //============================== // 究極のトレーディングガイドのS&Pのデイトレード手法 //============================== 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] // 値上がり銘柄のカウント ------------------------ InitDone() // 騰落レシオ初期化 $__INIT__ = 1 end // N日間の最高値と最安値、始値と終値の平均レンジを求める def AveRange(num) i = 0 open_ave = 0.0 $High_ave = 0.0 while (i >= -1 * num) if ! ({i}Low && {i}Open && {i}High && {i}Close) return -99999 end open_ave = open_ave + ((float){i}Close - {i}Open)/num $High_ave = $High_ave + ((float){i}High - {i}Low)/num i = i - 1 end if ($High_ave) return open_ave / $High_ave else return -99999 end end def Main(i) //================================================== // 条件(買条件, 売条件共通部分) //================================================== //まだ上場していない銘柄は株価データがないためnullが返る if (Index == null) return end if ! ($order[(int)Code]) $order[(int)Code] = i end //================================================== if ! ($DiffMA25[i]) //銘柄ごとのグローバル変数を初期化する $DiffMA25[i] = DiffMA_new(25) $hold[i] = 0 return end //指標の計算を1日進める DiffMA_next($DiffMA25[i]) // ここまで ======================================== //================================================== // 保有してない→購入 //================================================== if ! ($hold[i]) diffma25 = DiffMA_value($DiffMA25[i]) if ! (diffma25 && Close && {-10}Close) return end if ! (Volume && {-10}Volume) return end flag1 = AveRange(10) > 0.5 key_price = (int)(High + Low + Close) / 3 flag2 = Close < key_price // 売りやすい flag3 = Close > 200 if (flag1 && flag2 && flag3) PrintLog(" Close = " + Close + " Buy = " + (int)(key_price - $High_ave * 0.75) + " Sell = " + (int)(key_price - $High_ave * 0.25)) $buyflag[i][0] = (int)(key_price - $High_ave * 0.75) // 買い予定値 $buyflag[i][1] = diffma25 // 好きなパラメータをもとにソート $buyflag[i][2] = (int)(key_price - $High_ave * 0.25) // 売り予定値 $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) if (t > {1}Open) return {1}Open end end //================================================== // 買い(指値) //================================================== def Buying2(i) if (HasPricedata({1}Open) && HasPricedata(Close) _ && HasPricedata({1}Low) && HasPricedata({1}High)) t = 0 if ($buyflag[i][0]) t = CheckHighLow2($buyflag[i][0]) end if (t) BuyingLimitedPrice(i, 1, t) end end end //==================== // 売り処理(デイトレ模倣) //==================== def Sell_(i) if ($sellflag[i]) // 売り予定額 sell = $buyflag[i][2] // 同一株購入が発生するので、翌日売りとして表現しておく if ({-1}High > sell && sell > {-1}Low) // 当日のClose、翌日の高値、翌々日の高値まで SellingLimitedPrice(i, 1, (int)sell) // 当日のCloseで売る elsif ({-1}Close) // 超えてなければ、Closeで売る SellingLimitedPrice(i, 1, {-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 //==================== // 買い処理 //==================== def SortBuy(i) if ! (HasPricedata(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 while i + 1 < $code_num i = i + 1 {codes[i]}Sort(i) end i = -1 // ストラテジーによって買いの優先度を変える ---- if ($buyCnt) 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 |