1. 가격이 아닌 '변동성의 방향'을 묻다
도널드 도시(Donald Dorsey)는 웰즈 와일더가 개발한 [지표 백과 007] RSI(상대강도지수)를 매우 훌륭한 지표로 평가했습니다. 하지만 RSI 단독으로는 횡보장에서 속임수(휩쏘)가 너무 많다는 약점을 지적했습니다.
그는 RSI를 완벽하게 보완할 '확인 지표(Confirming Indicator)'를 만들기 위해 천재적인 발상을 합니다. RSI의 수학적 구조(비율 공식)는 그대로 가져오되, 그 계산의 재료를 '가격의 변화량'에서 '가격의 표준편차(Standard Deviation, 변동성)'로 완전히 교체해 버린 것입니다. 이를 통해 탄생한 상대적 변동성 지수(RVI)는 주가가 오를 때 변동성이 커지는지, 내릴 때 커지는지를 0~100 사이의 직관적인 오실레이터로 계량화하여 시장에 숨겨진 진짜 폭발의 방향을 짚어냅니다.
(참고: 앞서 다룬 070번 RVI(Relative Vigor Index, 상대적 비거 지수)와 약자는 같지만, 수식과 철학이 완전히 다른 변동성 지표입니다.)
2. 수리적 원리와 계산 구조
RVI는 일정 기간(보통 10일)의 표준편차를 구하고, 가격이 상승한 날과 하락한 날로 나누어 이를 지수 이동평균(보통 14일)으로 다듬어 산출합니다.
Step 1. 10일 표준편차(SD) 및 상승/하락 변동성 분리
지정된 $n$일(보통 10일) 동안의 종가 표준편차(SD)를 구합니다. 당일 종가가 전일 종가보다 상승했다면 그날의 상승 변동성($Up\_Vol$)에 $SD$를 할당하고 하락 변동성은 0으로 둡니다. 반대라면 하락 변동성($Down\_Vol$)에 $SD$를 할당합니다.
Step 2. 14일 지수 평활화 및 RVI 산출
분리된 상승 변동성과 하락 변동성의 $m$일(보통 14일) 지수 이동평균(EMA)을 각각 구합니다. 그리고 상승 변동성 EMA를 전체 변동성 EMA 합으로 나누어 100을 곱합니다. (RSI와 완전히 동일한 비율 구조입니다.)
$$Up\_Vol_t = \begin{cases} SD_t & \text{if } Close_t > Close_{t-1} \\ 0 & \text{otherwise} \end{cases}$$
$$Down\_Vol_t = \begin{cases} SD_t & \text{if } Close_t < Close_{t-1} \\ 0 & \text{otherwise} \end{cases}$$
$$RVI = \frac{EMA(Up\_Vol, 14)}{EMA(Up\_Vol, 14) + EMA(Down\_Vol, 14)} \times 100$$
3. 실전 매매 활용법 (변동성 방향 판독 테이블)
RVI는 0부터 100 사이를 오가며 50을 추세의 중심선으로, 70과 30을 변동성의 과열/침체 구간으로 설정합니다.
| 시그널 형태 | 현상 설명 (변동성의 흐름) | 실전 매매 대응 전략 (Action) |
|---|---|---|
| 강력한 듀얼 컨펌 (RSI + RVI) |
RSI가 50을 넘어 매수 신호를 보낼 때, RVI 역시 50을 돌파함 | 승률 극대화 진입. 도널드 도시가 의도한 최고의 시스템 로직입니다. 가격(RSI)과 변동성(RVI)이 동시에 상방을 가리킬 때만 매수하여 가짜 상승(휩쏘)을 원천 차단합니다. |
| 극단값 70 / 30 룰 (Overbought/Oversold) |
RVI 지표가 70을 초과하거나 30을 이탈함 | 단기 역추세 및 익절 타점. 70 이상은 변동성이 상승 방향으로 과도하게 팽창했음(과매수)을 뜻하므로 단기 조정을 대비한 익절을 고려해야 합니다. |
| 변동성 다이버전스 (Divergence) |
주가는 고점을 갱신하며 오르는데, RVI는 고점을 낮추며 하락함 | 상승 에너지 고갈 경고. 가격은 꾸역꾸역 오르고 있지만, 이를 폭발적으로 밀어 올리는 '변동성(표준편차)' 에너지가 죽어가고 있음을 의미하는 명확한 하락 경고입니다. |
4. 차트에서 나타나는 수리적 특성: 바이오플러스(A099430) 분석 사례
가짜 반등을 침묵으로 걸러내고, 진짜 추세 폭발만을 잡아내는 바이오플러스의 RVI 분석 사례입니다.

- 추세 폭발과 변동성 팽창: 차트 좌측, 2025년 9월 중순의 강력한 랠리 구간을 보십시오. 주가가 급등하며 표준편차가 팽창하자, 하단의 보라색 RVI 선이 단숨에 50 중심선을 뚫고 70(과매수) 기준선 위로 수직으로 솟구칩니다. '상승 방향으로의 변동성 폭발'을 지표가 완벽하게 증명한 것입니다.
- 휩쏘(가짜 반등) 방어 능력: 10월부터 이듬해 1월까지 이어지는 기나긴 하락 및 횡보 구간이 RVI의 진가를 보여줍니다. 주가가 잔파도를 만들며 간헐적으로 반등을 시도하지만, RVI는 철저하게 50 중심선 아래에 머물며 진입을 금지시킵니다. 변동성이 뒷받침되지 않는 가짜 반등에 속아 계좌가 녹아내리는 것을 막아낸 최고의 골키퍼 역할을 수행했습니다.
5. 장점 및 한계
- 장점: 가격 기반의 보조지표(RSI, MACD, 이동평균선 등)가 보내는 신호를 최종적으로 '필터링'하는 확인 지표로서 현존하는 최고의 승률을 보여줍니다. 변동성이 수반되지 않는 억지스러운 가짜 돌파를 기가 막히게 걸러냅니다.
- 한계: 가격의 방향성이 모호하고 변동성 자체가 쪼그라드는 극심한 횡보장에서는, 상승/하락 표준편차가 모두 미미해지므로 RVI 선이 50 중심선 부근에서 무의미하게 엉키는 현상이 발생합니다. 단독 매매 지표로는 부적합합니다.
6. 파이썬 구현 (표준편차 분리 및 비율 벡터 연산)
rolling(window=10).std()로 10일 표준편차를 구하고, np.where를 이용해 전일 대비 종가 등락(diff)에 따라 상승 변동성과 하락 변동성을 나눕니다. 이후 판다스의 ewm(span=14)으로 지수 평활화하여 0~100 스케일로 압축하는 정통 퀀트 코드입니다.
import pandas as pd
import numpy as np
def calculate_rvi_volatility(df, sd_period=10, ema_period=14):
# 1. 10일 표준편차(SD) 산출
sd = df['close'].rolling(window=sd_period).std()
# 2. 전일 대비 종가 등락에 따른 변동성 분리
delta = df['close'].diff()
up_vol = np.where(delta > 0, sd, 0)
down_vol = np.where(delta < 0, sd, 0)
# 3. 14일 지수 이동평균(EMA) 적용 (Series 변환 후 ewm 처리)
up_ema = pd.Series(up_vol, index=df.index).ewm(span=ema_period, adjust=False).mean()
down_ema = pd.Series(down_vol, index=df.index).ewm(span=ema_period, adjust=False).mean()
# 4. RVI 산출 (0~100 스케일)
df['RVI_Vol'] = (up_ema / (up_ema + down_ema)) * 100
return df
7. 실전 Tip 및 요약
RVI는 축구로 치면 골을 넣는 스트라이커가 아니라, 최후방에서 수비를 조율하는 최고의 '골키퍼'입니다. 단독으로 RVI만 보고 매수 버튼을 누르지 마십시오. 여러분이 애용하는 돌파 전략이나 RSI 매수 타점, 혹은 MACD 골든크로스가 발생했을 때, 하단의 RVI가 50을 넘어 상승 변동성을 함께 확보했는지 딱 한 번만 확인(Confirm)하는 습관을 들이십시오. 그것만으로도 잦은 휩쏘에 시드머니가 갈려나가는 것을 완벽하게 방어할 수 있습니다.
'기술지표' 카테고리의 다른 글
| GAPO(고팔라크리슈난 레인지 인덱스) 변동성 돌파 국면 [지표 백과 076] (0) | 2026.04.17 |
|---|---|
| CTM 지표(Chande Trend Meter) 6가지 다중 지표를 하나로 묶은 추세 측정 (0) | 2026.04.16 |
| 비거 인덱스(Vigor Index) 추세 에너지 측정 및 파이썬 퀀트 수식 [지표 백과 73] (0) | 2026.04.14 |
| DPO 지표(Detrended Price Oscillator) 장기 추세 제거 후 단기 사이클 매매 [지표 백과 72] (0) | 2026.04.13 |
| 클링거 오실레이터(Klinger Oscillator) 거래량과 추세 미세 조정 타점 [지표 백과 071] (0) | 2026.04.12 |