콘텐츠로 이동

기술적 분석 3장: RSI 과매도 신호의 수익률

RSI 평균회귀 분석

1장에서는 RSI 회복 신호의 20일 평균수익률이 +2.14%였지만 중앙값은 -0.91%, 양수 비율은 47.1%였습니다. 이번 장에서는 왜 “RSI 30 이하 = 매수 기회”라는 설명이 반복해서 실패할 수 있는지, 과매도 수준이 아니라 회복 신호를 기준으로 다시 확인합니다. 강한 하락 추세에서는 RSI가 30 아래에 오래 머물 수 있으므로, 30 아래에서 다시 30을 상향 돌파한 날을 신호로 정의했습니다.

change = df.groupby("code")["close"].diff()
gain = change.clip(lower=0)
loss = -change.clip(upper=0)
avg_gain = gain.groupby(df["code"]).transform(lambda x: x.rolling(14).mean())
avg_loss = loss.groupby(df["code"]).transform(lambda x: x.rolling(14).mean())
df["rsi14"] = avg_gain / (avg_gain + avg_loss) * 100
df["rsi_recovery"] = (
(df.groupby("code")["rsi14"].shift(1) <= 30) &
(df["rsi14"] > 30)
)
df["forward_return_20d"] = (
df.groupby("code")["close"].shift(-20) / df["close"] - 1
)

검증 구간에서 RSI 회복 신호는 1,258회 발생했습니다.

신호발생 횟수20일 양수 비율평균 수익률중앙값
RSI 30 상향 회복1,258회47.1%+2.14%-0.91%

평균 수익률은 양수였지만 중앙값은 -0.91%였고, 양수 비율도 47.1%로 절반에 미치지 못했습니다. 25% 분위수는 -14.56%였습니다. 일부 큰 반등이 평균을 끌어올렸을 뿐, 전형적인 신호가 손실을 피했다고 보기는 어렵습니다. 같은 검증 구간에서 MACD 골든크로스는 양수 비율 55.1%, 중앙값 +2.72%였기 때문에 RSI 회복의 약점이 더 분명해집니다.

이번 결과에서 RSI는 단독 매수 신호라기보다 하락 압력이 완화됐는지 확인하는 보조 지표로 쓰는 편이 낫습니다. RSI 회복만으로는 부족하므로 다음 조건을 추가했을 때 결과가 개선되는지 별도 검증해야 합니다.

  • 종가가 MA20 위에 있는가
  • 20일 수익률이 양수인가
  • 거래량이 평소보다 증가했는가
  • 산업 전체가 같은 방향으로 움직이는가

RSI 30이라는 숫자만 보고 매수하면 하락 추세 중간의 일시적 반등을 잡을 가능성이 큽니다. 따라서 평균수익률이 플러스라는 이유만으로 평균회귀 전략을 채택하기보다, 손절 기준·보유 기간·시장 국면을 함께 정해야 합니다. 다음 장에서는 같은 검증 구간에서 더 높은 양수 비율과 중앙값을 보인 MACD 골든크로스가 실제 추세 전략으로도 이어지는지 확인합니다.

전체 결과는 신호별 결과 CSV, 계산 코드는 technical_analysis.py에서 확인할 수 있습니다.