次のような記事をみつけた。
専業投資家に是非会いたいというので友人の紹介で食事をしました。
話をしてすぐにわかったのは、2名ともがシステテムヲタクってことでした。
頭がよくて、高学歴で、実社会で成功している人は、このシステムヲタクになりやすいのですが、その典型でした。
..(中略)…
勝てる方法が見つかるまで、どうか永遠に検証を続けてください。この
永遠の検証マニア
は、想像以上に多く生存していることが確認されています。
……
© テニスの王子様/許斐剛/集英社
もはやブログのネタのためにバックテストや釣りに行ってる感じだよ……。
ストラテジーはもうネタが無いけどね。
と思ったら少ないブログの読者から「UKI氏のストラテジーを株でやってみたら?」と連絡を貰った。
UKI氏はこのストラテジーで暗号資産一億円を達成したらしい。まじか……。
UKI氏のオープニングレンジ・ブレイクアウトの期待値検証
基本ストラテジーは「オープニングレンジ・ブレイクアウト」を利用して、相場の転換点を読み取るらしい。
【レンジの定義】
直近の5つの足(現在の足は除く)のレンジ(高値-安値)の平均値【抜け幅】
現在の足について
・始値~高値が(K×レンジ幅)を抜けた場合→上昇トレンドへの以降と判断し、ロング
・始値~安値が(K×レンジ幅)を抜けた場合→下落トレンドへの以降と判断し、ショート
ここで係数K=1.6とした【時間足】
基本的には4時間足のトレンド転換を捉えるため、計算の時間足は2時間足とした。【エントリ/イグジット】
・エントリーはシグナル点灯した次の足の始値とした。
・イグジットはドテン(逆シグナル点灯)とする。
その他の条件は次のとおり。
【基本条件】
- 投資(投機)対象:BTC-FX(bitFlyer)
- 初期資金:2000万+端数
- 達成資産:1億+端数(初期資金に対しておよそ5倍)
- 投資(投機)期間:およそ1ヶ月
- 投資手法:ブレイクアウトを利用したシステムトレード
もはや二番煎じだし、株で通用するストラテジーな気がしない。
とはいえ、これを日足の株売買に当てはめると次のようになる。
【基本条件】
- 1) 初期費用 300万円
- 2) 単利運用
- 3) 最大5日間保有
- 4) 現物取引:1銘柄当たり仕掛け金額50万円
- 5) 買い
【買いルール】
- 始値~高値が、「(過去5日間の高値ー安値)の平均値 * 1.6」を超えた
【売りルール】
- 始値~安値が、「(過去5日間の高値ー安値)の平均値 * 1.6」を超えた
それを2時間足……なんてProtraには仕組みが無いので日足で行う。
既に駄目感が漂ってる。
バックテスト結果
バックテスト時間は全銘柄で45分。
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 |
株価データ: 日足 銘柄リスト: 全銘柄 2000/01/06~2022/02/04における成績です。 ---------------------------------------- 全トレード数 6123 勝ちトレード数(勝率) 2868(46.84%) 負けトレード数(負率) 3255(53.16%) 全トレード平均利率 0.16% 勝ちトレード平均利率 4.30% 負けトレード平均損率 -3.49% 勝ちトレード最大利率 190.00% 負けトレード最大損率 -53.13% 全トレード平均期間 6.96 勝ちトレード平均期間 7.19 負けトレード平均期間 6.77 ---------------------------------------- 必要資金 ¥2,978,500 最大ポジション(簿価) ¥3,473,600 最大ポジション(時価) ¥4,243,460 純利益 ¥4,431,535 勝ちトレード総利益 ¥55,469,670 負けトレード総損失 -¥51,038,130 全トレード平均利益 ¥724 勝ちトレード平均利益 ¥19,341 負けトレード平均損失 -¥15,680 勝ちトレード最大利益 ¥950,000 負けトレード最大損失 -¥272,000 プロフィットファクター 1.09 最大ドローダウン(簿価) -¥2,835,710 最大ドローダウン(時価) -¥2,909,910 ---------------------------------------- 現在進行中のトレード数 5 ---------------------------------------- 平均年利 6.47% 平均年利(直近5年) 7.01% 最大連勝 12回 最大連敗 14回 ---------------------------------------- [年度別レポート] 年度 取引回数 運用損益 年利 勝率 PF 最大DD 2022年 23回 -¥28,342円 -0.95% 39.13% 0.73倍 -3.15% 2021年 278回 -¥117,186円 -3.93% 49.64% 0.93倍 -22.74% 2020年 264回 ¥425,819円 14.30% 47.35% 1.16倍 -33.44% 2019年 260回 ¥438,781円 14.73% 53.46% 1.33倍 -12.48% 2018年 275回 ¥325,103円 10.91% 51.27% 1.14倍 -37.56% 2017年 277回 -¥147,731円 -4.96% 50.54% 0.91倍 -29.26% 2016年 267回 ¥2,029円 0.07% 54.68% 1.00倍 -18.87% 2015年 277回 ¥631,589円 21.20% 56.68% 1.35倍 -14.75% 2014年 268回 ¥473,741円 15.91% 54.10% 1.26倍 -15.92% 2013年 268回 ¥262,098円 8.80% 54.10% 1.13倍 -17.94% 2012年 269回 -¥46,350円 -1.56% 49.44% 0.98倍 -18.18% 2011年 263回 -¥460,201円 -15.45% 52.09% 0.83倍 -53.13% 2010年 265回 ¥457,075円 15.35% 53.96% 1.21倍 -15.64% 2009年 261回 ¥937,270円 31.47% 56.32% 1.39倍 -18.44% 2008年 269回 -¥374,400円 -12.57% 46.47% 0.92倍 -33.33% 2007年 288回 -¥680,220円 -22.84% 44.44% 0.74倍 -24.62% 2006年 297回 -¥1,013,630円 -34.03% 44.11% 0.70倍 -37.50% 2005年 300回 ¥596,940円 20.04% 56.67% 1.34倍 -16.10% 2004年 297回 -¥150,640円 -5.06% 53.87% 0.94倍 -20.51% 2003年 279回 ¥1,522,050円 51.10% 61.65% 1.77倍 -22.97% 2002年 284回 ¥499,240円 16.76% 52.11% 1.16倍 -36.96% 2001年 298回 ¥578,700円 19.43% 56.71% 1.25倍 -26.67% 2000年 296回 ¥299,800円 10.07% 46.28% 1.14倍 -15.23% |
利益曲線は次の通り。
うーん、凡ストラテジー。
まとめ
2時間足のストラテジーを日足で使い、また購入タイミングは翌日の始値の時点で、このストラテジーの効果が発揮できていない気がする。
ソースコード
バックテストには無料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 |
# loop-type: date-only //============================== require "TIlib" require "Utility" require "TrendCheck" // ====================================== // UKI氏のオープニングレンジ・ブレイクアウト // ====================================== // //【仕掛けのルール】 // 1) 始値~高値が、「(過去5日間の高値ー安値)の平均値 * 1.6」を超えた // //【手仕舞いのルール】 // 1) 始値~安値が、「(過去5日間の高値ー安値)の平均値 * 1.6」を超えた 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 = 5 // 最大保有日数 $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 Op_range(max) m = 1 sum = 0 while (m <= max) if !({-1 * m}High && {-1* m}Low) return end sum = sum + ({-1 * m}High - {-1* m}Low) m = m + 1 end return sum 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(15) $hold[i] = 0 return end //指標の計算を1日進める DiffMA_next($DiffMA[i]) //================================================== // 保有してない→購入 //================================================== if (! $hold[i]) diffma = DiffMA_value($DiffMA[i]) if ! (diffma && Close) return end //================================================== // 売買(買い) //================================================== // 1) 始値~高値が、「(過去5日間の高値ー安値)の平均値 * 1.6」を超えた sum = Op_range(5) if ! (sum) return end flag1 = (High - Open) >= (float)sum / 5 * 1.6 if (flag1) // PrintLog("買い候補 " + (High - Open) + " >= " + (float)sum / 5) $buyflag[i][0] = 1 $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 //================================================== // 売買(売り) //================================================== sum = Op_range(5) flag1 = 0 if (sum) flag1 = (Open - Low) >= (float)sum / 5 * 1.6 end // 1) 利食い if (flag1) PrintLog("利食い") $sellflag[i] = 1 $set[i] = 0 // 2) 損切り elsif ($set[i] >= $MaxHoldDay) PrintLog("損切り") $sellflag[i] = 1 $set[i] = 0 end end end //==================== // 買い処理 //==================== def SortBuy() if ! (HasPricedata({1}Open)) return end $long = 0 $long = Num($buyUnit, Close) codeset = $order[(int)Code] Buying(codeset) 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 //==================== // 銘柄コードを変えながら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(10, 0) cnt = $buyCnt if ($buyCnt > 10) cnt = 10 end 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 |