投資のためのデータサイエンス

個人の投資活動に役立つデータ分析にまつわる話題を綴ります。

RCI(順位相関指数)による株価データの分析

株価やFX分析におけるオシレーター指標の一つとして、RCI (Rank Correlation Index)があります。これは順位相関に基づく指標で、RSI(相対力指数)と紛らわしいですが全くの別指標です。しかし利用法はRSIに類似しており、80以上で「買われすぎ」、-80以下で「売られすぎ」と判断するほか、異なる時間パラメータの指標による「ゴールデンクロス」や「デッドクロス」も用いられます。しかしRCIの計算機能はTA-LibなどのPythonライブラリには見当たりません。直接計算するコードはネット上にいくつかあります。今回は日本語のブログ記事を参考にしました。
まず、いつものようにYahoo! Financeから変数tickerで指定された銘柄の株価データを取得して、データフレームに格納します。

# ライブラリのインポート
import yfinance as yf
from datetime import datetime, timedelta
from datetime import date
import pandas as pd
import numpy as np
from pandas_datareader import data as pdr
import matplotlib.pyplot as plt
import mplfinance as mpf
# 株価データの獲得
ticker = '4755.T' # 4755は楽天
end = datetime.today()
start = end - timedelta(days=182)  # 6 months before today
yf.pdr_override()
# yahooサイトからデータをダウンロード
df = pdr.get_data_yahoo(ticker, start, end)

次にRCIを計算して、ローソク足チャートの下に表示します。RCIの計算で必要な「終値系列の価格の順位」を、np.argsort()を2度適用して求めているところがポイントのようです。

# subplotとして順位相関指数(RCI)を描画する
# 各種指標の計算関数
def rci(close, timeperiod=9):
    rci = np.full_like(close, np.nan)
    rank_period = np.arange(1, timeperiod + 1)
    for i in range(timeperiod - 1, len(close)):
        rank_price = close[i - timeperiod + 1:i + 1]
        rank_price = np.argsort(np.argsort(rank_price)) + 1
        aa = 6 * sum((rank_period - rank_price)**2)
        bb = timeperiod * (timeperiod**2 - 1)
        rci[i] = (1 - aa / bb) * 100
    return rci
# 指標計算関数を実行して結果をリストに格納する
osc_rci = rci(df['Close'])
# 追加プロットのリストを作成する
osc_plot1 = [
    mpf.make_addplot((osc_rci), panel=2, ylabel='RCI', secondary_y=False)
]
# 表題と凡例
ch_title = 'Stock Price Chart for ' + ticker
line_titles = ['RCI']
# チャート描画:指定可能なtypeは'ohlc'(default), 'candle', 'line', 'renko', 'pnf'
fig, axes = mpf.plot(df,type='candle',figsize =(9,6), style='yahoo',
         addplot=osc_plot1,volume=True,mav=(15,25,75), returnfig=True)
# 表題と凡例の指定
axes[0].set_title(ch_title)
axes[4].legend(line_titles)

利用にあたっては、他のオシレーター指標やファンダメンタルズとの併用が推奨されています。