본문 바로가기
AI 에이전트/트레이딩

기술적 지표: 상대강도지수 (RSI, Relative Strength Index)

by 깊은대학 2025. 7. 4.

RSI(Relative Strength Index, 상대강도지수)는 가장 널리 사용되는 모멘텀 지표 중 하나로서 주가의 상승과 하락의 세기(strength)를 수치화하여 과매수(overbought) 또는 과매도(oversold) 상태를 진단할 수 있도록 해준다.

RSI의 수식은 다음과 같다.

 

\[ RSI= 100 \times \frac{ \mbox{일정기간 평균 상승액}}{\mbox{일정기간 평균 하락액 + 일정기간 평균 상승액 }} \]

 

여기서 상대강도(RS, Relative Strength)를 다음과 같이 정의하고,

 

\[ RS= \frac{ \mbox{일정기간 평균 상승액}}{\mbox{일정기간 평균 하락액}} \]

 

RSI의 수식에 대입하면 다음과 같이 된다.

 

\[ RSI=100 \times \frac{RS}{1+RS} \]

 

수식에서 일정 기간(period) 동안의 평균 상승액은 종가 기준으로 전일 대비 상승한 금액의 평균을 의미하며, 평균 하락액은 전일 대비 하락한 금액의 평균이다.

예를 들어, 종가가 900원부터 시작하여 5일간의 종가가 각각 1000원, 900원, 1000원, 1000원, 1100원이었다고 가정해 보자.

 

  • 상승한 날의 총 상승액은 100원 (900→1000) + 100원 (900→1000) +100원 (1000→1100) = 300원
  • 하락한 날의 총 하락액 100원 (1000→900) = 100원

 

이를 기반으로 단순 평균을 계산하면,

 

  • 평균 상승액 = 300 ÷ 5 = 60원
  • 평균 하락액 = 100 ÷ 5 = 20원

 

이다. 따라서 상대강도는

 

\[ RS= \frac{60}{20}=3 \]

 

이며, RSI는 다음과 같이 계산된다.

 

\[ RSI=100 \times \frac{3}{1+3}=75 \]

 

RSI 수식에 의하면 RSI 값은 RS가 0일 때는 0 이고 RS가 무한대일 때는 100으로서, 0에서 100 사이의 값을 갖는다.

 

 

위 그림에서 x축은 로그 스케일임에 주의해야 한다. RS 값 1을 중심으로 RSI는 반전 대칭을 이루고 있다. 만약 RS가 1 즉, 일정 기간 동안 상승액과 하락액이 동일하다면 RSI는 50이고 평균 상승액이 하락액보다 3배 크면 (RS=3) RSI 는 75, 반대로 평균 하락액이 상승액보다 3배 크면 (RS=1/3) RSI는 25 다.

이를 바탕으로 RSI가

 

  • 70 이상이면 과매수 상태 → 하락 가능성 증가
  • 30 이하이면 과매도 상태 → 반등 가능성 증가

로 판단한다.

일반적으로 '일정 기간(period)'은 14일을 사용한다. 처음 지수가 개발될 때에는 평균값을 계산할 때 단순 이동평균 (sma, simple moving average)을 사용했지만 요즘에는 지수 이동평균 (ema, exponential moving average)을 더 많이 사용한다.

RSI를 이용한 매매 전략은 대체로 다음과 같은 것들이 있다.

1. 과매수 / 과매도 전략

  • RSI > 70: 과매수로 간주, 매도 신호로 해석될 수 있음
  • RSI < 30: 과매도로 간주, 매수 신호로 해석될 수 있음

2. RSI 다이버전스(Divergence)

  • 가격은 상승하지만 RSI는 하락 → 상승 약화 가능성
  • 가격은 하락하지만 RSI는 상승 → 반등 신호 가능성

3. 중립 지점(50선) 전략

  • RSI > 50: 상승 모멘텀이 강함
  • RSI < 50: 하락 모멘텀이 강함

다음은 1번 매매 전략을 이용하여 테슬라 주식을 거래했을 때 매수, 매도 시점을 마커를 주가에 표시한 것이다. 일봉 데이터이며 period=14를 사용했다.

 

 

파란색 마커가 매도 신호, 빨간색 마커가 매수 신호이다.
다음은 위 RSI을 이용한 매매전략을 구현한 파이썬 코드다.

 

 

 

import yfinance as yf
import pandas as pd
import matplotlib.pyplot as plt

# RSI 계산 함수
def compute_rsi(data, period=14):
    delta = data['Close'].diff()
    gain = delta.clip(lower=0)
    loss = -delta.clip(upper=0)

    # 단순이동평균
    #avg_gain = gain.rolling(window=period).mean()
    #avg_loss = loss.rolling(window=period).mean()

    # 지수이동평균
    avg_gain = gain.ewm(alpha=1/period).mean()
    avg_loss = loss.ewm(alpha=1/period).mean()

    rs = avg_gain / avg_loss
    rsi = 100*rs/(1+rs)
    return rsi

# 1. 테슬라 데이터 다운로드
ticker = 'TSLA'
data = yf.download(ticker, start='2024-01-01', end='2025-07-04')
data['RSI'] = compute_rsi(data)

# 2. 매수/매도 시점 정의
buy_signals = data[data['RSI'] < 30]
sell_signals = data[data['RSI'] > 70]

# 3. 그래프 그리기
plt.figure(figsize=(14, 9))

# 서브플롯 1: 종가와 매수/매도 마커
plt.subplot(2, 1, 1)
plt.plot(data.index, data['Close'], label='TSLA Close Price', color='black')
plt.scatter(buy_signals.index, buy_signals['Close'], marker='^', color='red', label='Buy Signal (RSI < 30)', s=100)
plt.scatter(sell_signals.index, sell_signals['Close'], marker='v', color='blue', label='Sell Signal (RSI > 70)', s=100)
plt.title('Tesla (TSLA) Closing Price with RSI Buy/Sell Signals')
plt.ylabel('Price ($)')
plt.grid(True)
plt.legend()

# 서브플롯 2: RSI 그래프
plt.subplot(2, 1, 2)
plt.plot(data.index, data['RSI'], label='RSI (14)', color='blue')
plt.axhline(70, color='blue', linestyle='--', alpha=0.5)
plt.axhline(30, color='red', linestyle='--', alpha=0.5)
plt.fill_between(data.index, 70, 100, color='blue', alpha=0.1)
plt.fill_between(data.index, 0, 30, color='red', alpha=0.1)
plt.title('Relative Strength Index (RSI)')
plt.ylabel('RSI')
plt.grid(True)
plt.legend()

plt.tight_layout()
plt.show()

 

댓글