본문 바로가기

주식 분석

기술적 분석 (4) - 스토캐스틱 (Stochastic Oscillator)

 이번에 살펴볼 지표는 스토캐스틱(Stochastic Oscillator) 입니다. '모 변호사'가 마법의 지표라고도 불렀던 지표 입니다. 주로 차트의 추세를 파악하는데 사용합니다. 최근 N일간의 최고가와 최저가의 범위 내에서 현재 가격의 위치를 백분율로 표시한 지표입니다. 

 스토캐스틱 지표는 Fast와 Slow로 나뉘고, 각각의 %K, %D를 구합니다. Fast는 주가에 너무 민감하게 반응하기 때문에 스캘핑 등 아주 짧은 주기의 단타를 하시는 분들만 사용하고, 일반적으로 Slow를 매매에 활용하게 됩니다.

 

삼성전자 차트(영웅문)

 

Fast

 Fast %K = {(현재가 - N기간 중 최저가) / (N기간 중 최고가 - N기간 중 최저가)} * 100

 Fast %D = Fast %K를 M기간 (지수)이동평균

Slow

 Slow %K = Fast %D

 Slow %D = Slow %K를 T기간 이동평균

 

 보통 N,M,T 값은 (12, 5, 5)로 세팅이 되어 있고, 본인의 거래 스타일에 맞게 변경합니다. 단기 매매의 경우에는 N,M,T를 더 작은 값으로, 장기 매매의 경우에는 더 큰 값으로 설정합니다.

 

 위의 공식이 한눈에 들어오시나요? Fast %K가 높다면 N기간 중에서 현재가가 높이 형성 되어 있다는 의미고, %K가 낮다면, 현재가가 낮게 형성 되어 있다는 의미로 볼 수 있습니다. 

 

 스토캐스틱은 추세를 보는 지표라고 했습니다. 그래서 위의 특성들을 이용한 매매기법이 많습니다.

 

매매기법

1) 과매수, 과매도 이용 기법

 - 일반적으로 (20%, 80%)를 기준으로, %K가 20% 이하면 과매도 구간으로 보고 매수 포지션을 잡고, %가 80% 이상이면 과매수 구간으로 보고 매도 포지션을 잡는다.

2) %K와 %D 교차를 이용한 매매기법

 - %K선이 %D 선을 상향 돌파 (골든 크로스) 하면 매수

    - 과매도 구간 (%K 20% 이하)에서 골든 크로스면 확률 상승

 - %K선이 %D 선을 하향 돌파 (데드 크로스) 하면 매도

    - 과매수 구간 (%K 80% 이상) 에서 데드 크로스면 확률 상승

3) 기준선 활용

 - %K선과 %D선이 기준선(보통 50%)을 상향 돌파하면 매수, 하향 돌파하면 매도

 


데이터를 불러줍니다...

.
import pandas as pd
import numpy as np
import plotly.graph_objects as go

path_dir = './data'
data = np.loadtxt(path_dir + '/' + '000660_from_2010.csv', delimiter = ',')
data = pd.DataFrame(data)
data.columns = ['Open', 'High', "Low", "Close", "Volumn", "Adj"]

스토캐스틱을 계산해줍니다. 스토캐스틱 Slow를 주로 활용하기 때문에 스토캐스틱 Slow를 계산합니다.

.
def cal_stc(data, N=12, M=5, T=5) :
    L = data["Low"].rolling(window=N).min()
    H = data["High"].rolling(window=N).max()

    fast_k = ((data["Close"] - L) / (H - L)) * 100
    slow_k = fast_k.ewm(span=M).mean()
    slow_d = slow_k.ewm(span=T).mean()

    return fast_k, slow_k, slow_d

data["FAST_K"], data["SLOW_K"], data["SLOW_D"] = cal_stc(data)

스토캐스틱은 주가랑 같은 그래프에서 나타내기 힘드므로, 스토캐스틱 값만 그래프로 그려줍니다.

.
fig = go.Figure()
fig.add_trace(go.Scatter(x=data.index, y=data["SLOW_K"],
                        mode='lines',
                        name="SLOW_K"))
fig.add_trace(go.Scatter(x=data.index, y=data["SLOW_D"],
                        mode='lines',
                        name="SLOW_D"))

fig.add_trace(go.Scatter(x=data.index, y=np.zeros(len(data.index))+80,
                         mode='lines',
                        name="80"))
fig.add_trace(go.Scatter(x=data.index, y=np.zeros(len(data.index))+20,
                         mode='lines',
                        name="20"))

fig.update_layout(title='Stochastic',
                   xaxis_title='days',
                   yaxis_title='Value')

fig.show()

영웅문의 차트처럼 뭔가 더 예쁘게 그림을 그려보도록 노력해봐야겠습니다...