システムトレードをずっと放置していましたが、新型コロナウイルス時に実践してたらどうなるか?
ということを確認してみたところ、極端に勝つ、負ける、関係なく淡々と稼ぐストラテジー・・・と様々でした。
山崎
ただ、流動性がある銘柄に対してテクニカル分析が有効かというとちょっと……。長年いろいろな人がテクニカル分析の極意を見つけたと言っているけれど、テクニカル分析で大金持ちになった人はほとんどいません。さすがに東大生の頭脳は単純なチャート分析にハマるほど幼稚ではなかったね。
チャート分析は、プロの世界ではあまり相手にされていないけれど、素人には何か意味があるように見える。占いみたいにね。
・・・・駄目なのか。
でも、「AIトレーダー Ai投資 プライベートファンド」の方は勝ってるようです。
高値、安値、終値、出来高や移動平均線、RSIやMACD・・・
過去のデータをもとに開発をするという事は
結局、都合の良い部分を見つけるという事で、
カーブフィッティングしている事と
そう違いはないと考えます。
ただしテクニカル分析とは異なる(卒業された)ようで、私の脳では思いつきません・・・・。
メンバー選定をされて徐々に人を増やされているようなので、志願してみようかな。。私のスキルじゃ役に立たないだろうね。
今回は「sand氏」の手法のバックテストを行います。
昨年、有効性が確認できたので様々な検証目的のために非公開にしていましたが、公開します。
sand氏のかつての空売りシステムの検証
sand氏が「かつての空売りシステムを公開」として手法を公開しています。
【買いルール】
次の場合に[翌日寄付]で[売り]を仕掛ける
- [日経平均株価(終値)]が[25日移動平均]より[小さい]
- [強弱レシオB(30)]が[250]より[大きい]
- [Stop高(終値)]が[0]と[同じ]
- [安値→終値(率)]が[4]より[大きい]
【手仕舞いルール】
- [高値]が[建て値(+10.00%)]より[大きい]場合、[当日指定値][建て値(+10.50%)]で手仕舞いする
- [保有日数]が[4]より[大きい(同じ含む)]場合、[翌日寄付]で手仕舞いする
- [終値]が[建て値(-4.00%)]より[小さい(同じ含む)]場合、[翌日寄付]で手仕舞いする
- [終値]が[建て値]より[大きい(同じ含む)]場合、[翌日寄付]で手仕舞いする
強弱レシオB(30)が250より大きいと言う割高感のある指標を使っています。
また、手仕舞いがストップ高(終値)を避けている点は大きなリスクはとらない思想だそうです。
2014年2月に作った手法で「また勉強中で知識もスキルもかなり低い段階で稚拙」と書いてあります。
問題はやはり、安値→終値(率)が4より大きいという条件でしょうか。
これはローソク足が陽線でも陰線でも安値からそれなりの大きさで上昇している銘柄を狙っているのですが、それが市場でどのように優位性を示すのかちょっと分かりにくいです(自分で作っておきながら)。
この時はそのような考えをまだ持っていなかったので、適当に指標を振ってみて優位性のあるものが「偶然」見つかったら、それの幅をユーザー設定で検証して一番より数字を選んでいると言うやり方でした。
これは典型的なカーブフィッティングになりやすい方法です。
・・・何が何だか わからない
とりあえず、当日指定の建て値手仕舞いは当日データを入手しない限り無理でしょう
ソースコード
上限300万円で試してみます。
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 |
# loop-type: date-only //============================== require "TIlib" require "Utility" require "TrendCheck" //============================== // sand氏のかつての空売りシステム //============================== // 検証対象:東証1部貸借銘柄 // // 【買いルール】 // 1) [日経平均株価(終値)]が[25日移動平均]より[小さい] // 2) [強弱レシオB(30)]が[250]より[大きい] // 3) [Stop高(終値)]が[0]と[同じ] // 4) [安値→終値(率)]が[4]より[大きい] // 5) [翌日寄付]で[売り]を仕掛ける // // 【売り条件】 // 1) [高値]が[建て値(+10.00%)]より[大きい] // 2) [保有日数]が[4]より[大きい(同じ含む)] // 3) [終値]が[建て値(-4.00%)]より[小さい(同じ含む)] // 4) [終値]が[建て値]より[大きい(同じ含む)] // 5) [当日指定値][建て値(+10.50%)]で手仕舞いする // 6) [翌日寄付]で手仕舞いする codes = CodeList if $code_num && $code_num != Length(codes) Print("前回と異なる銘柄リストでは実行できません。") Dummy end $code_num = Length(codes) //グローバル変数を初期化 if ! ($__INIT__) $budgetIni = 3000000 $buyUnit = 300000 // 1回の購入資金 (100万円) $MaxHoldDay = 4 // 最大保有日数 $shortSelling = 1 // 空売り戦略 Yes(1)/No(0) $Interest = 1 // 無制限(0) / 単利(1) / 複利(2) $reverse = 1 // 購入順序 昇順(0) / 降順(1) $udcount = 0 // 騰落レシオ利用数 Init() //------------------------------------------------ $BB = [$code_num] $AB = [$code_num] //------------------------------------------------ InitDone() // 騰落レシオ初期化 $__INIT__ = 1 end def Main(i) //================================================== // 条件(買条件, 売条件共通部分) //================================================== //まだ上場していない銘柄は株価データがないためnullが返る if (Index == null) return end if ! ($order[(int)Code]) $order[(int)Code] = i end if ! ($BB[i] && $AB[i]) //Tilibのオブジェクト生成 $BB[i] = BB_new(25) $AB[i] = ABratio_new(30,1) $hold[i] = 0 return end //指標の計算を1日進める BB_next($BB[i]) ABratio_next($AB[i]) //================================================== // 保有してない→購入 //================================================== if (! $hold[i]) ma = BB_value($BB[i]) ab = ABratio_value($AB[i]) if ! (ma && ab && Close) return end // 1) [日経平均株価(終値)]が[25日移動平均]より[小さい] // 2) [強弱レシオB(30)]が[250]より[大きい] // // 3) [Stop高(終値)]が[0]と[同じ] // // 4) [安値→終値(率)]が[4]より[大きい] if (ab > 250 && ma > Close && Close >= 50) PrintLog("買い") $buyflag[i][0] = 1 $buyflag[i][1] = ab $buyCnt = $buyCnt + 1 end //================================================== // 保有している→売却 //================================================== elsif ($hold[i]) if ($set[i] < 1) $set[i] = 1 return end $set[i] = $set[i] + 1 //================================================== // 売買(売り) //================================================== // 1) [高値]が[建て値(+10.00%)]より[大きい] // 2) [保有日数]が[4]より[大きい(同じ含む)] // 3) [終値]が[建て値(-4.00%)]より[小さい(同じ含む)] if (High > 1.10 * $buy[i]) PrintLog("売り1") $sellflag[i] = 1 $set[i] = 0 elsif ($set[i] >= $MaxHoldDay) PrintLog("手仕舞い") $sellflag[i] = 1 $set[i] = 0 elsif (0.96 * $buy[i] >= Close) PrintLog("売り2") $sellflag[i] = 1 $set[i] = 0 elsif (Close > $buy[i]) PrintLog("売り3") $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 // 使用した$buyflag 配列を初期化 if ($buyflag[i][0]) $buyflag[i][0] = 0 $buyflag[i][1] = 0 end 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 |
バックテスト結果
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 |
株価データ: 日足 銘柄リスト: 貸借(東証一部+二部) 1998/01/05~2020/06/12における成績です。 ---------------------------------------- 全トレード数 3684 勝ちトレード数(勝率) 1476(40.07%) 負けトレード数(負率) 2208(59.93%) 全トレード平均利率 ∞ 勝ちトレード平均利率 ∞ 負けトレード平均損率 NaN 勝ちトレード最大利率 ∞ 負けトレード最大損率 -50.12% 全トレード平均期間 4.45 勝ちトレード平均期間 5.42 負けトレード平均期間 3.80 ---------------------------------------- 必要資金 ¥2,100,100 最大ポジション(簿価) ¥7,343,200 最大ポジション(時価) ¥0 純利益 ¥25,706,000 勝ちトレード総利益 ¥40,386,600 負けトレード総損失 -¥14,680,600 全トレード平均利益 ¥6,978 勝ちトレード平均利益 ¥27,362 負けトレード平均損失 -¥6,649 勝ちトレード最大利益 ¥312,000 負けトレード最大損失 -¥142,100 プロフィットファクター 2.75 最大ドローダウン(簿価) -¥667,445 最大ドローダウン(時価) ¥0 ---------------------------------------- 現在進行中のトレード数 18 ---------------------------------------- 平均年利 58.29% 平均年利(直近5年) 1.25% 最大連勝 10回 最大連敗 34回 ---------------------------------------- [年度別レポート] 年度 取引回数 運用損益 年利 勝率 PF 最大DD 2020年 19回 ¥49,300円 2.35% 68.42% 3.53倍 -2.47% 2019年 56回 -¥38,700円 -1.84% 33.93% 0.72倍 -5.62% 2018年 62回 ¥262,300円 12.49% 40.32% 2.66倍 -6.49% 2017年 131回 -¥177,800円 -8.47% 35.88% 0.68倍 -30.21% 2016年 90回 ¥36,100円 1.72% 53.33% 1.14倍 -16.67% 2015年 141回 ¥77,300円 3.68% 48.94% 1.17倍 -16.33% 2014年 101回 ¥438,900円 20.90% 49.50% 2.58倍 -15.33% 2013年 157回 ¥662,700円 31.56% 42.68% 1.94倍 -46.65% 2012年 167回 ¥1,569,500円 74.73% 46.11% 3.11倍 -33.77% 2011年 205回 ¥367,900円 17.52% 43.90% 1.43倍 -34.92% 2010年 192回 ¥2,543,500円 121.11% 48.44% 4.91倍 -15.45% 2009年 210回 ¥2,478,700円 118.03% 51.43% 3.67倍 -24.00% 2008年 180回 ¥2,506,100円 119.33% 60.00% 5.02倍 -22.32% 2007年 192回 ¥1,041,500円 49.59% 60.42% 2.51倍 -50.12% 2006年 159回 ¥711,100円 33.86% 49.06% 2.49倍 -20.93% 2005年 234回 ¥761,400円 36.26% 38.89% 1.81倍 -28.74% 2004年 246回 ¥1,223,400円 58.25% 48.37% 2.39倍 -21.21% 2003年 277回 ¥2,913,200円 138.72% 45.13% 3.29倍 -31.88% 2002年 257回 ¥2,620,400円 124.78% 53.70% 3.46倍 -22.75% 2001年 282回 ¥3,786,500円 180.30% 51.42% 3.49倍 -35.15% 2000年 326回 ¥1,872,700円 89.17% 55.83% 2.27倍 -37.61% |
利益曲線は次のとおりです。
全銘柄を使ってバックテストすると綺麗な単調増加します。
が、これは空売りなので貸借銘柄だけにしなきゃ・・・・。
すると、利益曲線はいつもの通り寝ます。
結局、システムトレードの旨味が年々減っている・・・という事だよね。
まとめ
淡々とやり続ける意思があれば、このストラテジーでも勝つことはできます。
でも、毎年利益が減ってるから、自信がなくなるのは必死です。
システムトレードって難しいなぁ・・・。