RCI(順位相関指数)を用いた銘柄スクリーニングの精度と出口戦略の重要性
はじめに
これまで記事にした銘柄スクリーニングでは、テクニカル指標の根幹として移動平均線(MA)
を採用してきました。MAはトレンドの方向性を捉える上で非常に安定しており、信頼性の高い指標です。しかし、その性質上、どうしても実際の値動きに対して反応が遅れる「遅行指標」
であるという弱点があると感じています。
今回はRCI(順位相関指数)
という別のテクニカル指標を導入し、スクリーニング戦略として使えるのかをバックテストで検証します。
また、これまでの検証では、エントリー後の保有期間を事前に設定していましたが、実際の相場ではトレンドの長さは一定ではありません。そのため、固定期間での手仕舞いでは、トレンドが続いているのに早めに手仕舞いしてしまったり、逆にトレンドが終了しているのに保有し続けてしまったりする可能性があります。そこで今回は、RCIのデッドクロスを出口シグナルとして活用し、トレンドの終了を捉える出口戦略の有効性も検証します。
これまでの経緯
本記事は、Pythonによる株式スクリーニング自動化・実践の続編です。これまでの背景や検証の流れは、以下の記事をご確認ください。
- 銘柄情報データベース作り始めたけど地味すぎて飽きた
- スクリーニング結果自動通知bot、結果の可視化とXへの投稿はできるようになった
- 生成AI無料期間にスクリーニング結果自動通知botを作り始めた
- 今回のモデルのスクリーニング速度を100倍向上した方法
- yfinance由来の軽量データセット構築
- 今回のモデルの改善点
- 今回のスクリーニングモデルの精度
- 相場状況を簡易的に数値化する
- 財務スクリーニング
RCI(順位相関指数)とは?
RCI(Rank Correlation Index)は、一定期間における「時間」
と「価格」
の順位にどれだけ相関があるかを示すオシレーター系のテクニカル指標です。「日付が新しくなるにつれて、価格の順位も上がり続けているか」
を数値化したもので、トレンドの勢いや過熱感を測るのに使われます。
⚪︎ RCIの基本的な見方
RCIは-100%から+100%の範囲
で表示され、以下のように解釈されます:
-
+100%に近い
: 日々高値を更新し続ける、非常に強い上昇トレンド -
-100%に近い
: 日々安値を更新し続ける、非常に強い下落トレンド
急激な移動がトレンド転換のサイン
RCIの特徴として、+100%と-100%の間を急激に移動していく時がトレンドの転換点
である場合が多いです。
-
+100%付近から急激に下落
: 上昇トレンドの終了、下落トレンドの開始 -
-100%付近から急激に上昇
: 下落トレンドの終了、上昇トレンドの開始 -
0%付近での方向転換
: レンジ相場からトレンド相場への転換
⚪︎ RCIの特徴
移動平均線が「価格の平均値」
を見るのに対し、RCIは「トレンドの綺麗さ、勢い」
を見る指標と言えます。この性質により、トレンドの転換点をMAよりも早く捉えられる可能性があります。
RCIの利点
- 緩やかな動き: 価格の変動幅ではなく順位を基に計算するため、RSIと比べて緩やかな動きを示す
- トレンド判断が容易: 値幅が小さい時でも買いと売りのどちらが優勢なのか判断しやすい
- 過熱感の測定: 相場の過熱感を客観的に数値化できる
RCIの注意点
-
強いトレンドでは機能しにくい
: 価格が上昇や下落を続けると、RCIが+100%や-100%付近で横ばいになり、売買シグナルが出にくくなる -
ダマシの可能性
: 他のテクニカル指標と同様に、シグナルと逆の方向に相場が動くことがある
⚪︎ RCIの計算方法
RCIは、以下の計算式で求められます。
RCI = (1 - 6d / n(n²-1)) × 100
-
d
: ある期間内の「時間(日付)の順位」
と「価格の順位」
の差の2乗和 -
n
: 計算期間
計算の手順
- 直近時点を含む過去n期間の終値を準備する
- 価格水準の高い終値から順位をつける(高い価格ほど順位が高い)
-
各時点ごとの
「終値順位」
と「日付順位」
の差を求める** - それらの差を2乗する
- これらの2乗値の合計値(SUM)を求める
- nとSUMの数値を計算式に当てはめる
パラメーター設定
RCIの計算期間には特別な決まりはありませんが、一般的に以下の期間がよく利用されています:
-
短期
: 9日間(敏感) -
中期
: 26日間(ややマイルド) -
長期
: 52日間(おまえ、動いてんのか?って程マイルド)
今回は短期(9日)、中期(26日)、長期(52日)の3本を使います。
def calculate_rci(df_group, periods=[9, 26, 52]):
df = df_group.copy()
for period in periods:
def rci_calc(x):
if len(x) < period:
return np.nan
price = pd.Series(x)
price_rank = price.rank(ascending=False)
date_rank = np.arange(period, 0, -1) # 新しいほど順位が高い
d_sq = np.sum((price_rank.values - date_rank)**2)
return (1 - 6 * d_sq / (period * (period**2 - 1))) * 100
rci = df.groupby(level='Ticker')['Close'].transform(
lambda x: x.rolling(window=period).apply(rci_calc, raw=False)
)
df[f'RCI_{period}'] = rci
return df[[col for col in df.columns if col.startswith('RCI_')]]
使用データと検証設計
RCIを用いたスクリーニングの有効性を検証するためのバックテストの設計は下記の通りです。
以前のバックテスト高速化の記事で紹介した、V3のコード(OHLCVのデータセットから、必要なテクニカル指標を計算してデータフレーム化→対象銘柄をループさせて判定基準に合致したものをリストに追加→リターン・シャープレシオなど評価)にRCIの算出・判定部分を追加しただけで、ほとんど内容は変えてみません。財務・地合いスコア(マクロ)の部分はそのまま流用していますし、RSIもそのまま使っています。今回は、全体のコードは割愛させていただきます。
⚪︎ 対象銘柄
検証対象は、以前の記事で紹介した財務スクリーニングを通過した、財務的に妥当な銘柄群です。
各スクリーニング日において、プライム市場の約1600銘柄から約200〜300銘柄に絞り込んだ上で、今回のRCIを用いた条件判定を行いました。
⚪︎ 評価期間とスクリーニング日
検証の信頼性を高めるため、バックテストの対象日を拡充しました。前回の移動平均線の検証では各スコア5日ずつでしたが、今回は2022年1月〜2024年9月の期間から、各地合いスコア(-3〜+3)ごとに30日ずつ、合計210日をランダムに抽出し、試験の反復数を増やしています。これにより、前回よりは統計的な信頼性が向上していると考えられrます。
⚪︎ 今回の選抜で狙っている兆候の概要
今回のRCI戦略は、「売られすぎの底値圏での収束から、短期RCIの反転上昇を捉える」
という押し目買いのタイミングを狙っています。
具体的には、「中期RCIが売られすぎ圏(-100付近)で、短期RCIとの乖離が小さく、短期RCIが上向き」
というパターンを判定基準にしています。
-
中期RCIがマイナスかつ一定の値以下
: 下落トレンドが十分に進み、売られすぎの状態 -
短期・中期RCIの収束
: 短期的な下落の勢いが弱まり、中期トレンドに追いついてきた状態 -
短期RCIの傾きが正
: 最も敏感な短期RCIが明確に上向きに転じ、反転の兆候を確認
イメージ(昨年の日本農薬の値動きから)
短期RCI(紫)が中期(黄)を底で上抜けした瞬間を青丸(GC)、逆に天井で中期が長期(緑)を下抜けした瞬間を赤丸で表記。移動平均線も同様。
今回のスクリーニングでは、短期RCIが中期を底で上抜けした瞬間を検出する。
このパターンをコードで定義するために、上記の3つの判定基準に用いるパラメータ(RSI範囲、RCI乖離上限、傾き評価期間、傾き下限)を様々な値で変化させて、最適な組み合わせを探るため複数のスクリーニングパターンを作成し、検証しました。
検証したスクリーニングパターン
パターン | RSI範囲 | RCI乖離上限(rci_eps) | 傾き評価期間(slope_period) | 傾き下限(rci_slope_thresh) |
---|---|---|---|---|
1 | 25〜50 | ±5 | 1日間 | 0.5 |
2 | 25〜50 | ±10 | 1日間 | 0.5 |
3 | 25〜50 | ±20 | 1日間 | 0.5 |
4 | 25〜50 | ±40 | 1日間 | 0.5 |
5 | 30〜60 | ±5 | 1日間 | 0.5 |
6 | 30〜60 | ±10 | 1日間 | 0.5 |
7 | 30〜60 | ±20 | 1日間 | 0.5 |
8 | 30〜60 | ±40 | 1日間 | 0.5 |
9 | 35〜70 | ±5 | 1日間 | 0.5 |
10 | 35〜70 | ±10 | 1日間 | 0.5 |
11 | 35〜70 | ±20 | 1日間 | 0.5 |
12 | 35〜70 | ±40 | 1日間 | 0.5 |
13 | 40〜75 | ±5 | 1日間 | 0.5 |
14 | 40〜75 | ±10 | 1日間 | 0.5 |
15 | 40〜75 | ±20 | 1日間 | 0.5 |
16 | 40〜75 | ±40 | 1日間 | 0.5 |
バックテストの評価方法
スクリーニング条件を通過した銘柄について、以下の方法でリターンを計算し、パフォーマンスを評価しています。
⚪︎ 固定期間での精度検証
エントリー後10日、20日、30日、60日、90日の各時点での終値を使用してリターンを算出します。
計算式
: (将来の終値 - スクリーニング日終値) / スクリーニング日終値 × 100
⚪︎ デッドクロスまで保有した場合の精度検証
エントリー後、以下の3パターンのデッドクロスが発生するまで保有し続け、その時点でのリターンを計算します:
-
短期 vs 中期デッドクロス
: RCI(9)とRCI(26)が両方ともプラス域で、RCI(9)がRCI(26)を下向きに突き抜けた時点 -
短期 vs 長期デッドクロス
: RCI(9)とRCI(52)が両方ともプラス域で、RCI(9)がRCI(52)を下向きに突き抜けた時点 -
中期 vs 長期デッドクロス
: RCI(26)とRCI(52)が両方ともプラス域で、RCI(26)がRCI(52)を下向きに突き抜けた時点
注意
: バックテストに使用したデータの期間内でデッドクロスが発生しなかった銘柄については、その銘柄のデータを除外して評価しています。
⚪︎ 評価指標
各パターンについて以下の指標を計算しました:
-
平均リターン
: 全銘柄のリターンの平均値(%) -
勝率
: プラスリターンを記録した銘柄の割合(%)(記事では割愛) -
平均保有期間
: デッドクロスまでの平均保有日数 -
シャープレシオ
:平均リターン / リターンの標準偏差
-
平均銘柄数
: 各パターンでスクリーニング条件を通過した銘柄数の平均値
本当はドローダウンや取引手数料なども考慮した評価をするべきなのでしょうが、やってません。
気が向いたらやります。
バックテスト結果と考察
⚪︎ 概要
固定期間保有
では平均リターン月換算3%以下、シャープレシオ0.3-0.6と不十分な結果でした。一方、デッドクロス出口戦略
では平均リターン5%以上、シャープレシオ1.0以上と良好な結果が得られました。ただし、保有しているデータの期間内にデッドクロスが発生しない銘柄も多く、実際の運用では結果が異なるところは留意点です。
結果のポイント
-
固定期間保有
:実用的でない低いパフォーマンス -
デッドクロス出口戦略
:中長期投資として有効な可能性 -
出口戦略の重要性
を実証
⚪︎ 固定期間保有でのパフォーマンス
通過した各銘柄を10日、30日、60日、90日の固定期間で保有した場合のリターンを検証しました。
結果
- いずれの期間においても平均リターンは月換算3%以下
- シャープレシオは0.3-0.6程度と、不十分な結果
- 地合スコアが低い-3に限り精度が高い傾向
考察
今回選抜基準にしたRCIのサインがトレンドの「初動」
を捉えるものであるため、サインが出た後、すぐに大きなトレンドが発生することもあれば、小さな反発で終わってしまうこともあります。固定期間での手仕舞いでは、このばらつきに対応しきれないため、このような結果となりました。バラツキが大きくリスクも高いため、実用的には不十分です。
平均はスクリーニング1回あたりの値
⭐︎マークは、シャープレシオ1以上かつ選抜銘柄数1以上20以下のパターンにつけています。地合いスコアがマイナスの時(相場が悪いとき)の方が若干、色が濃いです。傾向は移動平均の時と同様でした。
⚪︎ デッドクロス出口戦略でのパフォーマンス
「RCIがプラス域の高値圏でデッドクロスするまで保有し続ける」場合、結果は興味深いものでした。
結果
-
平均保有期間
:半年-1年程度になり、中長期トレードに該当 -
平均リターン
:5%以上 -
シャープレシオ
:多くのパターンで1.0を超え良好
パラメータとの関係
-
地合いスコア
:精度の高さと地合が関係してなさそう -
RSI範囲
:RSIが低い範囲の方が、シャープレシオは高い傾向 -
RCI乖離
:乖離幅が一番低い5の時は選抜が厳しいため精度も高いと思われたが、それよりも幅が広い時の方がシャープレシオが高い傾向
考察
教科書通りですが「RCIの底値圏での収束と反転で入り、高値圏でのデッドクロスで出る」
という方法が、トレンドの転換点から終了までを捉える上で有効である可能性を示唆しています。
また、今回の結果で出口をデッドクロスの時にした場合、地合スコアにかかわらすシャープレシオが高いパターンがありました。原因は明確ではありませんが、RCIのマイナス域でのゴールデンクロスとプラス域でのデッドクロスが相場と連動しているからかもしれません。
そのあたりは、具体的な数値が欲しいので、今後分析評価を行なってみたいところです。
いずれにしろ、ファンダ・マクロを踏まえた上でのRCIを用いたスクリーニングも実用性があるのかもしれないと思われました。
ただし、実際のバックテストでは、デッドクロスが発生しなかった銘柄が含まれており、それらは統計から除外されているため、今回の結果と実際の運用が異なることは考慮すべきです。
平均はスクリーニング1回あたりの値
⭐︎マークは、シャープレシオ1以上かつ選抜銘柄数1以上20以下のパターンにつけています。
平均はスクリーニング1回あたりの値
⚪︎ 1回あたりに抽出される平均銘柄数
各地合いスコア・RSI範囲・RCI乖離の組み合わせによるスクリーニング1回あたりの平均ヒット銘柄数を確認しました。
主要な傾向
-
地合いスコア
:スコア-1で極大(平均8-11銘柄)、極端な相場(-3、+2、+3)では銘柄数が少ない -
RSI範囲
:低めの範囲(25-50、パターン1-4群)で銘柄数が多い、高くなるにつれて選抜銘柄数が減少 -
RCI乖離
:小さい乖離(±5)では銘柄数が少ない、大きい乖離(±40)では銘柄数が多い(当たり前の結果)
注意点
これはスクリーニング1回あたりの平均値であり、厳しいパターンではヒットしない日もあれば、連続でヒットする場合もあります。毎日自動で運用してヒットを気長に待つのが良いかもしれません。
まとめ
本記事では、RCIを中心としたスクリーニングの方法の精度を検証しました。
これまで移動平均線を中心として使用していましたが、RCIを中心とした新しいアプローチを試行しました。
⚪︎ 検証結果
-
固定期間での運用は不十分: 10日〜90日の固定期間での保有では、月換算3%以下の平均リターンと0.3-0.6程度のシャープレシオにとどまり、実用的が乏しいと考えられました。
-
デッドクロス出口戦略の有効性: RCIのデッドクロスまで保有では、平均リターン10-20%(保有期間内に)程度、シャープレシオ1.0以上の結果が得られました。
-
中長期投資への転換: 精度が良かった方法は平均保有期間が半年〜1年程度となり、短期スイングから中長期保有投資への視点をもつきっかけになりました。
⚪︎ 今後の課題と注意点
-
バックテストの制約: 保有しているデータの期間内にデッドクロスが発生しなかった銘柄は統計から除外されているため、実際の運用では結果が異なる可能性があります。
-
パラメータの最適化: RCI9, 26, 52よりもスパンが短い指標の場合、より短期で安定した結果が出せるかも知れません。
-
リスク管理の強化: ドローダウンや取引手数料を考慮した評価が今後の課題です。特にドローダウンが深刻だと思います。保有している時に一気に-10%!!! このまま持っていても大丈夫なのかよ?となりますよね。投資は心理的な問題が大きいです。
このように、改善の余地が多々ある方法hですが、今回の検証結果は、テクニカル指標の選択と出口戦略の重要性を知る良いきっかけになりました。今後も、より実用的な投資戦略の開発を目指して研究を続けていきたいと思います。
参考
免責と注意点
この記事は、個人の投資研究の一環として公開したものです。参考情報であり、売買判断を保証するものではありません。投資判断は自己責任でお願いします。
検証は、各地合いスコアに対して30日のみを使用しており、さらなる統計的な裏付けが必要です。同様の分析を各スコアに対して100日以上のスクリーニング日で実施した場合、結果や解釈が変わる可能性があります。
実際の運用にあたっては、地合い・セクター・ファンダメンタルズなど、複数の要因を組み合わせた判断が不可欠です。
補足
+60%にまで跳ねる銘柄が眠っているところが、期待を膨らませてくれる結果。
ただし-20%が含まれているから、それに当たった時は痛い。
2025年7月27日 公開初期の内容の、チャートに不備があったため、修正しました。