[기술적 분석] 지표/전략 : 홀트-윈터스 채널 (HWC, Holt-Winters Channels)

반응형
반응형

  홀트-윈터스 채널은 변동성 지표 중 하나다. 예측 분야에서 홀트-윈터스 기법은 계절성과 추세를 반영하기 좋은 기법인데, 이를 이용한 홀트-윈터스 채널은 다른 밴드, 채널 지표들과 유사하나 파라메터들을 잘만 만져서 사용하면 추세를 반영하는 밴드를 구현할 수 있다. 혹은 월봉으로 바꾼 후, 계절성이 있는 종목들, 예를 들어, 매출이나 성장 변동은 미비하고 배당률이 좋아 날이 쌀쌀해진다 하면 오르는 배당주, 특정 계절에 매출이 확 올라가는 의류, 여행주 등에 적용해서 계절성을 반영한 가격 변동을 관찰할 때도 사용할 수 있다. 

 

  대부분의 변동성 지표들이 추세를 반영하지 못해 지속적으로 상승하는 상황에 매도 시그널을 낸다는 건데, 홀트-윈터스 채널은 기본적으로 추세를 고려한다. 이게 홀트-윈터스 채널의 가장 큰 장점. 

홀트-윈터스 채널 차트

  표준편차를 이용하는 볼린저 밴드의 경우에는 위의 차트와 같은 경우, 지속적으로 상승하는 구간에서 밴드폭이 변동성 때문에 넓어지게 될텐데, 홀트-윈터스 채널은 오히려 더 좁아지고 추세가 꺽이는 지점에서 밴드가 벌어진다. 볼린저 밴드와 비교해보면 확실히 알 수 있다.

홀트-윈터스 채널과 볼린저 밴드 비교

  위 차트에서 파란색 밴드가 홀트-윈터스 채널, 붉은색 밴드가 볼린저 밴드이다.

 

  홀트-윈터스 채널은 평활 지수, 채널 폭 외에 추세와, 계정성을 반영할 수 있는 파라메터가 있으니 이를 잘 조절해서 쓰면 유요한 지표이자 전략이다. 다른 변동성 지표 및 전략들과 마찬가지로 채널 상단에 다다르면 매도, 채널 하단에 다다르면 매수를 검토한다.

 

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

 

 

  • 홀트-윈터스 채널 (HWC, Holt-Winters Channels) 트레이딩 뷰 파인 스크립트 지표 소스
//@version=5
indicator(title="Holt-Winters Channels", shorttitle="HWC", overlay=true, timeframe="", timeframe_gaps=true)

src = input(close, title="Source")
scalar = input.float(1, minval=0.1, maxval=5, title="Scalar")
v_na = input(0.2, "Smoothed Series")
v_nb = input(0.1, "Trend Value")
v_nc = input(0.1, "Seasonality Value")
v_nd = input(0.1, "Channel Value")

F = 0.0
V = 0.0
A = 0.0
v_var = 0.0
result = 0.0
stddev = 0.0
hwma = 0.0
	
F := (1.0 - v_na) * (nz(F[1] + nz(V[1]) + 0.5 * nz(A[1]))) + v_na * src
V := (1.0 - v_nb) * (nz(V[1]) +  nz(A[1]) + v_nb * (F - nz(F[1])))
A := (1.0 - v_nc) * nz(A[1]) + v_nc * (V - nz(V[1]))
result := F + V + 0.5 * A
v_var := (1.0 - v_nd) * nz(v_var[1]) + v_nd * (src[1] - result[1]) * (src[1] - result[1])
stddev := math.sqrt(v_var[1])
hwma := F + (V + (A/2))

upper = result + scalar * stddev
lower = result - scalar * stddev
p1 = plot(upper, "Upper", color=#2962FF)
p2 = plot(lower, "Lower", color=#2962FF)
fill(p1, p2, title = "Background", color=color.rgb(33, 150, 243, 95))
plot(hwma, 'hwma', color=color.new(color.green, 0), linewidth=1)

 

 

  • 홀트-윈터스 채널 (HWC, Holt-Winters Channels) 트레이딩 뷰 파인 스크립트 전략 소스
//@version=5
strategy(title="Holt-Winters Channels", shorttitle="HWC",  overlay=true, 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)
 
src = input(close, title="Source")
scalar = input.float(1, minval=0.1, maxval=5, title="Scalar")
v_na = input(0.2, "Smoothed Series")
v_nb = input(0.1, "Trend Value")
v_nc = input(0.1, "Seasonality Value")
v_nd = input(0.1, "Channel Value")

F = 0.0
V = 0.0
A = 0.0
v_var = 0.0
result = 0.0
stddev = 0.0
hwma = 0.0
	
F := (1.0 - v_na) * (nz(F[1] + nz(V[1]) + 0.5 * nz(A[1]))) + v_na * src
V := (1.0 - v_nb) * (nz(V[1]) +  nz(A[1]) + v_nb * (F - nz(F[1])))
A := (1.0 - v_nc) * nz(A[1]) + v_nc * (V - nz(V[1]))
result := F + V + 0.5 * A
v_var := (1.0 - v_nd) * nz(v_var[1]) + v_nd * (src[1] - result[1]) * (src[1] - result[1])
stddev := math.sqrt(v_var[1])
hwma := F + (V + (A/2))

upper = result + scalar * stddev
lower = result - scalar * stddev
p1 = plot(upper, "Upper", color=#2962FF)
p2 = plot(lower, "Lower", color=#2962FF)
fill(p1, p2, title = "Background", color=color.rgb(33, 150, 243, 95))
plot(hwma, 'hwma', color=color.new(color.green, 0), linewidth=1)

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 ta.crossover(src, lower)
		strategy.entry("매수", strategy.long, stop=lower, oca_type=strategy.oca.cancel, comment="매수")
	if ta.crossunder(src, upper)
		strategy.close_all('매도')
 
bgcolor(strategy.position_size > 0 ? color.new(color.yellow,90) : na)

 

 

  • 홀트-윈터스 채널 (HWC, Holt-Winters Channels) pandas-ta 소스
import pandas as pd
import pandas_ta as ta
import FinanceDataReader as fdr

data = fdr.DataReader('005930')
hwc = ta.hwc(close=data['Close'])
data = pd.concat([data, hwc], axis=1)
data.dropna(inplace=True)
반응형