前回のRSIパワーゾーン戦略は、ワイルダー氏が提唱している通常のRSIを使ったトレード戦略だ。
ローレンス(ラリー)・コナーズは他に「コナーズRSI」というオリジナルのオシレーター系指標を提唱しているようだ。
「コナーズRSI (CRSI)」は、次の3つの構成要素を合成したテクニカル分析指標。
- 相対力指数(RSI)
- 期間騰落率(短期間の市場価格変動)
- 騰落率(ROC)
うーん、「コナーズRSI」なんて全く聞いたことが無い。
「虫コナーズ」なら知ってるよ。
最近、全くテレビを見ることが無くなったなーー。
テレビって人間を愚かにする最たる機械だと思ってる。
そして、究極に時間を無駄に過ごしている
更にCMは有害で洗脳で思考停止を誘ってる。
約10年前に「あとどのぐらいですか?終わりメーカー」を作ったことがあるけど、
40代の中年は、あと35回程度しか「桜」を見ることができない事実に気づいた方が良い。
あっ、でも国産テレビは買ってね。僕のボーナス下がっちゃうから。
テレワークのディスプレイやモニターとして使って頂戴!
コナーズRSIの計算方法
コナーズRSI(CRSI)は、次のような3つのオシレーター指標の平均値となる。
なぜ、このような事をするのか?
理由は、RSI、騰落数(UpDown Length)、ROCを独立して利用すると、条件が厳しいためシグナルの発生頻度が低くなる。
このため、平均値を利用してシグナルが発生しやすくしている。
なるほど、納得。
RSI
ワイルダー氏が開発したテクニカル指標で、オシレーター指標。
日間のと終値の上昇幅の平均日間の終値の下落幅の平均
コナーズRSIでは、3日(期間3)のRSIを使い、短期の価格の勢いを測定する。
騰落数
騰落数は、ローソク足終値が前の足の終値より高いか安いかを集計する。
カウント法
- 前の終値より高い:+1
- 前の終値より安い:-1
- 前の終値と同値:0
- 上昇(下落)の連続が途切れると、カウントがリセットされる
コナーズRSIでは、RSIを使って騰落数を正規化(規格化)することで平均算出に利用する。
騰落数
※ 終値の代わりに騰落数の値で計算したRSI(2日)
ROC
ROCは、n本前の足の終値を基準とした、価格の上昇率/減少率を数値化した指標。
コナーズRSIでは、100期間のROCを使う。
現在の足の終値 ÷ 本前の足の終値 ×
コナーズRSIを利用した新高値トレード
コナーズRSIを利用したストラテジーは幾つかあるが、これを試してみた。
【買いルール】
- 1.20日移動平均線が10日連続で上昇している
- 2.60日移動平均線が10日連続で上昇している
- 3.株価が200日移動平均線の上にある
- 4.コナーズRSIが10以下
- 5.1~4の条件がそろったら翌日寄せで買う
【売りルール】
- 1日経過したら翌日始値で売る
売りのルールは書かれてなかったので適当に対応した。
バックテスト結果
コナーズRSIは3つの指標の平均を利用することでシグナル数を増やすのが目的だ。
システムトレードでは対象銘柄を増やせるから「シグナル数」が少なくて困ることって無いんだよなーーー。
だったら、そもそも「コナーズRSI」を使う必要があるのか?
という純粋な疑問が生まれたので二つ試してみた。
RSI、RSI(騰落数)、ROCを別々に計算した場合
日経225採用銘柄だけ利用した。計算時間は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 |
銘柄リスト: 日経225採用銘柄 2000/01/07~2021/07/14における成績です。 ---------------------------------------- 全トレード数 1162 勝ちトレード数(勝率) 633(54.48%) 負けトレード数(負率) 529(45.52%) 全トレード平均利率 0.23% 勝ちトレード平均利率 2.09% 負けトレード平均損率 -2.00% 勝ちトレード最大利率 13.92% 負けトレード最大損率 -18.38% 全トレード平均期間 4.30 勝ちトレード平均期間 3.85 負けトレード平均期間 4.82 ---------------------------------------- 必要資金 ¥2,549,100 最大ポジション(簿価) ¥2,619,300 最大ポジション(時価) ¥2,656,200 純利益 ¥738,000 勝ちトレード総利益 ¥6,358,400 負けトレード総損失 -¥5,620,400 全トレード平均利益 ¥635 勝ちトレード平均利益 ¥10,045 負けトレード平均損失 -¥10,625 勝ちトレード最大利益 ¥102,600 負けトレード最大損失 -¥197,900 プロフィットファクター 1.13 最大ドローダウン(簿価) -¥603,100 最大ドローダウン(時価) -¥608,700 ---------------------------------------- 現在進行中のトレード数 2 ---------------------------------------- 平均年利 1.32% 平均年利(直近5年) -2.98% 最大連勝 12回 最大連敗 7回 ---------------------------------------- [年度別レポート] 年度 取引回数 運用損益 年利 勝率 PF 最大DD 2021年 36回 ¥14,200円 0.56% 38.89% 1.08倍 -4.24% 2020年 44回 -¥263,600円 -10.34% 43.18% 0.33倍 -16.25% 2019年 85回 -¥81,300円 -3.19% 48.24% 0.82倍 -18.38% 2018年 65回 -¥139,300円 -5.46% 53.85% 0.64倍 -10.13% 2017年 102回 ¥89,900円 3.53% 59.80% 1.24倍 -10.47% 2016年 55回 -¥17,800円 -0.70% 49.09% 0.92倍 -5.07% 2015年 65回 -¥36,700円 -1.44% 66.15% 0.90倍 -14.51% 2014年 81回 ¥205,600円 8.07% 70.37% 1.81倍 -5.73% 2013年 56回 ¥160,100円 6.28% 66.07% 1.59倍 -9.76% 2012年 66回 -¥42,800円 -1.68% 42.42% 0.85倍 -4.54% 2011年 48回 ¥38,800円 1.52% 60.42% 1.31倍 -3.21% 2010年 60回 ¥56,500円 2.22% 51.67% 1.22倍 -4.94% 2009年 24回 -¥31,400円 -1.23% 54.17% 0.80倍 -10.00% 2008年 12回 -¥16,500円 -0.65% 41.67% 0.81倍 -6.78% 2007年 48回 ¥12,600円 0.49% 62.50% 1.05倍 -6.97% 2006年 47回 ¥83,600円 3.28% 53.19% 1.46倍 -8.14% 2005年 68回 ¥303,400円 11.90% 61.76% 2.63倍 -4.39% 2004年 61回 ¥245,200円 9.62% 63.93% 1.91倍 -4.43% 2003年 40回 ¥325,800円 12.78% 70.00% 3.49倍 -5.09% 2002年 33回 -¥123,400円 -4.84% 45.45% 0.51倍 -5.49% 2001年 36回 -¥41,600円 -1.63% 58.33% 0.83倍 -12.41% 2000年 30回 -¥3,300円 -0.13% 56.67% 0.99倍 -11.32% |
利益曲線は次のとおり。
うーん、直近3,4年の結果はボロボロだ。
コナーズRSIを使った場合
こちらが本命。
日経225採用銘柄だけ利用した。計算時間は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 |
株価データ: 日足 銘柄リスト: 日経225採用銘柄 2000/01/06~2021/07/21における成績です。 ---------------------------------------- 全トレード数 2840 勝ちトレード数(勝率) 1613(56.80%) 負けトレード数(負率) 1227(43.20%) 全トレード平均利率 0.33% 勝ちトレード平均利率 2.26% 負けトレード平均損率 -2.21% 勝ちトレード最大利率 32.32% 負けトレード最大損率 -21.11% 全トレード平均期間 4.49 勝ちトレード平均期間 4.01 負けトレード平均期間 5.12 ---------------------------------------- 必要資金 ¥2,861,900 最大ポジション(簿価) ¥2,890,100 最大ポジション(時価) ¥3,065,700 純利益 ¥3,096,100 勝ちトレード総利益 ¥16,856,900 負けトレード総損失 -¥13,760,800 全トレード平均利益 ¥1,090 勝ちトレード平均利益 ¥10,451 負けトレード平均損失 -¥11,215 勝ちトレード最大利益 ¥138,600 負けトレード最大損失 -¥180,000 プロフィットファクター 1.22 最大ドローダウン(簿価) -¥753,000 最大ドローダウン(時価) -¥762,200 ---------------------------------------- 現在進行中のトレード数 1 ---------------------------------------- 平均年利 4.92% 平均年利(直近5年) 1.08% 最大連勝 12回 最大連敗 7回 ---------------------------------------- [年度別レポート] 年度 取引回数 運用損益 年利 勝率 PF 最大DD 2021年 73回 ¥213,900円 7.47% 54.79% 2.00倍 -4.91% 2020年 92回 ¥12,300円 0.43% 50.00% 1.03倍 -17.52% 2019年 117回 -¥139,700円 -4.88% 55.56% 0.76倍 -18.38% 2018年 122回 -¥133,100円 -4.65% 56.56% 0.79倍 -12.94% 2017年 148回 ¥201,100円 7.03% 58.11% 1.44倍 -10.47% 2016年 116回 ¥115,000円 4.02% 60.34% 1.21倍 -8.46% 2015年 145回 ¥290,900円 10.16% 66.90% 1.52倍 -8.35% 2014年 132回 ¥271,500円 9.49% 62.88% 1.59倍 -7.19% 2013年 128回 ¥422,800円 14.77% 64.06% 1.76倍 -10.07% 2012年 139回 ¥299,700円 10.47% 56.12% 1.70倍 -4.65% 2011年 133回 -¥25,300円 -0.88% 54.14% 0.96倍 -10.70% 2010年 145回 -¥249,400円 -8.71% 53.10% 0.69倍 -14.92% 2009年 87回 ¥250,600円 8.76% 58.62% 1.46倍 -12.80% 2008年 82回 -¥450,800円 -15.75% 50.00% 0.53倍 -21.11% 2007年 146回 ¥191,300円 6.68% 58.22% 1.30倍 -9.31% 2006年 154回 ¥220,300円 7.70% 60.39% 1.34倍 -9.27% 2005年 196回 ¥669,100円 23.38% 65.82% 2.39倍 -7.21% 2004年 177回 ¥614,300円 21.46% 65.54% 1.92倍 -10.07% 2003年 135回 ¥790,000円 27.60% 69.63% 2.63倍 -6.96% 2002年 106回 -¥507,200円 -17.72% 48.11% 0.52倍 -12.63% 2001年 129回 ¥113,600円 3.97% 63.57% 1.14倍 -12.41% 2000年 138回 -¥74,800円 -2.61% 53.62% 0.94倍 -11.32% |
利益曲線は次のとおり。
グラフは凸凹ではあるけど、テクニカル指標を別々で使うより曲線の形は良い。
まとめ
コナーズRSIか、虫コナーズかは知らないけれど、オカルトなテクニカル指標をどのように組み合わせても結果は同じじゃないかなーー。
だけど国内外問わず、このテクニカル指標は人気のようでソースコードもGitHubに幾つか見つかる。
時間があればコナーズRSIを使った他のストラテジも挑戦してみよう。
ソースコード
バックテストには無料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 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 |
# loop-type: date-only //============================== require "TIlib" require "Utility" require "TrendCheck" //========================================== // コナーズRSI // // 1) RSI(Close) // 2) ROC(100) の 平均値が10以下 // 3) RSI(UpDownLength) // // ① RS = (n日間のと騰落数の上昇幅の平均) ÷ (n日間の騰落数の下落幅の平均) // ② RSI = 100 - (100 ÷ (RS+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 = 1 // 最大保有日数 $shortSelling = 0 // 空売り戦略 Yes(1)/No(0) $Interest = 1 // 無制限(0) / 単利(1) / 複利(2) $reverse = 0 // 購入順序 昇順(0) / 降順(1) $udcount = 0 // 騰落レシオ利用数 Init() //------------------------------------------------ $RSI = [$code_num] $ROC = [$code_num] $MA20 = [$code_num] $MA60 = [$code_num] $MA20_1 = [$code_num] $MA60_1 = [$code_num] $MA20_4 = [$code_num] $MA60_4 = [$code_num] $MA20_5 = [$code_num] $MA60_5 = [$code_num] $MA20_8 = [$code_num] $MA60_8 = [$code_num] $MA20_9 = [$code_num] $MA60_9 = [$code_num] $MA200 = [$code_num] //------------------------------------------------ InitDone() // 騰落レシオ初期化 $__INIT__ = 1 end def URSI_value(date) // ① RS = (n日間のと騰落数の上昇幅の平均) ÷ (n日間の騰落数の下落幅の平均) // ② RSI = 100 - (100 ÷ (RS+1) ) i = 0 upDay = 0 downDay = 0 upSteak = 0 downSteak = 0 while (i + 1 <= date) if ! ({-1 * i - 1}Close && {-1 * i}Close) return 1000 end if ({-1 * i - 1}Close < {-1 * i}Close) upDay = 1 else upDay = 0 end if ({-1 * i - 1}Close > {-1 * i}Close) downDay = -1 else downDay = 0 end upSteak = upSteak + upDay downSteak = downSteak + downDay i = i + 1 end // RS = (n日間の騰落数の上昇幅の平均) ÷ (n日間の騰落数の下落幅の平均) if (downSteak != 0) rs = ((float)upSteak / date ) / ((float)downSteak / date) // RSI = 100 - (100 ÷ (RS + 1) ) if (rs + 1 != 0) return 100 - 100 / (rs + 1) else return 0 end else return 1000 end end def Main(i) //================================================== // 条件(買条件, 売条件共通部分) //================================================== //まだ上場していない銘柄は株価データがないためnullが返る if (Index == null) return end if ($order[(int)Code] == -1) $order[(int)Code] = i end if ! ($ROC[i] && $RSI[i]) //Tilibのオブジェクト生成 $RSI[i] = RSI_new(3, 0) $ROC[i] = ROC_new(100) $MA20[i] = MA_new(20) $MA60[i] = MA_new(60) $MA20_1[i] = {-1}MA_new(20) $MA60_1[i] = {-1}MA_new(60) $MA20_4[i] = {-4}MA_new(20) $MA60_4[i] = {-4}MA_new(60) $MA20_5[i] = {-5}MA_new(20) $MA60_5[i] = {-5}MA_new(60) $MA20_8[i] = {-8}MA_new(20) $MA60_8[i] = {-8}MA_new(60) $MA20_9[i] = {-9}MA_new(20) $MA60_9[i] = {-9}MA_new(60) $MA200[i] = MA_new(200) //銘柄ごとのグローバル変数を初期化する $hold[i] = 0 return end //指標の計算を1日進める ROC_next($ROC[i]) RSI_next($RSI[i]) MA_next($MA20[i]) MA_next($MA60[i]) MA_next($MA20_1[i]) MA_next($MA60_1[i]) MA_next($MA20_4[i]) MA_next($MA60_4[i]) MA_next($MA20_5[i]) MA_next($MA60_5[i]) MA_next($MA20_8[i]) MA_next($MA60_8[i]) MA_next($MA20_9[i]) MA_next($MA60_9[i]) MA_next($MA200[i]) //================================================== // 保有している(追加購入)&していない(新規購入) //================================================== if (! $hold[i] || $hold[i]) if ! (Close) return end ma20 = MA_value($MA20[i]) ma60 = MA_value($MA60[i]) ma20_1 = MA_value($MA20_1[i]) ma60_1 = MA_value($MA60_1[i]) ma20_4 = MA_value($MA20_4[i]) ma60_4 = MA_value($MA60_4[i]) ma20_5 = MA_value($MA20_5[i]) ma60_5 = MA_value($MA60_5[i]) ma20_8 = MA_value($MA20_8[i]) ma60_8 = MA_value($MA60_8[i]) ma20_9 = MA_value($MA20_9[i]) ma60_9 = MA_value($MA60_9[i]) ma200 = MA_value($MA200[i]) roc = ROC_value($ROC[i]) rsi = RSI_value($RSI[i]) ursi = URSI_value(2) if ! (ma20_9 && ma60_9 && ma20 && ma60 && ma200 && rsi && roc) return end csri = ((float)ursi + rsi + roc) / 3 //================================================== // 売買(買い) //================================================== // 1.20日移動平均線が10日連続で上昇している flag1 = ma20 > ma20_1 && ma20_4 > ma20_5 && ma20_8 > ma20_9 // 2.60日移動平均線が10日連続で上昇している flag2 = ma60 > ma60_1 && ma60_4 > ma60_5 && ma60_8 > ma60_9 // 3.株価が200日移動平均線の上にある flag3 = Close > ma200 // 4.コナーズRSIが10以下 flag4 = 10 >= csri // 5.1~4の条件がそろったら翌日寄せで買う if (flag1 && flag2 && flag3 && flag4) PrintLog("買い候補") $buyflag[i][0] = 1 $buyflag[i][1] = rsi $buyflag[i][2] = 1 $buyCnt = $buyCnt + 1 end end //================================================== // 保有している&本日同一銘柄の買いシグナルが出ていない //================================================== if ($hold[i] && ! $buyflag[i][0]) if ($set[i] < 1) $set[i] = 1 return end $set[i] = $set[i] + 1 //================================================== // 売買(売り) //================================================== // 4) 4期間RSIが55を上回ったタイミングで売る if ($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]) // 当日のCloseで売る 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($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 |