RSI는 가격 변동의 속도와 크기를 측정하는 지표입니다. 과매수와 과매도 상태를 판단하는 데 사용됩니다. 0부터 100 사이의 값으로 표현됩니다. 일반적으로 70 이상이면 과매수, 30 이하이면 과매도로 간주합니다. RSI는 추세 강도와 잠재적인 반전 시점을 파악하는 데 유용합니다.
RSI 계산 방법
RSI는 특정 기간 동안의 상승폭과 하락폭을 비교하여 계산합니다. 먼저, 상승폭의 평균(Average Gain)과 하락폭의 평균(Average Loss)을 계산합니다. 다음으로, 상대 강도(Relative Strength, RS)를 계산합니다. RS는 상승폭의 평균을 하락폭의 평균으로 나눈 값입니다. 마지막으로, RS를 사용하여 RSI를 계산합니다.
RSI 계산 단계:
-
상승폭 (Upward Change, U) 및 하락폭 (Downward Change, D) 계산:
현재 종가와 이전 종가를 비교합니다. 종가가 상승했다면 U는 상승폭이고 D는 0입니다. 종가가 하락했다면 D는 하락폭이고 U는 0입니다.
2. 초기 평균 상승폭 (Average Gain) 및 평균 하락폭 (Average Loss) 계산:일반적으로 14일 기간을 사용합니다. 처음 14일 동안의 U와 D의 평균을 계산합니다.
Average Gain (초기) = (14일 동안의 상승폭 합) / 14
Average Loss (초기) = (14일 동안의 하락폭 합) / 14
3. 이후 평균 상승폭 및 평균 하락폭 계산 (Smoothed or Exponential):이후의 평균은 다음과 같이 계산합니다. 이전 평균을 사용하여 계산합니다.
Average Gain (오늘) = ((Average Gain (어제) * (기간 - 1)) + U (오늘)) / 기간
Average Loss (오늘) = ((Average Loss (어제) * (기간 - 1)) + D (오늘)) / 기간이 방법은 최근 가격 변동에 더 큰 가중치를 부여합니다.
4. 상대 강도 (Relative Strength, RS) 계산:RS = Average Gain / Average Loss
5. 상대 강도 지수 (Relative Strength Index, RSI) 계산:RSI = 100 - (100 / (1 + RS))
Python 코드 예시 (Pandas 활용)
다음은 Pandas를 사용하여 RSI를 계산하는 코드 예시입니다.
import pandas as pd
import numpy as np
def calculate_rsi(df, period=14):
"""상대 강도 지수(RSI)를 계산하는 함수입니다.
Args:
df (pd.DataFrame): 가격 데이터프레임. 'Close' 컬럼이 필요합니다.
period (int): RSI 기간. 기본값은 14입니다.
Returns:
pd.Series: 계산된 RSI 값.
"""
delta = df['Close'].diff()
up, down = delta.copy(), delta.copy()
up[up < 0] = 0
down[down > 0] = 0
down = abs(down)
avg_gain = up.rolling(window=period, min_periods=period).mean()
avg_loss = down.rolling(window=period, min_periods=period).mean()
rs = avg_gain / avg_loss
rsi = 100 - (100 / (1 + rs))
# 초기값이 NaN인 경우를 처리
rsi = np.where(np.isnan(rsi), 50, rsi) # 초기 RSI 값을 50으로 설정
return pd.Series(rsi, index=df.index)
# 예시: 데이터프레임 df에 'Close' 컬럼이 있다고 가정
# df = pd.read_csv("your_data.csv") # CSV 파일에서 데이터 불러오기
df['RSI'] = calculate_rsi(df)
print(df[['Close', 'RSI']].head(30))
코드 설명:
calculate_rsi(df, period=14)
함수는 RSI를 계산합니다.df['Close'].diff()
는 종가 차분을 계산합니다.up
과down
은 각각 상승폭과 하락폭을 저장합니다.rolling(window=period).mean()
은 이동평균을 계산합니다.rs
는 상대 강도를 계산합니다.rsi
는 상대 강도 지수를 계산합니다.np.isnan(rsi)
를 사용하여 초기 NaN 값을 50으로 설정합니다. 이는 초기 평균 상승폭과 하락폭 계산 시 발생할 수 있는 문제를 해결합니다.
RSI 활용법
- 과매수/과매도 판단: RSI가 70 이상이면 과매수, 30 이하이면 과매도로 간주합니다. 과매수 상태에서는 매도, 과매도 상태에서는 매수를 고려할 수 있습니다.
- 다이버전스: 가격과 RSI가 반대 방향으로 움직일 때 다이버전스가 발생합니다. 상승 다이버전스는 상승 추세 전환, 하락 다이버전스는 하락 추세 전환을 시사할 수 있습니다.
- 추세 강도 확인: RSI가 50 이상이면 상승 추세, 50 이하이면 하락 추세로 간주할 수 있습니다.
RSI는 다른 기술적 지표와 함께 사용하는 것이 좋습니다. 단독으로 사용하면 잘못된 신호를 발생시킬 수 있습니다. 다음 섹션에서는 MACD 지표를 계산하는 방법을 알아봅니다.