Stochastic Oscillator & StochRSI
Stochastic Oscillator
일정기간 동안의 최고가와 최저가 범위 내에서 현재 종가의 상대적 위치를 측정하는 모멘텀 지표로서 가격 움직임의 속도와 강도 파악에 적용할 수 있습니다. 지표는 추세 상승의 경우 종가가 해당기간의 고가 근처에 형성, 하락 추세에서는 저가 근처에서 형성되는 경향과 가격 변동 방향의 전환 전에 모멘텀이 먼저 둔화된다는 점에 기반을 둔 것입니다.
계산
$$\begin{align}&\begin{aligned}\text{STOCH}&=\frac{\text{Close} - \text{Low(n)}}{\text{High(n)} - \text{Low(n)}} \\ \%K\,(\text{Fast Stochastic})&=\text{SMA}(\text{STOCH}, m)\\ \%D\,(\text{Slow Stochastic})&=\text{SMA}(\%K, m)\end{aligned}\\\\ & \text{Close: 현재 종가}\\&\text{Low(n), High(n): n기간동안의 최저가, 최고가}\\ &\text{일반적으로 n =14, m = 3}\end{align}$$pandas_ta.stoch(high, low, close, k=None, d=None, smooth_k=None, mamode=None, offset=None, **kwargs)
를 사용하여 계산할 수 있습니다. 인수 k, d, 그리고 smooth_k는 각각 위 식의 STOCH의 n, fast %K의 m, slow %D의 m을 지정하기 위한 것으로 기본값은 각각 14, 3, 3입니다. mamode는 이평 계산방식을 지정하는 것으로 기본값은 단순이동평균 'sma'입니다. %K와 그 값의 이동평균인 %D를 반환합니다.
import numpy as np import pandas as pd import yfinance as yf import FinanceDataReader as fdr import pandas_ta as ta import matplotlib.pyplot as plt import mplfinance as mpf st=pd.Timestamp(2024,9, 1) et=pd.Timestamp(2025, 5,3) trgnme="000660" trg=fdr.DataReader(trgnme, st, et)[["Open", "High", "Low", "Close", "Volume"]] df=trg.iloc[:,:-1].copy() df[['%K', "%D"]]=df.ta.stoch() df.tail(3)
Open | High | Low | Close | %K | %D | |
---|---|---|---|---|---|---|
Date | ||||||
2025-04-29 | 182000 | 182900 | 179100 | 180800 | 66.819684 | 68.106561 |
2025-04-30 | 179100 | 180000 | 176700 | 177500 | 54.730363 | 63.637597 |
2025-05-02 | 179400 | 186200 | 178400 | 186000 | 63.948773 | 61.832940 |
adf=[mpf.make_addplot(ta.ema(df.Close, 5), panel=0, color="brown", label="ema5"), mpf.make_addplot(ta.ema(df.Close, 20), panel=0, color="navy", label="ema20"), mpf.make_addplot(df["%K"], panel=1, color="brown", label="%K", title="Stochastic"), mpf.make_addplot(df["%D"], panel=1, color="navy", label="%D")] f, axs=mpf.plot(df.iloc[:,:4], type="candle", style="yahoo",volume=False, addplot=adf, returnfig=True, figsize=(12,8)) axs[0].legend(loc="upper left") axs[2].legend(loc="upper left") axs[2].axhline(80, color='r', ls="dashed" ) axs[2].axhline(20, color='b', ls="dashed" ) plt.show()
두선의 상승은 상승, 반대는 하락을 나타냅니다. %D는 %K의 이평선이므로 이들의 상승추세인 경우 %K가 위, 하락 추세인 경우는 아래에 위치합니다. 각 선의 위치 전환에 따라 추세 전환을 암시합니다. 또한 80선과 20선을 기준으로 다음과 같은 해석이 가능합니다.
해석
과매도와 과매수 영역
- 일반적으로 > 80: 과매수 영역으로 간주할 수 있으며 가격이 단기적으로 너무 많이 상승하여 매도 압력 증가
- 일반적으로 < 20: 과매도 영역으로 간주할 수 있으며 가격이 단기적으로 너무 많이 하락하여 매수 압력 증가
- 그러나 강한 추세에서는 오랫동안 과매도, 과매수 영역에 머무를 수 있음을 고려하여야 함
매수와 매도 신호
- 과매도 영역에서 %K이 %D를 상위교차, 과매도 영역을 벗어난 직후 %K의 상위교차가 발생시 매수신호
- 과매수 영역에서 %K이 %D를 하위교차, 과매수 영역을 벗어난 직후 %K의하위교차가 발생시 매도신호
Divergence(벌어짐): 가격의 움직임과 스토캐스틱 오실레이터의 움직임이 반대 방향으로 나타나는 현상으로 추세반전의 강력한 신호로 간주할 수 있음
- 상승 다이버전스: 가격의 저점 하락, 스토캐스틱 저점 상승의 경우 매수신호 가능성 증가
- 하락 다이버전스: 가격 고점상승, 스토캐스틱 고점 하락의 경우 매도 신호 가능성 능가
장점: 과매도, 과매수 상태를 효과적으로 식별, 가격 움직임보다 추세 전환의 가능성을 선파악에 유리합니다. 또한 상태적으로 짧은 기간의 가격변동에 민감하게 반응합니다.
단점: 횡보 또는 변동성이 큰 상황에서 잘못된 신호의 발생이 빈번할 수 있고 장기간의 과매도, 과매수 영역에 머무를 경우 잘못된 오신호의 발생 가능성이 증가하므로 다른 지표와 함께 사용 (MACD, RSI, MA 등)
StochRSI
RSI지표에 Stochastic Oscillator의 개념을 적용한 모멘트 지표입니다.
$$\begin{align}\text{StochRSI}& = 100 \times \frac{\text{RSI - Low(n)}}{\text{High(n) - Low(n)}}\\ \text{StochRSI_k}& = \text{SMA(STOCHRSI, k)}\\ \text{StochRSI_d}& = \text{SMA(STOCHRSIk, d)} \end{align}$$위 식에서 각 계산 기간 n, k, d는 은 일반적으로 14, 3, 3일을 사용합니다.
pandas_ta.stochrsi(close, length=None, rsi_length=None, k=None, d=None, mamode=None, offset=None, **kwargs)
함수를 사용합니다.이 함수의 결과는 RSI%K, RSI%D를 반환하면 RSI 계산을 위한 기간(length)의 기간의 기본값은 14이며 스토캐스틱을 계산하기 위한 기간 ris_length, 그 값의 스토캐스틱의 이평 %K를 위한 기간 k, %K의 이평 계산 즉, %D를 위한 기간 d이며 각각의 기본값은 14, 3, 3입니다.
df=trg.copy() df[['%K','%D']] = df.ta.stochrsi() df.tail(3)
Open | High | Low | Close | Volume | %K | %D | |
---|---|---|---|---|---|---|---|
Date | |||||||
2025-04-29 | 182000 | 182900 | 179100 | 180800 | 1866386 | 87.202132 | 92.128631 |
2025-04-30 | 179100 | 180000 | 176700 | 177500 | 2354473 | 69.095675 | 83.065877 |
2025-05-02 | 179400 | 186200 | 178400 | 186000 | 3886269 | 72.479786 | 76.259198 |
adf=[mpf.make_addplot(ta.ema(df.Close, 5), panel=0, color="brown", label="ema5"), mpf.make_addplot(ta.ema(df.Close, 20), panel=0, color="navy", label="ema20"), mpf.make_addplot(df["%K"], panel=1, color="brown", label="%K", title="StochasticRSI"), mpf.make_addplot(df["%D"], panel=1, color="navy", label="%D")] f, axs=mpf.plot(df.iloc[:,:4], type="candle", style="yahoo",volume=False, addplot=adf, returnfig=True, figsize=(12,8)) axs[0].legend(loc="upper left") axs[2].legend(loc="upper left") axs[2].axhline(80, color='r', ls="dashed" ) axs[2].axhline(20, color='b', ls="dashed" ) plt.show()
stochastic oscillator와 유사하지만 변화의 폭이 더 큰 형태를 보입니다. 기본적으로 지표의 상승은 가격의 상승, 하락은 가격의 하락과 매칭됩니다. 또한 상승추세에서는 %K > %D, 하락 추세에서는 반대의 형태를 보입니다. %K와 %D의 교차로 추세 전환을 암시하는데 가격의 변화보다 앞선 신호를 전달하는 경향이 있습니다.
- 과매수 및 과매도:
- > 80: 과매수 상태로 간주하며, 가격 하락 가능성을 시사
- < 20: 과매도 상태로 간주하며, 가격 상승 가능성을 시사
- 일반적인 RSI보다 과매수/과매도 영역에 더 자주 도달하는 경향이 있습니다.
- 중심선 () 돌파:
- 50 위로 돌파: 상승 추세의 강화 또는 시작을 시사
- 50 아래로 하향 돌파: 하락 추세의 강화 또는 시작을 시사
- 교차 (Crossovers):
- %K 선이 %D 선을 상향 돌파: 매수 신호로 시사
- %K 선이 %D 선을 하향 돌파: 매도 신호로 시사
- 다이버전스 (Divergence):
- 강세 다이버전스: 가격은 저점을 낮추는데 StochRSI는 저점을 높이는 경우 (상승 반전 가능성).
- 약세 다이버전스: 가격은 고점을 높이는데 StochRSI는 고점을 낮추는 경우 (하락 반전 가능성).
장점
- RSI보다 더욱 민감하게 과매수/과매도 상태를 감지하여 더 빠른 거래 신호를 제공할 수 있습니다.
- 횡보장에서의 단기적인 반등 및 하락을 포착하는 데 유용할 수 있습니다.
- 다이버전스를 통해 추세 반전 가능성을 조기에 감지하는 데 도움을 줄 수 있습니다.
단점
- 민감도가 높아 노이즈(false signal)가 많이 발생할 수 있습니다.
- 강한 추세 시장에서는 과매수/과매도 상태가 오래 지속될 수 있으므로 주의해야 합니다.
- 단독으로 사용하기보다는 다른 기술적 지표 및 분석 방법과 함께 사용하는 것이 좋습니다.
댓글
댓글 쓰기