株価や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)
利用にあたっては、他のオシレーター指標やファンダメンタルズとの併用が推奨されています。