[기술적 분석] 지표/전략 : 상대 활력 지수 (RVI, RVGI, Relative Vigor Index)

반응형

 

  이번에 소개하는 RVI는 일전의 RVI(Relative Volatility Index)와는 다른 Relative Vigor Index이다. 상대 변동성 지수와 구별하기 위해 RVGI라고 표기하기도 한다. 상대 활력 지수는 존 엘러스(John Ehlers)라는 엔지니어가 만든 지표로 고가-저가 차이에 비해 종가-시가 차이가 얼마나 되는지를 측정하는 모멘텀 지표다. 절댓값을 취하지 않으므로 방향성을 띄는데, 이 값을 대칭 가중 이동 평균 (SWMA, Symmetric Weighted Moving Average) 하여 오실레이터로 사용한다.

 

  다른 오실레이터 지표들처럼 RVI가 SWMA를 상승 돌파하면 매수, RVI가 SWMA를 하락 돌파하면 매도 포지션을 취하는 게 기본적인 전략이며, 여기에 구간 밴드를 씌운다던가 기울기를 고려한다던가 하는 추가적인 조건을 넣어 전략을 수립하기도 한다. 단순히 크로스오버, 코로스 언더로 대응할 경우, 시그널이 굉장히 자주 발생할 수 있으며 모멘텀 지표이다 보니 횡보장에서 거래비용으로 지불하는 금액이 꽤 나가면서 수익률이 악화될 수 있다. 가령, 방향성(음수인지 양수인지) 정도만 고려하여 전략을 보정해도 수익률에는 크게 도움이 된다.

 

상대 활력 지수 (RVI, RVGI, Relative Vigor Index)

반응형

 

  마지막으로 상대 활력 지수 (RVI, RVGI, Relative Vigor Index) 트레이딩 뷰 파인 스크립트 소스와 pandas-ta 소스를 공유하며 마친다.

 

  • 상대 활력 지수 (RVI, RVGI, Relative Vigor Index) 트레이딩 뷰 파인 스크립트 지표 소스
//@version=5
indicator(title="Relative Vigor Index", shorttitle="RVGI", format=format.price, precision=2, timeframe="", timeframe_gaps=true)

len = input.int(14, title="Length", minval=1)
rvi = math.sum(ta.swma(close-open), len)/math.sum(ta.swma(high-low),len)
sig = ta.swma(rvi)

plot(rvi, color=color.green, title="RVGI")
plot(sig, color=color.red, title="Signal")

 

 

  • 상대 활력 지수 (RVI, RVGI, Relative Vigor Index) 트레이딩 뷰 파인 스크립트 전략 소스
//@version=5
strategy(title="Relative Vigor Index", shorttitle="RVGI", margin_long=100, margin_short=100, default_qty_type=strategy.percent_of_equity, default_qty_value=50, commission_type=strategy.commission.percent, commission_value=0.2, pyramiding=0)

len = input.int(14, title="Length", minval=1)
rvi = math.sum(ta.swma(close-open), len)/math.sum(ta.swma(high-low),len)
sig = ta.swma(rvi)

plot(rvi, color=color.green, title="RVGI")
plot(sig, color=color.red, title="Signal")

startDate = input.time(defval=timestamp("01 Jan 1970 00:00 +0000"), group = "Test Range")
finishDate = input.time(defval=timestamp("31 Dec 2025 24:00 +0000"), group = "Test Range")
time_condition = time >= startDate and time <= finishDate
 
if(time_condition)
	if ta.crossover(rvi, sig)
		strategy.entry("매수", strategy.long, oca_type=strategy.oca.cancel, comment="매수")
	if ta.crossunder(rvi, sig)
		strategy.close_all('매도')
 
bgcolor(strategy.position_size > 0 ? color.new(color.yellow,90) : na)

 

 

  • 상대 활력 지수 (RVI, RVGI, Relative Vigor Index) pandas-ta 소스
import pandas as pd
import pandas_ta as ta
import FinanceDataReader as fdr

data = fdr.DataReader('005930')
rvgi = ta.rvgi(open_ = data['Open'], high = data['High'], low = data['Low'], close = data['Close'],  length=14, swma_length = 4)
data = pd.concat([data, rvgi], axis=1)
data.dropna(inplace=True)
반응형