RVI(Relative Vigor Index)

 

概要
図1 RVIの描画例

1993年にドナルド・ドーシ―によって開発されたオシレーター系テクニカル指標です。相場のボラティリティの拡大と縮小を判断する指標で、上昇トレンドでは一日の終値が始値より高く、下降トレンドでは逆に終値が始値より安いとの考え方を基本としています。

RVIはRSIを応用した計算式から計算されています。RSIが値段の変動から計算するのに対し、RVIは高値と安値の標準偏差から計算し、図1のように0を基準として-1.0から1.0の間の動きからボラティリティの方向性を判断します。

計算方法(日足の場合)

当日を含めて4日分の始値、終値、高値、安値を使って計算します。簡単のため何段階かに分けて計算します。

  1. 終値と始値の差をNとし、高値と安値の差をDとしてNとDを計算します
  2. Nからnumerator(分子)をDからdenominator(分母)を計算します
  3. RVIは任意の期間nでSMA(numerator, n) 、 SMA(denomirator, n) を計算して、SMA(numerator, n)をSMA(denomirator, n) で割ったものになります

nとしては日足では10が良く使われます。

$$ \rm{} N_{当日} = 終値(当日) – 始値(当日) \\ N_{1日前} = 終値(1日前) – 始値(1日前) \\ N_{2日前} = 終値(2日前) – 始値(2日前) \\ N_{3日前} = 終値(3日前) – 始値(3日前) \\ numerator = ( N_{当日} + 2 \times N_{1日前}  + 2 \times N_{2日前}  + N_{3日前}  ) / 6 \\ D_{当日} = 高値(当日) – 安値(当日) \\ D_{1日前} = 高値(1日前) – 安値(1日前) \\ D_{2日前} = 高値(2日前) – 安値(2日前) \\ D_{3日前} = 高値(3日前) – 安値(3日前) \\ denominator = ( D_{当日} + 2 \times D_{1日前}  + 2 \times D_{2日前}  + D_{3日前}  ) / 6 \\ RVI = SMA(numerator, n) / SMA(denominator, n) \\ 次にシグナルSignalを計算します。 \\ Signal = (RVI + 2 \times RVI_{1日前} \quad + 2 \times RVI_{2日前} \quad + RVI_{3日前} \quad ) / 6 $$
Pythonによる実装

必要なライブラリを読み込みます

!pip install mpl_finance #Collaboratoryに入っていないライブラリを読み込みます
import matplotlib
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import pandas as pd
import mpl_finance
import sys
import numpy as np
from datetime import datetime
from matplotlib.offsetbox import OffsetImage, AnnotationBbox
import requests
import io

疑似データを読み込みます

#ファイルの読み込み
URL = "https://neulab.co.jp/wp-content/uploads/pseudo_data.csv" #csvファイルのURL

datafile = requests.get(URL)#ファイルの読み込み

#データフレームの作成
df_temp = pd.read_csv(io.BytesIO(datafile.content), header=0, index_col=0, parse_dates=True, encoding="UTF-8")

df = df_temp.loc[:,['Open','High','Low','Close']]
df.head()

RVIを計算します

df_ma1 = df['Close'] - df['Open']
df_ma2 = df_ma1.shift(1)
df_ma3 = df_ma1.shift(2)
df_ma4 = df_ma1.shift(3)
df_ma = (df_ma1 + 2*df_ma2 + 2*df_ma3 + df_ma4)/6

df_ra1 = df['High'] - df['Low']
df_ra2 = df_ra1.shift(1)
df_ra3 = df_ra1.shift(2)
df_ra4 = df_ra1.shift(3)
df_ra = (df_ra1 + 2*df_ra2 + 2*df_ra3 + df_ra4)/6

df_rvi_avg = df_ma.rolling(4).mean()/df_ra.rolling(4).mean()

df_rvi_sig1 = df_rvi_avg
df_rvi_sig2 = df_rvi_avg.shift(1)
df_rvi_sig3 = df_rvi_avg.shift(2)
df_rvi_sig4 = df_rvi_avg.shift(3)
df_rvi_sig = (df_rvi_sig1 + 2*df_rvi_sig2 + 2*df_rvi_sig3 + df_rvi_sig4)/6

matplotを使ったチャートの描画例です

canvas_color = '#fffafa'
line_color = '#c8ced1'
font_color = '#171510'
colorup = '#bf0000'
colordown = '#006fbf'

n_data = -100
data = df[n_data:]
ohlc = np.vstack((range(len(data)), data.T)).T

fig, (ax1, ax2) = plt.subplots(2, 1, gridspec_kw={'height_ratios': [10, 6]}, sharex=True, figsize=(12,9))
fig.patch.set_facecolor(canvas_color)
ax1.patch.set_facecolor(canvas_color)
mpl_finance.candlestick_ohlc(ax1, ohlc, width=0.5, alpha=1, colorup=colorup, colordown=colordown)
ax2.patch.set_facecolor(canvas_color)
ax2.plot(range(len(data)), df_rvi_avg.values[n_data:], color='red', ls='-', label='RVI')
ax2.plot(range(len(data)), df_rvi_sig.values[n_data:], color='blue', ls='-', label='RVI Signal')
ax1.grid()
ax2.grid()

#ロゴ読み込み
logoURL = "https://neulab.co.jp/wp-content/uploads/logo.png" #logoファイルのURL
img_c = plt.imread(logoURL)
imagebox = OffsetImage(img_c, zoom=0.020) #画像をimageboxにいれる。
imagebox.image.axes = ax1
im_sabo = AnnotationBbox(imagebox, (0, 9850), xybox=(0, 9900), xycoords="data", boxcoords="data", pad=0.3, frameon=False)

l1,l2 = ax2.get_legend_handles_labels()
ax2.legend(l1,l2, fontsize=14, edgecolor='none', facecolor=canvas_color)

ax1.add_artist(im_sabo)
ax1.set_ylabel("Price of Something", fontsize=22)
ax1.set_ylim(9000., 10000.)
ax1.yaxis.tick_right()
ax1.yaxis.set_label_coords(0, 0.5)
ax1.tick_params(labelsize=24, labelcolor=font_color, color=line_color)

ax1.spines['left'].set_linewidth(0)
ax1.spines['right'].set_linewidth(0)
ax1.spines['top'].set_linewidth(0)
ax1.spines['bottom'].set_linewidth(0)

ax2.yaxis.tick_right()
ax2.set_ylim([-1,1])
ax2.tick_params(labelsize=22, labelcolor=font_color, color=line_color)
#ax2.set_yticks(np.linspace(0,100,6))

ax2.spines['left'].set_color(line_color)
ax2.spines['right'].set_color(line_color)
ax2.spines['top'].set_color(line_color)
ax2.spines['bottom'].set_color(line_color)

xtick0 = 2
plt.xticks(range(xtick0,len(data),12), [x.strftime('%m/%d') for x in df_rvi_avg.index][xtick0::12])

plt.subplots_adjust(left=0.05, right=0.89, bottom=0.1, top=0.99)
plt.grid(which='major',color=line_color,linestyle='-')
plt.grid(which='minor',color=line_color,linestyle='-')

ax2.grid(linestyle='--', lw=1)
ax1.set_axisbelow(True)

fig.savefig('RVI.png', facecolor=fig.get_facecolor(), edgecolor='none')

以上のコードをGoogle社の提供しているColaboratory上で公開しており、実際に動作させることができます。

リンク先はこちら

RVIを使った予想

図2がRVIの使用例となります。分かりやすい5点のみ図示しています。

図2 RVIを使った予想例
注意点

図2のように交点が非常に多くダマシが多くなるので、トレンド系のテクニカル指標や、他のオシレーター系の指標と併用することで、信頼度を高めることをお勧めします。


※このHPページで紹介しているテクニカル指標を使った取引ルールや売買シグナルの見方は一般的な考え方に基づくものであり、利益の増加や損失の減少を保証するものではありません。ご自身の判断にてお取引いただきますようお願いいたします。


現在、ニューラボでは人工知能による取引アルゴリズムを開発中です。11月にリリース予定。乞うご期待!
自動取引にご興味を持たれましたら お問い合わせページよりお気軽にお問合せください。