台風の日から一週間ずっと左目が痛いです。赤く腫れて痒みがあります。
10年ぶりに眼科に行って抗炎症ステロイド、目軟膏を処方してもらいましたが、理由は分からないとのこと。
ちなみに、人間ドックに行くと左右の視力に0.5以上の差がありました(左目の視力が低い)。
確かに左目だけだと遠くが見えにくい・・・。
私の髪型はこの数年間はアシンメトリーになっており、左側の髪は目を隠してます。
眼科では否定されましたが、前髪が目にかかると視力が落ちると言われています。
一度、視力が0.3の差がついたときにアシンメトリーを辞めると、視力が戻りました。
明らかに因果関係があるとしか思えません。
本上武士氏の上昇トレンド型の株システムトレードの有効性検証
2007年後半からシステムトレードに取り組んだ株暦約10年の本上武士氏が紹介しているストラテジーです。
2009年04月12日のブログに「順張り型ストラテジー:上昇トレンド型の株システムトレード検証 – 8」として書かれています。
古い手法なので期待しておりませんが、逆張り検証して順張りをしていないのも勿体無いので、検証しておきます。
【基本設定】
- 1) 上場全銘柄
- 2) ポジションサイズ:資産の10分の1
- 3) 突入タイミング:過去90日平均サイン点灯数3倍以上
- 4) 売買優先順位:10日平均売買代金降順
【買いルール】
- 1) 終値が5日移動平均線以下
- 2) 25日移動平均線が75日移動平均線より大きい
- 3) 75日移動平均線が200日移動平均線より大きい
- 4) 25日ボリュームレシオが65%以上
- 5) 200日移動平均乖離率 30%以上
【手仕舞い】
- 1) 200日移動平均乖離率 20%以下
ブログには「イザナミ」「パイロン」で検証されたと書かれていますが、「検証くん」の保田望氏が書籍で紹介していた手法に似ています。
この方の書籍を読まれた上で、この手法を作られた・・・のであれば、期待はできます。
ソースコード
実装には、以前のソースコードがそのまま再利用できそうです。
TIlib、Utility、TrendCheckライブラリはGitHubに置いています(日記の公開日に合わせたバージョンを利用下さい)
「突入タイミング:過去90日平均サイン点灯数3倍以上」の部分をライブラリ化するために、Utility、TrendCheckも修正しました。
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 |
# loop-type: date-only //============================== require "TIlib" require "Utility" require "TrendCheck" // ====================================== // 本上武士氏の上昇トレンド型トレード検証 // ====================================== // //【基本設定】 // 1) 上場全銘柄 // 2) ポジションサイズ:資産の10分の1 // 3) 突入タイミング:過去90日平均サイン点灯数3倍以上 // 4) 売買優先順位:10日平均売買代金降順 // //【買いルール】 // 1) 終値が5日移動平均線以下 // 2) 25日移動平均線が75日移動平均線より大きい // 3) 75日移動平均線が200日移動平均線より大きい // 4) 25日ボリュームレシオが65%以上 // 5) 200日移動平均乖離率 30%以上 // //【手仕舞い】 // 1) 200日移動平均乖離率 20%以下 codes = CodeList if ($code_num && $code_num != Length(codes)) Print("前回と異なる銘柄リストでは実行できません。") Dummy end $code_num = Length(codes) //グローバル変数を初期化 if (!$__INIT__) $budgetIni = 10000000 // 投資総額 (1000万円) $buyUnit = 1000000 // 1回の購入資金 (100万円) $MaxHoldDay = 45 // 最大保有日数 $Interest = 1 // 無制限(0) / 単利(1) / 複利(2) $reverse = 1 // 購入順序 昇順(0) / 降順(1) $udcount = 0 // 騰落レシオ利用数 / 不要(0) Init() // 指標初期化 // テクニカル指標初期化 -------------------------- $BB5 = [$code_num] $BB25 = [$code_num] $BB75 = [$code_num] $VR25 = [$code_num] $BB200 = [$code_num] // 騰落レシオ初期値代入($udcountの数) ---------- // $ratiodate[0] = 25 // 騰落レシオ日数 //------------------------------------------------ InitDone() $__INIT__ = 1 end //================================================== // メイン関数 //================================================== def Main(i) //================================================== // 条件(買条件, 売条件共通部分) //================================================== //まだ上場していない銘柄は株価データがないためnullが返る if (Index == null) return end if ! ($order[(int)Code]) $order[(int)Code] = i end if ! ($BB5[i] && $BB25[i] && $BB75[i] && $VR25[i] && $BB200[i]) //Tilibのオブジェクト生成 $BB5[i] = BB_new(5) $BB25[i] = BB_new(25) $BB75[i] = BB_new(75) $VR25[i] = VR_new(25,0) $BB200[i] = BB_new(200) //銘柄ごとのグローバル変数を初期化する $hold[i] = 0 return end //指標の計算を1日進める BB_next($BB5[i]) BB_next($BB25[i]) BB_next($BB75[i]) VR_next($VR25[i]) BB_next($BB200[i]) ma200 = BB_value($BB200[i]) if ! (ma200) return end r200 = 100 * (Close - ma200) / ma200 if ! (r200) return end //================================================== // 保有してない→購入 //================================================== if (! $hold[i]) ma5 = BB_value($BB5[i]) ma25 = BB_value($BB25[i]) ma75 = BB_value($BB75[i]) vr25 = VR_value($VR25[i]) if ! (ma5 && ma25 && ma75 && vr25 && Close) return end //================================================== // 売買(買い) //================================================== // 4) 売買優先順位:10日平均売買代金降順 tv = TradingValume(10) // 1) 終値が5日移動平均線以下 // 2) 25日移動平均線が75日移動平均線より大きい // 3) 75日移動平均線が200日移動平均線より大きい // 4) 25日ボリュームレシオが65%以上 // 5) 200日移動平均乖離率 30%以上 if (ma5 >= Close && ma25 > ma75 && ma75 > ma200 && vr25 >= 65 && r200 >= 30) $buyflag[i][0] = 1 $buyflag[i][1] = tv $buyCnt = $buyCnt + 1 end //================================================== // 保有している→売却 //================================================== elsif ($hold[i]) if ($set[i] < 1) $set[i] = 1 return end $set[i] = $set[i] + 1 //================================================== // 売買(売り) //================================================== // 1) 200日移動平均乖離率 20%以下 if (20 >= r200) PrintLog("売り") $sellflag[i] = 1 $set[i] = 0 // 2) 保有日数が$MaxHoldDayより大きい(同じ) elsif ($set[i] >= $MaxHoldDay) PrintLog("手仕舞い") $sellflag[i] = 1 $set[i] = 0 end end end //==================== // 買い処理 //==================== def SortBuy(i) if (PricedataExistCheck(Close)) 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 end end //==================== // 銘柄コードを変えながらMain関数,BuySell関数を実行 //==================== Print("-------------------------------------------------") Print("日付 = "+ Year + "/" + Month + "/" + Day) //UpDownRatio() // 騰落レシオ計算 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 // 突入タイミング:過去90日平均サイン点灯数3倍以上 sg = SignalCount(90) Print("過去90日平均サイン点灯数 =" + sg + " $sflag=" + $sflag) if ($buyCnt >= sg * 3) 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 |
バックテスト結果
実行時間は6時間です。並列プログラミングではないProtraは遅すぎです。
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 |
株価データ: 日足 銘柄リスト: 全銘柄 1998/01/05~2019/09/04における成績です。 ---------------------------------------- 全トレード数 276 勝ちトレード数(勝率) 112(40.58%) 負けトレード数(負率) 164(59.42%) 全トレード平均利率 -0.43% 勝ちトレード平均利率 21.10% 負けトレード平均損率 -15.13% 勝ちトレード最大利率 233.61% 負けトレード最大損率 -100.00% 全トレード平均期間 51.37 勝ちトレード平均期間 66.54 負けトレード平均期間 41.00 ---------------------------------------- 必要資金 ¥15,843,300 最大ポジション(簿価) ¥9,997,600 最大ポジション(時価) ¥14,681,800 純利益 -¥943,100 勝ちトレード総利益 ¥20,971,600 負けトレード総損失 -¥21,914,700 全トレード平均利益 -¥3,417 勝ちトレード平均利益 ¥187,246 負けトレード平均損失 -¥133,626 勝ちトレード最大利益 ¥1,682,000 負けトレード最大損失 -¥996,800 プロフィットファクター 0.96 最大ドローダウン(簿価) -¥6,228,100 最大ドローダウン(時価) -¥5,025,900 ---------------------------------------- 現在進行中のトレード数 0 ---------------------------------------- 平均年利 -0.37% 平均年利(直近5年) 3.66% 最大連勝 7回 最大連敗 10回 ---------------------------------------- [年度別レポート] 年度 取引回数 運用損益 年利 勝率 PF 最大DD 2017年 10回 ¥699,000円 4.41% 70.00% 4.13倍 -13.92% 2016年 2回 -¥136,700円 -0.86% 0.00% 0.00倍 -11.07% 2013年 25回 ¥3,751,600円 23.68% 60.00% 5.56倍 -35.45% 2012年 14回 -¥1,546,800円 -9.76% 21.43% 0.20倍 -38.00% 2011年 22回 ¥130,200円 0.82% 36.36% 1.06倍 -28.07% 2010年 14回 -¥896,900円 -5.66% 21.43% 0.22倍 -24.56% 2009年 31回 ¥1,806,100円 11.40% 70.97% 1.79倍 -100.00% 2008年 13回 -¥664,400円 -4.19% 23.08% 0.68倍 -39.15% 2007年 37回 -¥2,124,100円 -13.41% 21.62% 0.37倍 -100.00% 2006年 11回 ¥677,800円 4.28% 72.73% 3.58倍 -18.69% 2005年 12回 -¥421,500円 -2.66% 25.00% 0.63倍 -33.15% 2004年 11回 -¥934,800円 -5.90% 27.27% 0.18倍 -29.28% 2003年 24回 ¥1,310,400円 8.27% 66.67% 2.05倍 -35.09% 2002年 23回 -¥194,700円 -1.23% 34.78% 0.85倍 -24.76% 2001年 15回 -¥1,789,000円 -11.29% 13.33% 0.04倍 -28.41% 2000年 12回 -¥609,300円 -3.85% 33.33% 0.31倍 -25.62% |
利益曲線は次のとおりです。
なんだこりゃ・・・・。
まとめ
6時間待って利益曲線を見たときのガッカリ度は半端ありません・・・・、休暇を失った気がします。
高速化するには、Protraを並列プログラミング対応と、IOの削減です。バックテスト部分のアルゴリズムそのものを書き換える必要があるでしょう。
もしくは、例えば2000年〜2019年までのバックテストを2000年〜2005年、2005年〜2010年・・のように分割して並列で行い、最後に結合できれば改善は期待できます。
Protraは複数起動できませんが、アプリ名を変えれば可能でした。また、バックテストも同時実行可能でした。
ただし、出力ファイルが一つなので上書き保存されてしまいます。ファイル名変更して統合・・も、ファイルフォーマットの理解が面倒です。
300日移動平均乖離・・のような一年以上前の値を使ってると、結合したバックテスト結果も変になりそうだし・・・。