본문 바로가기
Python Code

RVI(상대 변동성 지수: Relative Volatility Index) 파이썬 코드 제공

by 인천고래 quant

안녕하세요. 주식 투자 관련 지식을 공유하는 인천고래입니다.

 

주식 시장에서는 단기간 내에 수익을 얻기 위해 변동성이 큰 종목에서 매매를 하는 것이 일반화되어 있는데요.

변동성을 파악하기 위해서 많은 보조지표가 존재하지만

그 중에서도 변동성을 표준편차 기반으로 측정해서 매수, 매도 시점을 파악하는 것을 목표로 개발된 지표로 RVI(Relative Volatility Index)가 있습니다. 오늘은 RVI에 대해 알아보도록 하겠습니다.

 

목차

  1. RVI(상대 변동성 지수)란?
  2. RVI 계산 방식 이해하기
  3. RVI 차트 적용 예시 (파이썬 코드 제공)
  4. RVI 활용 전략 (1)
  5. RVI 활용 전략 (2)
  6. RVI 장단점과 주의 사항
  7. 정리

 

1. RVI(상대 변동성 지수)란?

1-1. RVI

RVI(Relative Volatility Index)는 이름 그대로 변동성(Volatility)을 상대적으로 파악하는 지표입니다.

일반적으로 많이 쓰이는 RSI(Relative Strength Index) 는 “가격의 상승·하락의 힘”을 주로 다루는 반면, RVI는 같은 방식을 표준편차(Volatility) 기반으로 확장했습니다.

  • 개발자: Donald Dorsey
  • 핵심 개념: 상승 변동성 표준편차와 하락 변동성 표준편차를 분리해서 비교
  • 값의 범위: 보통 0 ~ 100 사이를 오갑니다. (일반적인 오실레이터 지표와 유사)

1-2. RVI를 사용하는 이유

  • 가격 변동성 반영: 단순히 가격 상승·하락만 보는 것이 아니라, 그 변동 폭이 어느 정도인지까지 고려합니다.
  • 예측 정확도 보강: RSI, Stochastics 등과 병행하면, 과매수/과매도 구간을 좀 더 명확히 파악할 수 있습니다.
  • 변동성이 큰 종목에 유리: 변동성이 심한 종목 또는 시장(예: 코스닥, 암호화폐)에서 유용하게 쓰일 수 있습니다.

 

2. RVI 계산 방식 이해하기

RVI도 일반적으로 기간으로 설정을 하도록 되어 있습니다. 기본 값은 14로 설정되어 있으니 종목 및 변동성에 맞춰서 변경하셔서 사용하시면 됩니다.

 

  1. 종가 변동분(전일 대비 차이):
    Δ 𝑃 = Close − Close(-1)
  2. 상승 변동분과 하락 변동분 분류:
    Δ 𝑃 > 0 인 경우: 상승 변동분에 해당
    Δ 𝑃 < 0 인 경우: 하락 변동분에 해당(값을 절댓값으로 전환)

  3. 상승 변동분의 표준편차와 하락 변동분의 표준편차 계산
    Stdev Up = 표준편차 ( { Δ 𝑃 𝑖 ∣ Δ 𝑃 𝑖 > 0 } )
    Stdev Down = 표준편차 ( { ∣ Δ 𝑃 𝑖 ∣ ∣ Δ 𝑃 𝑖 < 0 } )

  4. RVI 공식
    RVI = 100 × (Stdev Up / (Stdev Up + Stdev Down))

RVI 공식

 

이렇게 계산된 RVI가 0에 가까우면 하락 변동성이 더 큰 상태, 100에 가까우면 상승 변동성이 더 큰 상태를 의미합니다.

 

3. RVI 차트 적용 예시 (파이썬 코드 제공)

아래의 코드는 파이썬에서 FinanceDataReader 모듈을 사용해서 삼성전자 주가 데이터를 가져온 후 RVI 지표를 반영해서 시각화한 예시 코드입니다.
p.s: 편의상 fdr을 사용했을 뿐 백테스팅을 진행할 때에는 fdr 사용을 하지 말고 api를 이용해서 데이터를 받아서 사용하셔야 합니다.

import FinanceDataReader as fdr
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt


# RVI(상대 변동성 지수) 계산 함수
def calculate_rvi(df, period=14):
    """
    RVI(Relative Volatility Index)는 Donald Dorsey가 제안한 지표로,
    RSI와 유사하지만, 가격 변동 폭 대신 표준편차를 이용하여
    '상승 변동성'과 '하락 변동성'을 측정하는 방식입니다.

    - period(기본값 14): RVI 계산을 위해 고려할 기간(롤링 윈도우 크기)
    """
    # 일별 종가 차이(수익률 비슷한 개념으로 사용)를 구합니다.
    ret = df['Close'].diff()

    rvi_values = []

    for i in range(len(ret)):
        # period 이전 구간은 계산 불가이므로 NaN 할당
        if i < period:
            rvi_values.append(np.nan)
        else:
            # 최근 period 동안의 상승일/하락일에 대한 표준편차를 구합니다.
            recent_changes = ret[i - period + 1: i + 1]

            # 상승 폭(양수)과 하락 폭(음수)을 각각 분리
            up_changes = [x for x in recent_changes if x > 0]
            down_changes = [abs(x) for x in recent_changes if x < 0]

            # 표준편차 계산(데이터가 2개 이상 있어야 ddof=1로 표준편차 계산 가능)
            stdev_up = np.std(up_changes, ddof=1) if len(up_changes) > 1 else 0
            stdev_down = np.std(down_changes, ddof=1) if len(down_changes) > 1 else 0

            # 합이 0으로 나누는 상황 방지
            denom = stdev_up + stdev_down
            if denom == 0:
                rvi_values.append(0)
            else:
                rvi_values.append(100 * stdev_up / denom)

    df['RVI'] = rvi_values
    return df


if __name__ == "__main__":
    # 삼성전자(005930) 주가 데이터 가져오기
    df = fdr.DataReader('005930', '2020-01-01')

    # RVI 계산
    df = calculate_rvi(df, period=14)

    # 차트 그리기
    fig, axes = plt.subplots(2, 1, figsize=(12, 8), sharex=True)

    # 상단 차트: 종가
    axes[0].plot(df.index, df['Close'], label='Close Price', color='blue')
    axes[0].set_title('Samsung Electronics (005930) - Close Price')
    axes[0].legend(loc='best')

    # 하단 차트: RVI
    axes[1].plot(df.index, df['RVI'], label='RVI(14)', color='red')
    axes[1].set_title('Relative Volatility Index')
    axes[1].axhline(50, color='gray', linestyle='--', linewidth=1)  # 기준선(50) 표시 예시
    axes[1].legend(loc='best')

    plt.tight_layout()
    plt.show()

 

4. RVI 활용 전략 (1)

RVI를 이용한 기본적인 활용 전략은 아래와 같습니다. (중심값 50을 기준으로 생각하시면 됩니다.)

  1. 과매수·과매도 영역:
    RVI가 80~100: 해당 수치 수준으로 치솟으면 과열 구간으로 판단하여 매도 타점을 잡을 수 있습니다.
    RVI가 0~20: 해당 수치 정도로 떨어지면 과매도 구간으로 판단하고, 매수 기회를 모색할 수 있습니다.

  2. 추세 확인 보조:
    RVI가 50 이하일 때는 전반적으로 하락 변동성 우위,
    RVI가 50 이상일 때는 상승 변동성 우위로 보고 큰 추세를 살펴볼 수 있습니다.

  3. 다른 지표와 병행:
    RSI, MACD, Stochastic 등과 함께 볼 때 훨씬 더 신뢰도가 높아집니다.
    Bollinger Band 등 변동성 기반 지표들과 혼합 적용하기도 좋습니다.

아래의 차트는 RVI와 RSI를 비교한 차트입니다.

RVI와 RSI를 비교한 차트

 

5. RVI 활용 전략 (2)

저도 1% 상위 수준의 주식 투자자는 아니지만 ‘변화’를 맞이하게 되는 것은 결국 투자자의 실행과 경험인 것 같습니다.

우리가 스스로 지표를 만들어서 전략적으로 성공적인 매매법을 만들 수 있는 확률은 극히 드물며 우선은 위대한 투자자들의 발자취를 따라가는 것이 성공적인 투자의 첫걸음이라 생각이 듭니다.

 

아래의 언급된 항목에서 RVI를 활용할 때에는 어떻게 해야 할지 판단을 꼭 해보시기를 바라겠습니다.

  • 분석 관점 확대: 가격 중심 → 가격 + 변동성
  • 리스크 관리: 변동이 커지는 시점 포착, 갑작스러운 시장 변화에 대한 빠른 대응
  • 자신만의 매매룰 정립: RVI 지표를 매매 전략에 어떻게 녹일지, 구체적인 매수·매도 시그널 기준 마련

 

RVI는 만능열쇠가 아니지만, 변동성이라는 중요한 단서를 수치화하고, 투자자가 더 나은 판단을 내릴 수 있도록 돕는 훌륭한 보조지표입니다. 부디 이 글이 RVI를 이해하고 활용하는 데 있어 소중한 길잡이가 되길 바랍니다.

 

6. RVI 장단점과 주의 사항

장점

  • 표준편차 활용: 가격 움직임이 클수록 RVI 변화가 두드러지므로, 강한 추세 초입을 캐치하기 유리
  • 낮은 지연성: RSI와 유사한 계산 구조를 가져 지연(Lag)이 크지 않습니다.

단점

  • 횡보장(박스권)에서는 효과 감소: 변동폭이 제한적이면, RVI 역시 “뚜렷한 신호”를 주기 어렵습니다.
  • 허위 신호(Fake Signal) 가능: 모든 오실레이터 지표가 그렇듯, 시장 급등·급락 시 왜곡된 신호가 발생할 수 있어, 다른 지표나 거래량 분석과 함께 보는 것이 좋습니다.

 

7. 정리

RSI 등 기존 보조지표에서 느낀 한계를 보완하기 위해 RVI(낯선 세상)라는 새로운 보조지표가 나오게 되었는데
RVI 계산 방식이 조금 까다롭게 느껴지지만, 사용법을 익히고 나면 변동성을 좀 더 명확히 파악해 실제 매수·매도 의사결정에 도움을 준다는 장점을 발견하게 될 것입니다.

 

RVI를 직접 차트에 적용해 보고, 다른 지표들과 어떻게 시너지를 낼 수 있는지 고민해 보신다면 좋은 결과를 얻으실 수 있으리라 생각합니다.

 

감사합니다.

 

 


 

자신만의 매매법을 자동매매 프로그램으로 만들거나 

기법이 확률이 떨어진다면 백테스팅을 사용해서 확률을 높여야 합니다. 

아래의 링크를 통해서 요청하시면 요청하신 이상(가격대비 성능의 최대치)의 결과물을 받아 보실 수 있습니다.

 

한 방에 주식 데이터 만들기 - 크몽

인천고래 전문가의 IT·프로그래밍 서비스를 만나보세요. <p>퀀트 매매, 수익률 높은 매매, 확률 높은 매매, 잃지 않는 매매 등<...

kmong.com

 


 

다른 보조지표에 대해서는 아래의 링크 글을 통해 자세히 알아 볼 수 있습니다.

 

보조지표 리스트 (추세, 모멘텀, 채널, 변동성, 거래량, 기타 지표)

안녕하세요. 주식을 통해 삶을 영위할 수 있는 방법을 찾으며  인생 후반을 준비하고 있는 인천고래입니다.이전부터 보조지표에 대해서 글을 작성해 왔지만 중요한 것 위주로 작성을 하다보니

i-whale.com


 

단기적인 스윙 및 세력 매집 분석에 용이한 기준봉에 대해서는 아래의 링크 글을 통해 자세히 알아 볼 수 있습니다.

 

'주식 기준봉' 카테고리의 글 목록

주식 투자에 필요한 교육 내용을 제공하고 시장 정보 및 통계 등 수록하고 기록함을 원칙으로 하되 데이터마이닝을 통해 객관적인 자료를 구축하여 보다 경제적 자유를 얻기 위하여 사이트를

i-whale.com

 

-

댓글