일정 기간 동안 주가가 상승한 힘과 하락한 힘을 비교해서, 지금 시장이 너무 뜨거운 상태(과열)인지 너무 차갑게 식은 상태(침체)인지를 0부터 100 사이의 점수로 친절하게 알려주는 모멘텀 온도계입니다.
1. 탄생 배경
투자를 하다 보면 "아무리 그래도 계속 오르기만 하겠어? 이제 떨어질 때도 됐지" 또는 "이렇게 빠졌는데 설마 더 빠지겠어?" 하는 생각이 참 많이 들죠. 매번 내가 사면 고점 같고, 팔면 저점 같아 속상하셨던 경험 다들 있으실 겁니다.
우리만 그런 게 아니라 기술적 분석의 대가인 웰스 와일더(J. Welles Wilder) 할아버지도 똑같은 고민을 했답니다. 가격이 단기간에 너무 많이 올라서 곧 떨어질 것 같은 상태나, 반대로 너무 많이 떨어져서 곧 반등할 것 같은 상태를 객관적인 수치로 딱 떨어지게 보고 싶었던 거죠. 지금 주가의 움직임이 정상적인 속도인지, 아니면 비정상적으로 흥분했거나 우울해졌는지를 재기 위해 만들어낸 잣대가 바로 상대강도지수, RSI입니다.
2. 수리적 원리와 계산 구조
수식이라고 해서 지레 겁먹을 필요는 전혀 없어요. 원리는 아주 상식적이거든요. 보통 14일을 기준으로 계산하는데요, 지난 14일 동안 주가가 전일 대비 올랐던 날들의 상승폭 평균과, 내렸던 날들의 하락폭 평균을 서로 비교하는 방식입니다.
먼저 상승폭의 평균을 하락폭의 평균으로 나누어서 상대강도(RS, Relative Strength)를 구합니다.
그리고 이 RS 값을 우리가 차트에서 한눈에 보기 편하도록 0에서 100 사이의 백분율로 예쁘게 환산해 준 것이 바로 RSI 공식이랍니다.
의미는 아주 직관적이에요. 14일 내내 가격이 오르기만 했다면 수식에 의해 RSI는 100점 만점이 되고, 내리기만 했다면 0점이 됩니다. 통상적으로 우리는 이 점수가 70을 넘어가면 "아, 사람들이 너무 흥분해서 매수세가 과열되었구나(과매수)"라고 보고, 30 밑으로 떨어지면 "다들 겁을 먹고 너무 많이 던졌구나(과매도)"라고 이해하시면 됩니다.
3. 차트로 보는 지표의 특성
어려운 설명보다 직접 눈으로 보는 게 제일 빠르겠죠? 제가 뽑아온 SK하이닉스 캔들 차트와 그 아래 보라색 RSI 선을 같이 한번 살펴볼게요. 하단 패널에 그어둔 빨간색 점선이 과열(70), 파란색 점선이 침체(30) 기준선입니다.

- 모멘텀(속도)의 시각화: 2025년 11월에서 12월 구간을 눈여겨보세요. 주가는 크게 떨어지지 않고 높은 가격대에서 옆으로 꿋꿋하게 버티고 있죠? 그런데 하단의 RSI 수치는 어느새 70 아래로 뚝 떨어져서 50 부근을 맴돌고 있어요. 가격 자체는 안 빠졌어도, 위로 치고 올라가려는 '속도와 열기'가 이미 식어버렸다는 걸 지표가 날카롭게 짚어내는 겁니다.
- 과매수 고착화 현상 (RSI의 한계 증명): 2025년 9월부터 10월 사이, 주가가 무섭게 치솟는 대세 상승 구간도 한번 보세요. RSI는 일찌감치 70을 돌파했는데 꺾이기는커녕 80 부근에서 오랫동안 찰싹 달라붙어 있습니다. 만약 우리가 교과서에서 배운 대로 "70 넘었으니 무조건 팔아야 해!" 하고 던졌다면, 그 뒤로 이어지는 엄청난 수익을 손가락만 빨며 구경해야 했을 거예요. RSI는 절대적인 고점 판독기가 아니라, 지금의 상승 에너지가 얼마나 강력한지 보여주는 온도계라는 걸 완벽하게 보여주는 대목이죠.
4. 장점 및 한계
RSI가 정말 효자 노릇을 할 때는 주가가 일정한 박스권 안에서 갇혀 움직이는 '횡보장'입니다. 시장의 심리가 한쪽으로 극단적으로 쏠렸을 때, 어김없이 제자리로 돌아오려는 평균 회귀의 성질을 잡아내는 데는 이만한 도구가 없거든요.
하지만 위 차트에서 확인했듯이, 아주 강력한 '대세 상승장'이나 '대세 하락장'을 만나면 지표가 70 위나 30 아래에 딱 달라붙어버리는 고착화 현상이 나타납니다. 진짜 강한 추세가 터졌을 때는 지표가 보내는 과열/침체 신호가 오히려 우리를 섣부른 매매의 함정에 빠뜨릴 수 있다는 점, 꼭 명심하셔야 해요.
5. 파이썬 구현
남들이 만들어둔 지표를 보는 것도 좋지만, 파이썬으로 직접 계산해 보면 지표의 속살을 진짜로 이해할 수 있어요. 로컬 DB(stock.db)에서 데이터를 가져와서, 웰스 와일더 할아버지가 처음 만들었던 오리지널 지수평활 방식 그대로 RSI를 계산해보는 핵심 코드입니다.
코드 보기 (클릭)
import sqlite3
import pandas as pd
import numpy as np
# 1. 표준 데이터 로딩 함수 (로컬 stock.db 사용)
def load_data(code):
conn = sqlite3.connect("stock.db")
query = f"SELECT * FROM stock_{code} ORDER BY date"
df = pd.read_sql(query, conn)
df['date'] = pd.to_datetime(df['date'])
df.set_index('date', inplace=True)
return df
# 2. RSI 계산 핵심 로직 (Wilder's Smoothing 방식)
def calculate_rsi(df, window=14):
data = df.copy()
# 전일 대비 가격 변화량(delta) 계산
delta = data['close'].diff()
# 상승분(up)과 하락분(down) 분리 (하락분은 양수로 변환)
up = delta.clip(lower=0)
down = -1 * delta.clip(upper=0)
# Wilder의 지수이동평균(alpha=1/window) 방식으로 평균 상승/하락폭 계산
roll_up = up.ewm(alpha=1/window, adjust=False).mean()
roll_down = down.ewm(alpha=1/window, adjust=False).mean()
# RS 및 RSI 계산 (roll_down이 0일 경우 무한대 방지)
rs = roll_up / roll_down
data['RSI_14'] = np.where(roll_down == 0, 100, 100.0 - (100.0 / (1.0 + rs)))
return data
# 실행 예시
# df = load_data("005930")
# rsi_df = calculate_rsi(df)
6. 요약
RSI가 70을 넘었다고 무조건 팔고, 30 밑으로 떨어졌다고 덥석 사는 건 절대 금물입니다. 이 지표는 기계적인 신호등이 아니라, 지금 시장에 참여한 사람들의 탐욕과 공포가 어느 쪽으로 얼마나 쏠려 있는지를 재는 섬세한 온도계랍니다.
지난 시간에 배운 이동평균선 같은 추세 지표로 먼저 시장의 굵직한 뼈대와 방향을 살피고, 그 다음 RSI를 통해 지금 가격이 너무 과열된 건 아닌지 진입 타이밍을 조율해 보세요. 여러 가지 무기를 조화롭게 다룰 줄 아는 분이 진짜 훌륭한 트레이더가 되는 법이니까요.
'기술지표' 카테고리의 다른 글
| 피벗 포인트(Pivot Point) 수식 계산 및 단타 데이트레이딩 타점 [지표 백과 006] (0) | 2026.02.17 |
|---|---|
| OBV 지표 해석: 세력의 매집과 분산(거래량) 파악하는 법 [지표 백과 005] (0) | 2026.02.17 |
| 볼린저 밴드 스퀴즈 돌파 매매 전략 및 차트 설정법 [지표 백과 004] (0) | 2026.02.17 |
| 지수 이동평균선(EMA) 골든크로스 타점 및 파이썬 수식 [지표 백과 002] (0) | 2026.02.16 |
| 단순 이동평균선(SMA) 실전 매매기법 및 지지 저항 활용법 [지표 백과 001] (0) | 2026.02.16 |