-
[Python] 상대강도지수(RSI, Relative Strength Index)Python/파이썬과 주식, 코인 2025. 4. 27. 20:12반응형
Python으로 알아보는 Technical Indicators
1. 이동평균선(Moving Average)
2. 볼린저 밴드(Bollinger Bands)
3. 상대강도지수(RSI, Relative Strength Index)
4. 이동평균 수렴 확산 지수(MACD)RSI(Relative Strength Index, 상대강도지수)
주식이나 기타 자산의 가격 움직임을 분석해 과매수 또는 과매도 상태를 평가하는 기술적 분석 지표입니다.
J. Welles Wilder가 개발했으며, 주로 0에서 100 사이의 값을 가집니다.주요 특징
계산
RSI = 100 - [100 / (1 + RS)]
1. 일정기간(보통 14일) 동안 주가가 상승한 날과 하락한 날을 나눕니다.
2. 상승 시 주가 상승폭의 평균과 하락 시 주가 하락폭의 평균을 계산합니다.
3. RS(Relative Strength) = 상승 시 주가 상승폭의 평균 / 하락 시 주가 하락폭의 평균해석
70 이상: 과매수(Overbought) 상태로, 가격이 과도하게 상승해 하락 반전 가능성이 높음.
30 이하: 과매도(Oversold) 상태로, 가격이 과도하게 하락해 상승 반전 가능성이 높음.
50 근처: 중립 상태.활용
추세 확인: RSI가 50 이상이면 상승 추세, 50 이하이면 하락 추세로 간주할 수 있음.
다이버전스(Divergence): 가격은 상승하는데 RSI가 하락하거나, 가격은 하락하는데 RSI가 상승하면 추세 반전 신호로 해석.
매매 신호: 과매수/과매도 구간 진입 후 반대 방향으로 벗어날 때 매수/매도 결정.장점
가격의 강도와 속도를 직관적으로 보여줌.
다양한 자산(주식, 암호화폐, 외환 등)에 적용 가능.한계
강한 추세장에서는 과매수/과매도 상태가 오래 지속될 수 있어 잘못된 신호 발생 가능.
단독 사용보다는 다른 지표(MACD, 이동평균선 등)와 함께 사용하는 것이 효과적.import pandas as pd import requests import matplotlib.pyplot as plt url = "https://api.bithumb.com/v1/candles/days?market=KRW-BTC&count=200" headers = {"accept": "application/json"} response = requests.get(url, headers=headers) if response.status_code != 200: print(response.status_code) df = pd.DataFrame(response.json()) df["candle_date_time_kst"] = pd.to_datetime(df["candle_date_time_kst"]) df = df.sort_values(by="candle_date_time_kst").reset_index(drop=True) n = 14 delta = df["trade_price"].diff() gains = delta.where(delta > 0, 0) losses = -delta.where(delta < 0, 0) avg_gains = gains.rolling(window=n).mean() avg_losses = losses.rolling(window=n).mean() rs = avg_gains / avg_losses rsi = 100 - (100 / (1 + rs)) df_4_plot = pd.DataFrame({"Close": df["trade_price"], "RSI": rsi}) df_4_plot["date_time"] = df["candle_date_time_kst"] df_4_plot.set_index("date_time", inplace=True) plt.figure(figsize=(12, 8)) plt.subplot(2, 1, 1) plt.plot(df_4_plot.index, df_4_plot["Close"], label="Close Price") plt.title("Price Chart") plt.legend() plt.subplot(2, 1, 2) plt.plot(df_4_plot.index, df_4_plot["RSI"], label="RSI", color="purple") plt.axhline(y=70, color="r", linestyle="--", alpha=0.5) plt.axhline(y=30, color="g", linestyle="--", alpha=0.5) plt.title("RSI (14)") plt.ylim(0, 100) plt.legend()
반응형