기본 콘텐츠로 건너뛰기

[matplotlib]quiver()함수

[Stock]Stochastic Oscillator & StochRSI

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)가 많이 발생할 수 있습니다.
  • 강한 추세 시장에서는 과매수/과매도 상태가 오래 지속될 수 있으므로 주의해야 합니다.
  • 단독으로 사용하기보다는 다른 기술적 지표 및 분석 방법과 함께 사용하는 것이 좋습니다.

댓글

이 블로그의 인기 게시물

[Linear Algebra] 유사변환(Similarity transformation)

유사변환(Similarity transformation) n×n 차원의 정방 행렬 A, B 그리고 가역 행렬 P 사이에 식 1의 관계가 성립하면 행렬 A와 B는 유사행렬(similarity matrix)이 되며 행렬 A를 가역행렬 P와 B로 분해하는 것을 유사 변환(similarity transformation) 이라고 합니다. $$\tag{1} A = PBP^{-1} \Leftrightarrow P^{-1}AP = B $$ 식 2는 식 1의 양변에 B의 고유값을 고려한 것입니다. \begin{align}\tag{식 2} B - \lambda I &= P^{-1}AP – \lambda P^{-1}P\\ &= P^{-1}(AP – \lambda P)\\ &= P^{-1}(A - \lambda I)P \end{align} 식 2의 행렬식은 식 3과 같이 정리됩니다. \begin{align} &\begin{aligned}\textsf{det}(B - \lambda I ) & = \textsf{det}(P^{-1}(AP – \lambda P))\\ &= \textsf{det}(P^{-1}) \textsf{det}((A – \lambda I)) \textsf{det}(P)\\ &= \textsf{det}(P^{-1}) \textsf{det}(P) \textsf{det}((A – \lambda I))\\ &= \textsf{det}(A – \lambda I)\end{aligned}\\ &\begin{aligned}\because \; \textsf{det}(P^{-1}) \textsf{det}(P) &= \textsf{det}(P^{-1}P)\\ &= \textsf{det}(I)\end{aligned}\end{align} 유사행렬의 특성 유사행렬인 두 정방행렬 A와 B는 'A ~ B' 와 같...

[sympy] Sympy객체의 표현을 위한 함수들

Sympy객체의 표현을 위한 함수들 General simplify(x): 식 x(sympy 객체)를 간단히 정리 합니다. import numpy as np from sympy import * x=symbols("x") a=sin(x)**2+cos(x)**2 a $\sin^{2}{\left(x \right)} + \cos^{2}{\left(x \right)}$ simplify(a) 1 simplify(b) $\frac{x^{3} + x^{2} - x - 1}{x^{2} + 2 x + 1}$ simplify(b) x - 1 c=gamma(x)/gamma(x-2) c $\frac{\Gamma\left(x\right)}{\Gamma\left(x - 2\right)}$ simplify(c) $\displaystyle \left(x - 2\right) \left(x - 1\right)$ 위의 예들 중 객체 c의 감마함수(gamma(x))는 확률분포 등 여러 부분에서 사용되는 표현식으로 다음과 같이 정의 됩니다. 감마함수는 음이 아닌 정수를 제외한 모든 수에서 정의됩니다. 식 1과 같이 자연수에서 감마함수는 factorial(!), 부동소수(양의 실수)인 경우 적분을 적용하여 계산합니다. $$\tag{식 1}\Gamma(n) =\begin{cases}(n-1)!& n:\text{자연수}\\\int^\infty_0x^{n-1}e^{-x}\,dx& n:\text{부동소수}\end{cases}$$ x=symbols('x') gamma(x).subs(x,4) $\displaystyle 6$ factorial 계산은 math.factorial() 함수를 사용할 수 있습니다. import math math.factorial(3) 6 a=gamma(x).subs(x,4.5) a.evalf(3) 11.6 simpilfy() 함수의 알고리즘은 식에서 공통사항을 찾아 정리하...

sympy.solvers로 방정식해 구하기

sympy.solvers로 방정식해 구하기 대수 방정식을 해를 계산하기 위해 다음 함수를 사용합니다. sympy.solvers.solve(f, *symbols, **flags) f=0, 즉 동차방정식에 대해 지정한 변수의 해를 계산 f : 식 또는 함수 symbols: 식의 해를 계산하기 위한 변수, 변수가 하나인 경우는 생략가능(자동으로 인식) flags: 계산 또는 결과의 방식을 지정하기 위한 인수들 dict=True: {x:3, y:1}같이 사전형식, 기본값 = False set=True :{(x,3),(y,1)}같이 집합형식, 기본값 = False ratioal=True : 실수를 유리수로 반환, 기본값 = False positive=True: 해들 중에 양수만을 반환, 기본값 = False 예 $x^2=1$의 해를 결정합니다. solve() 함수에 적용하기 위해서는 다음과 같이 식의 한쪽이 0이 되는 형태인 동차식으로 구성되어야 합니다. $$x^2-1=0$$ import numpy as np from sympy import * x = symbols('x') solve(x**2-1, x) [-1, 1] 위 식은 계산 과정은 다음과 같습니다. $$\begin{aligned}x^2-1=0 \rightarrow (x+1)(x-1)=0 \\ x=1 \; \text{or}\; -1\end{aligned}$$ 예 $x^4=1$의 해를 결정합니다. solve() 함수의 인수 set=True를 지정하였으므로 결과는 집합(set)형으로 반환됩니다. eq=x**4-1 solve(eq, set=True) ([x], {(-1,), (-I,), (1,), (I,)}) 위의 경우 I는 복소수입니다.즉 위 결과의 과정은 다음과 같습니다. $$x^4-1=(x^2+1)(x+1)(x-1)=0 \rightarrow x=\pm \sqrt{-1}, \; \pm 1=\pm i,\; \pm1$$ 실수...