[기술적 분석] 지표/전략 : 스토캐스틱 슬로우(Stochastic Slow)

반응형

 

2024.05.05 - [주가 분석/기술적 분석] - [기술적 분석] 지표/전략 : 스토캐스틱 패스트(Stochastic Fast)

 

[기술적 분석] 지표/전략 : 스토캐스틱 패스트(Stochastic Fast)

유명한 보조지표 중 하나인 스토캐스틱 오실레이터(Stochastic Oscillator)는 이를 활용한 스토캐스틱 슬로우(Stochastic Slow)와 구별하기 위해 스토캐스틱 패스트(Stochastic Fast)라는 이름으로 더 자주 불

antsinvest.tistory.com

 

  앞서 소개한 스토캐스틱 패스트(Stochastic Fast)에 이어 이번에는 스토캐스틱 슬로우(Stochastic Slow)를 소개한다. 스토캐스틱 슬로우는 스토캐스틱 패스트의 단점을 일부 개선한 지표로 스토캐스틱 패스트와 마찬가지로 관찰기간 내 최대값과 최소값 사이의 현재 주가 가격의 위치를 표시한다. 단, 스토캐스틱 패스트의 경우, 기간 내 최저가와 최고가 사이의 현재 가격의 위치를 %K로 표시하는데, 이 %K의 움직임은 가격변화와 거의 유사하게 움직이므로 허위 시그널을 만들어내는 등의 문제가 있었다. 스토캐스틱 슬로우는 이 문제를 해결하기 위해 %K를 이동평균하여 사용한다. 마찬가지로 스토캐스틱 패스트에서 %K를 이동평균하여 사용하던 %D역시 %K를 이동평균한 것을 한번 더 이동평균해 노이즈를 줄였다. 즉, 스토캐스틱 패스트의 %D가 스토캐스틱 슬로우의 %K이며 이것을 한번 더 이동평균하여 스토캐스틱 슬로우의 %D가 된다. 실제로 비교해 보면 스토캐스틱 패스트와 스토캐스틱 슬로우의 차이점을 확실 히 알 수 있다. 단, %K를 이동 평균할 때, 구간을 1로 주면 스토캐스틱 패스트와 동일한 지표가 된다.

 

스토캐스틱 패스트(Stochastic Fast)와 스토캐스틱 슬로우(Stochastic Slow) 비교

반응형

 

  매매전략은 스토캐스틱 패스트의 그것과 동일하다. %K만 이용하여 과매도, 과매수를 측정하여 매매하는 방법이 있다. %K가 20을 상향 돌파하면 매수, 80을 하향 돌파하면 매도하는 전략을 취할 수 있다.

 

  %K가 %D를 상향 돌파하면 매수, %K가 %D를 하향 돌파하면 매도하는 전략을 취하기도 한다. 스토캐스틱 패스트에 비해 K%의 노이즈가 제거되어 허위 시그널이 발생되는 횟수는 줄었으나 이동 평균을 적용하여 노이즈를 제거했기 때문에 신호가 늦게 발생하는 경우가 생길 수도 있다. 이는 이동평균 종류나 기간을 조절하여 완화할 수 있다.

 

  선물과 같은 파생상품 거래에서는 앞서 과매수, 과매도 전략과 반대로 %K가 80을 상향 돌파하면 매수 포지션을 잡고, %K가 %D를 하향 돌파할 경우 매수 포지션을 청산, 반대로 %K가 20을 하향 돌파하면 매도 포지션을 잡고 %K가 %D를 상향 돌파할 경우 매도 포지션을 청산하는 전략을 사용하기도 한다. 이는 소위 말하는 추세와 모멘텀에 기반한 투자 전략으로 스토캐스틱 팝(POP) 전략이라고도 한다.

 

  이 외에 전략으로 만들어 적용하기는 어렵지만 다이버전스(Divergence)라고 해서 가격은 상승하나 스토캐스틱은 상승하지 못하고 하락하는 경우, 가격은 하락하나 스토캐스틱은 완만하게 상승하는 경우, 추세전환의 신호로 인식하기도 한다. 보통 다이버전스 전에 스토캐스틱의 기울기가 가파르게 움직이다가 둔화되는데 이것을 힌지(Hinge)라고 하며 추세 전환의 선행 신호로 본다. 이 외에 스토캐스틱 %K, %D 모두 최상단이나 최하단을 빠르게 찍고 돌아오는 경우, 최하단을 찍고 돌아올 때는 무릎(Knee), 최상단을 찍고 돌아올 때는 어깨(Shoulder)라고 하며 이 무릎과 어깨(Knee & Shoulder)가 발생하면 추세전환이 되었다고 보기도 한다.

 

  일단 전략을 돌려보면 스토캐스틱 패스트에 비해 대체로 수익률이 좋게 나오며(스토캐스틱 패스트만 해도 수익률은 굉장히 좋게 나오는 지표 중 하나), 여기에 더해 다른 지표, 특히 RSI와 결합하여 많이 사용된다.

 

 

  마지막으로 트레이딩 뷰 파인 스크립트 소스와 pandas-ta 소스를 공유하며 마친다.

 

  • 스토캐스틱 슬로우(Stochastic Slow) 트레이딩 뷰 파인 스크립트 지표 소스
//@version=5
indicator(title="Stochastic Slow", shorttitle="StochS", format=format.price, precision=2, timeframe="", timeframe_gaps=true)
import TradingView/ta/7 as ta7
import blackcat1402/pandas_ta/7 as pta
ma(source, length, _type) =>
    switch _type
        "SMA" => ta.sma(source, length)
        "EMA" => ta.ema(source, length)
        "DEMA" => ta7.dema(source,length)
        "TEMA" => ta7.tema(source,length)
        "FRAMA" => ta7.frama(source,length)
        "T3" => ta7.t3(source,length)
        "TRIMA" => ta7.trima(source,length)
        "RMA" => ta.rma(source, length)
        "WMA" => ta.wma(source, length)
        "HMA" => ta.hma(source, length)
        "VWMA" => ta.vwma(source * volume, length)
        "ALMA" => pta.alma(source, length)
        "JMA" => pta.jma(source, length)
        "SINWMA" => pta.sinwma(source, length)
        "FWMA" => pta.fwma(source, length)
        "LINREG" => pta.linreg(source, length)
        "SWMA" => pta.swma(source)
        "YIDYA" => pta.vidya(source, length)
        "VWAP" => pta.vwap(source)
        "ZLMA" => pta.zlma(source, length)

periodK = input.int(14, title="%K Length", group="%K Settings", minval=1)
smoothK = input.int(3, title="%K Smoothing", group="%K Settings", minval=1)
kmaTypeInput = input.string("SMA", title="%K MA Type", options = ["SMA", "EMA", "DEMA", "TEMA", "FRAMA", "T3", "TRIMA", "RMA", "WMA", "HMA", "VWMA", "ALMA", "JMA", "SINWMA", "FWMA", "LINREG", "SWMA", "VIDYA", "VWAP", "ZLMA"], group="%K Settings", display = display.data_window)
periodD = input.int(3, title="%D Smoothing", group="%D Settings", minval=1)
dmaTypeInput = input.string("SMA", title="%K MA Type", options = ["SMA", "EMA", "DEMA", "TEMA", "FRAMA", "T3", "TRIMA", "RMA", "WMA", "HMA", "VWMA", "ALMA", "JMA", "SINWMA", "FWMA", "LINREG", "SWMA", "VIDYA", "VWAP", "ZLMA"], group="%D Settings", display = display.data_window)
lower = input.int(80, title="Lower", group="Band Settings")
upper = input.int(20, title="Upper", group="Band Settings")


k = ma(ta.stoch(close, high, low, periodK), smoothK, kmaTypeInput)
d = ma(k, periodD, dmaTypeInput)


plot(k, title="%K", color=color.blue)
plot(d, title="%D", color=color.red)
upperBand = hline(upper, "Upper Band", color=color.gray)
hline(50, "Middle Band", linestyle=hline.style_dotted, color=color.gray)
lowerBand = hline(lower, "Lower Band", color=color.gray)
fill(upperBand, lowerBand, title="Background", color=color.new(color.gray, 80))

 

 

  • 스토캐스틱 슬로우(Stochastic Slow) 트레이딩 뷰 파인 스크립트 전략 소스
//@version=5
strategy(title="Stochastic Slow", shorttitle="StochS", margin_long=100, margin_short=100, default_qty_type=strategy.percent_of_equity, default_qty_value=50, commission_type=strategy.commission.percent, commission_value=0.2, pyramiding=0)
import TradingView/ta/7 as ta7
import blackcat1402/pandas_ta/7 as pta
ma(source, length, _type) =>
    switch _type
        "SMA" => ta.sma(source, length)
        "EMA" => ta.ema(source, length)
        "DEMA" => ta7.dema(source,length)
        "TEMA" => ta7.tema(source,length)
        "FRAMA" => ta7.frama(source,length)
        "T3" => ta7.t3(source,length)
        "TRIMA" => ta7.trima(source,length)
        "RMA" => ta.rma(source, length)
        "WMA" => ta.wma(source, length)
        "HMA" => ta.hma(source, length)
        "VWMA" => ta.vwma(source * volume, length)
        "ALMA" => pta.alma(source, length)
        "JMA" => pta.jma(source, length)
        "SINWMA" => pta.sinwma(source, length)
        "FWMA" => pta.fwma(source, length)
        "LINREG" => pta.linreg(source, length)
        "SWMA" => pta.swma(source)
        "YIDYA" => pta.vidya(source, length)
        "VWAP" => pta.vwap(source)
        "ZLMA" => pta.zlma(source, length)

periodK = input.int(14, title="%K Length", group="%K Settings", minval=1)
smoothK = input.int(3, title="%K Smoothing", group="%K Settings", minval=1)
kmaTypeInput = input.string("SMA", title="%K MA Type", options = ["SMA", "EMA", "DEMA", "TEMA", "FRAMA", "T3", "TRIMA", "RMA", "WMA", "HMA", "VWMA", "ALMA", "JMA", "SINWMA", "FWMA", "LINREG", "SWMA", "VIDYA", "VWAP", "ZLMA"], group="%K Settings", display = display.data_window)
periodD = input.int(3, title="%D Smoothing", group="%D Settings", minval=1)
dmaTypeInput = input.string("SMA", title="%K MA Type", options = ["SMA", "EMA", "DEMA", "TEMA", "FRAMA", "T3", "TRIMA", "RMA", "WMA", "HMA", "VWMA", "ALMA", "JMA", "SINWMA", "FWMA", "LINREG", "SWMA", "VIDYA", "VWAP", "ZLMA"], group="%D Settings", display = display.data_window)
lower = input.int(80, title="Lower", group="Band Settings")
upper = input.int(20, title="Upper", group="Band Settings")
indi = input.string("%K-Band", title="Strategy Indicator", options = ["%K-Band", "%D-Band", "%K-%D"])


k = ma(ta.stoch(close, high, low, periodK), smoothK, kmaTypeInput)
d = ma(k, periodD, dmaTypeInput)


plot(k, title="%K", color=color.blue)
plot(d, title="%D", color=color.red)
upperBand = hline(upper, "Upper Band", color=color.gray)
hline(50, "Middle Band", linestyle=hline.style_dotted, color=color.gray)
lowerBand = hline(lower, "Lower Band", color=color.gray)
fill(upperBand, lowerBand, title="Background", color=color.new(color.gray, 80))

startDate = input.time(defval=timestamp("01 Jan 1970 00:00 +0000"), group = "Test Range")
finishDate = input.time(defval=timestamp("31 Dec 2025 24:00 +0000"), group = "Test Range")
time_condition = time >= startDate and time <= finishDate
 
if(time_condition)
	if (indi == "%K-Band")
		if ta.crossover(k, lower)
			strategy.entry("매수", strategy.long, oca_type=strategy.oca.cancel, comment="매수")
		if ta.crossunder(k, upper)
			strategy.close_all('매도')
	if (indi == "%D-Band")
		if ta.crossover(d, lower)
			strategy.entry("매수", strategy.long, oca_type=strategy.oca.cancel, comment="매수")
		if ta.crossunder(d, upper)
			strategy.close_all('매도')
	if (indi == "%K-%D")
		if ta.crossover(k, d)
			strategy.entry("매수", strategy.long, oca_type=strategy.oca.cancel, comment="매수")
		if ta.crossunder(k, d)
			strategy.close_all('매도')
	
bgcolor(strategy.position_size > 0 ? color.new(color.yellow,90) : na)

 

 

  • 스토캐스틱 슬로우(Stochastic Slow) pandas-ta 소스
import pandas as pd
import pandas_ta as ta
import FinanceDataReader as fdr

data = fdr.DataReader('005930')
stoch = ta.stoch(high=data['High'], low=data['Low'], close=data['Close'], k=14, d=3, smooth_k=3, mamode='SMA')
data = pd.concat([data, stoch], axis=1)
data.dropna(inplace=True)

 

반응형