見出し画像

RSIパワーゾーン戦略は今でも機能しているか?【スイングトレード研究】

スイングトレードの戦略研究として、ラリー・コナーズの「RSIパワーゾーン戦略」が今も機能しているか調べ、実践する方法を考えてみたいと思います。



RSIパワーゾーンとは

簡潔に言えば、「上昇トレンドにある銘柄を押し目で買って、元のトレンドに復帰したら売る」戦略です。

コナーズは昔からこの類の短期トレード戦略を数々発表してきていますが、『「恐怖で買って、強欲で売る」短期売買法』に掲載されているものをこの投稿では見ていこうと思います。


RSIパワーゾーン戦略のトレードルールは以下です。非常にシンプルです。パラメータの部分は本書には具体的に書いてありますので、興味のある方はそちらをお読みください。

<対象銘柄>
・$SPYを中心とした主なカントリーETF、セクターETF

<セットアップ>
・その日の価格が200日単純移動平均線を上回っている。
・短期間RSIが XX を下回って引ける。

<エントリー>
・大引けにその銘柄を買う。
・ポジションを取っている時に短期間RSIが XX を下回って引けたら、ポジションを2倍に増し玉する。

<イグジット>
・短期間RSIが XX を上回って引けたら、翌日の寄り付きで売る。


検証(そして残念なお知らせ)

本書よれば、S&P500 ETF($SPY)を対象とした1993~2017年の検証では、以下の結果が出たとのこと。

・検証期間:1993~2017
・トレード数:202回(年平均 8.1回)
・勝率:90.59%
・平均リターン:1.73%
・平均保有日数:4.95取引日

年換算リターンは14.0%となり、これを機械的に執行し続けるだけでも市場平均をアウトパフォームする結果となっています。この成績であれば、ポートフォリオの主力としても十分使えそうです。


自分でも同じ条件でバックテストしてみました(Chat GPT 4oで作成したPine Scriptを記事末尾に置いておきます)。以下がその結果です。

・検証期間:1993~2017
・トレード数:331回(年平均 13.2回)
・勝率:86.10%
・平均リターン:1.07%
・平均保有日数:6取引日

増し玉を1トレードと見做す仕様によりトレード数が増え、数字が変化したように見えますが、年換算リターンでは14.1%と、本書とほぼ同じ結果が出ました。


・・・と思いきや、本書の検証期間後である2018~2024でも念のためにテストしてみたら、なんとこの期間のパフォーマンスは大きく下がってしまいました

・検証期間:2018~2024/6/30
・トレード数:80回(年平均 12.3回)
・勝率:68.75%
・平均リターン:0.54%
・平均保有日数:6取引日

勝率と平均リターンが悪化した結果、年換算リターンは6.6%と2017年以前の半分以下になり、単純なバイ&ホールドを大きくアンダーパフォームしてしまいます。もちろん、6.6%の年間利益は取るに足らないレベルだとは言いませんが、メインで運用するには物足りないパフォーマンスです。

RSIパワーゾーン戦略のエッジは失われてしまったのでしょうか。


RSIパワーゾーン戦略(RPZ)とS&P500(SPY)の年間リターンを比較したグラフを作成してみました。

年の下のマークは以下を意味しています。
◎:S&P500をアウトパフォームしている年
◯: S&P500の年間リターンをほぼ捉えている年
✕: S&P500の年間リターンを大きく捉え損なっている、またはマイナスリターンの年
ー:RSIパワーゾーン戦略のトレードが発生しなかった年

これを見ると、2017年以降はほぼ全敗です。2021年のように悪くないリターンを得られている年もありますが、バイ&ホールドの方が利益は良く、この戦略のエッジは近年になって急速に失われた、と結論付けてよさそうです。

RSIの期間を2~14に変えてみたり、エントリーとイグジットのRSIを色々変えてみたり、増し玉をしない設定にしたり、ストップロスを設置したりと、色々といじくり回してみたものの、2018年~2024年の期間で年換算リターンが6.6%を超えるセットアップは見つかりませんでした。
残念ながら、この戦略は90年代や00年代のデータへのカーブフィッティングにすぎなかった、と言わざるを得ないでしょう。


とはいえ、戦略のエッセンスを有効活用できないのか

本来、この戦略のエッジは「恐怖が高まった時に狼狽売りをして、強欲が高まった時にFOMO買いをする」という一般トレーダーの行動バイアスの逆をつくことだったはずです。
強気相場において市場参加者に一時的な恐怖の感情を引き起こす出来事、例えば戦争の勃発、先導株の期待外れの決算報告、政治的混乱などの悪いニュースが生じた時に瞬間的に発生する狼狽売りを押し目買いすることが、この戦略のエッセンスだったはずです。

テクニカル指標やインジケーターに頼らず、「上昇トレンドの時に、その銘柄に関する悪いニュースが突然出され、狼狽売りが行き過ぎたタイミングでエントリーする」という風に再解釈すれば、今でも有効な場面は実はあると考えています。

直近で発生したイベントを例に取って見てみましょう。

イスラエルとハマスの軍事的緊張が伝えられた2024年4月中旬には、$SPYに行き過ぎた売りが発生し、それ以前の「買われすぎ」の状態に戻るまで10日保有すれば、2.9%の利益が取れました。


インドETF($INDA)では、2024年6月上旬の総選挙で経済重視の政策を進めるモディ首相与党の劣勢が伝えられたあと、年初来の上昇幅をほとんど吐き出すほどの狼狽売りが発生しました。この「行き過ぎた恐怖」のタイミングでエントリーし、それ以前のトレンドである「買われすぎ」に戻るまで9日間保有すれば、7.7%の利益が取れました。


個別銘柄でも同じ法則を当てはめられるケースはありそうです。

グローバルな海運企業であるジム・インテグレーテッド・シッピング($ZIM)は、紅海航路のリスク増加による運賃上昇の恩恵を受けるとの見立てから上昇トレンドにありました。2024年6月上旬、イスラエルとハマスが停戦合意に向かうかもしれないという曖昧な悪いニュースが流れ、1週間で最高値から25%下落しました。この明らかな「行き過ぎた恐怖」のピークでエントリーし、元の上昇トレンドに復帰するまで9日間保有すれば、23.3%の利益が取れました。


というわけで、「上昇トレンドの最中に急に出回った悪いニュースによる狼狽売りは、短期間で元のトレンドに戻る」というRSIパワーゾーン戦略の本質的なエッジは、いまだに機能しているとは言えそうです。

一方で、$SPYやその他のカントリーETF、セクターETFで2017年以前に有効だったテクニカル指標のセットアップはかなり精度が悪化しており、そのまま使用してもわずかなリターンは期待できるものの、バイ&ホールドを下回る程度にはあえて採用する意味の薄い戦略になっていると考えています。

個別株に適用するには、「しっかりとした上昇トレンドにあること」「具体的な悪いニュースが出ていること」という条件を満たせば、活用できるケースもありそうです。ただし個別株の場合は、銘柄にまつわるすべての情報やニュースを精査するのに相当な調査時間を費やす必要が出てきます。テクニカル指標だけに頼ったコスパの良いセットアップを作り出すことはなかなか難しそうにも感じています。
普段からウォッチリストに入れている銘柄で、たまたま条件に合致する事象が起きて押し目が生まれた場合に、勝率の高いエントリーポイントとして利用する、くらいの使い方がちょうどよいのかもしれません。



Appendix

RSIパワーゾーン戦略 - Pine Script

//@version=5
strategy("Connors RSI Powerzone Strategy", overlay=true)

// User-defined parameters
rsiLength = input.int(4, title="RSI Length")
smaLength = input.int(200, title="SMA Length")
rsiOversold = input.int(25, title="RSI Oversold Level")
rsiExit = input.int(60, title="RSI Exit Level")
useAddPosition = input.bool(true, title="Use Add Position")
addPositionRsiLevel = input.int(25, title="RSI Level for Add Position")
addPositionQty = input.int(1, title="Add Position Quantity")

// Stop Loss Parameters
useStopLoss = input.bool(true, title="Use Stop Loss")
stopLossPercent = input.float(1.0, title="Stop Loss Percentage", step=0.1) / 100.0

// Date Range Inputs
startYear = input.int(2020, title="Start Year")
startMonth = input.int(1, title="Start Month")
startDay = input.int(1, title="Start Day")
endYear = input.int(2024, title="End Year")
endMonth = input.int(12, title="End Month")
endDay = input.int(31, title="End Day")

// Calculations
rsi = ta.rsi(close, rsiLength)
sma = ta.sma(close, smaLength)

// Entry and Exit Conditions
longCondition = (rsi < rsiOversold) and (close > sma)
exitCondition = rsi > rsiExit
addPositionCondition = (rsi < addPositionRsiLevel) and strategy.position_size > 0

// Date Filtering
startDate = timestamp(startYear, startMonth, startDay, 0, 0)
endDate = timestamp(endYear, endMonth, endDay, 23, 59)
isInDateRange = (time >= startDate) and (time <= endDate)

// Strategy
if (isInDateRange)
    if (longCondition)
        strategy.entry("Long", strategy.long)
    if (useAddPosition and addPositionCondition)
        strategy.entry("Add Long", strategy.long, qty=addPositionQty)
    if (exitCondition)
        strategy.close("Long")
        strategy.close("Add Long")

// Apply Stop Loss
if (useStopLoss)
    strategy.exit("Stop Loss", from_entry="Long", loss=close * stopLossPercent)
    strategy.exit("Stop Loss Add", from_entry="Add Long", loss=close * stopLossPercent)

// Plotting
plot(sma, color=color.blue, title="SMA 200")
hline(rsiOversold, "RSI Oversold", color=color.red, linestyle=hline.style_dashed)
hline(rsiExit, "RSI Exit", color=color.green, linestyle=hline.style_dashed)
plot(rsi, "RSI", color=color.purple)


参考リンク


この記事が気に入ったらサポートをしてみませんか?