[기술적 분석] 지표/전략 : CTI (Correlation Trend Indicator)

반응형

 

  CTI(Correlation Trend Indicator)는 앞서 상대 활력 지수(RVI, Relative Vigor Index)에서도 소개했던 존 엘러스(John Ehlers)가 만든 지표로 가격 변화의 상관계수(Correlation)를 표현하는 지표이다. 상관계수를 이용하니 지속적으로 상승하며 그 폭이 일정할 경우 1, 지속적으로 하락하며 그 폭이 일정할 경우 -1이 나온다. 이는 가격변화의 추세를 측정하기에 상당한 인사이트를 제공할 수 있는 좋은 지표이며 앞서 소개했던 CFO(Chande Forecast Oscillator)와 유사하게 선형 회귀(Linear Regression)를 사용한다는 공통점이 있다.

  지금까지 소개했던 다른 지표들과 비교했을 때 가장 현대에 만들어진, 무려 2020년대에 개발된 지표로 아직 다양한 활용법이 연구되고 있는 지표로 종목이나 가격 흐름의 추세를 파악하기에는 탁월한 장점이 있다. 특히 추세가 주춤해지는 지점에, 상승과 하락이 마무리되거나 주춤하는 지점에 값이 0을 향해 움직이기 시작하며, 이는 강하고 긴 추세에서 더욱 극단적으로 나타나게 된다. 반면에 상승 중 눌림목이나 하락 중에 단기적인 반등에서도 이런 신호가 나타나며 이는 허위 신호로 동작하는 경우가 많다.

 

CTI (Correlation Trend Indicator) 보조 지표

반응형

 

  매매 전략은 추세 전환 시, 매수, 매도하는 전략이다. 즉, 0을 기준으로 0을 상향 돌파하면 상승 추세로 보고 매수, 0을 하향 돌파하면 하락 추세로 보고 매도하는 전략이다. 이 전략의 경우 수익률은 제법 좋으나 횡보장이면서 그 폭이 매우 좁고 주가 변동이 심한 경우, 즉 가격 방향성이 없는 경우에는 허위 시그널이 자주 발생할 수 있다. CTI는 상관 계수를 이용한 추세와 모멘텀을 측정하는 지표이므로 추세와 모멘텀이 없는 경우 수익률이 낮게 나오게 된다. 또한 관찰기간 시작일부터 마지막일까지 가격 변화가 결국은 CTI의 양수와 음수를 결정짓는 요소인데 이걸 생각해 보면 신호가 늦게 나올 수밖에 없다. 그렇다고 기간을 줄이면 허위 시그널이 너무 자주 나와 오히려 수익률이 떨어지게 되니 적당한 구간을 찾는 것이 중요하다.

 

  또 다른 매매 전략은 상하단 밴드를 정하고 하단 밴드를 상향 돌파하면 매수, 상단 밴드를 하향 돌파하면 매도하는 전략이다. 이 전략의 경우에는 시그널은 앞서 설명한 0을 기준으로 삼고 매수, 매도하는 전략에 비해 빠르게 포착되나 너무 빠르게 매도하거나 매수하는 경우가 많다. 특히 상승 중 눌림목이나, 하락 중 단기 반등에서 신호가 나와 너무 빠른 진입과 청산으로 수익률이 줄어드는 경우가 많다.

 

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

 

 

  • CTI(Correlation Trend Indicator) 트레이딩 뷰 파인 스크립트 지표 소스
//@version=5
indicator(title="Correlation Trend Indicator", shorttitle="CTI", format=format.price, precision=4, timeframe="", timeframe_gaps=true)

sourceInput = input(defval=close, title="Source")
lengthInput = input.int(defval=14, title="CTI Length")
upperInput = input.float(0.5, title="Upper", group="Band Settings")
lowerInput = input.float(-0.5, title="Lower", group="Band Settings")

cti(source, period) => 
	Ex = 0.0, Ey = 0.0, Ex2 = 0.0, Ey2 = 0.0, Exy = 0.0
	for i=0 to period-1 
		X = nz(source[i])
		Y = -i
		Ex  := Ex  + X
		Ex2 := Ex2 + X * X
		Exy := Exy + X * Y
		Ey2 := Ey2 + Y * Y
		Ey  := Ey  + Y
	denominator = (period * Ex2 - Ex * Ex) * (period * Ey2 - Ey * Ey)
	denominator==0.0 or bar_index==0 ? 0.0 : (period * Exy - Ex * Ey) / math.sqrt(denominator)

cti = cti(sourceInput, lengthInput)

ctiPlot = plot(cti, title="CTI", color=color.yellow)
hline(0, "Middle Line", linestyle=hline.style_dotted, color=color.gray)
midLinePlot = plot(0, color = na, editable = false, display = display.none)
upperBand = hline(upperInput, "Upper Band", color=color.gray)
lowerBand = hline(lowerInput, "Lower Band", color=color.gray)
fill(upperBand, lowerBand, title="Background", color=color.new(color.gray, 90))
fill(ctiPlot, midLinePlot, 1.0, upperInput, top_color = color.green, bottom_color = color.new(color.green, 100))
fill(ctiPlot, midLinePlot, lowerInput, -1.0, top_color = color.new(color.red, 100), bottom_color = color.red)

 

 

  • CTI(Correlation Trend Indicator) 트레이딩 뷰 파인 스크립트 전략 소스
//@version=5
strategy(title="Correlation Trend Indicator", shorttitle="CTI", 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)

sourceInput = input(defval=close, title="Source")
lengthInput = input.int(defval=14, title="CTI Length")
upperInput = input.float(0.5, title="Upper", group="Band Settings")
lowerInput = input.float(-0.5, title="Lower", group="Band Settings")
strategySignal = input.string("CTI-0 Cross", title="Strategy Indicator", options = ["CTI-0 Cross", "CTI-Band"])

cti(source, period) => 
	Ex = 0.0, Ey = 0.0, Ex2 = 0.0, Ey2 = 0.0, Exy = 0.0
	for i=0 to period-1 
		X = nz(source[i])
		Y = -i
		Ex  := Ex  + X
		Ex2 := Ex2 + X * X
		Exy := Exy + X * Y
		Ey2 := Ey2 + Y * Y
		Ey  := Ey  + Y
	denominator = (period * Ex2 - Ex * Ex) * (period * Ey2 - Ey * Ey)
	denominator==0.0 or bar_index==0 ? 0.0 : (period * Exy - Ex * Ey) / math.sqrt(denominator)

cti = cti(sourceInput, lengthInput)

ctiPlot = plot(cti, title="CTI", color=color.yellow)
hline(0, "Middle Line", linestyle=hline.style_dotted, color=color.gray)
midLinePlot = plot(0, color = na, editable = false, display = display.none)
upperBand = hline(upperInput, "Upper Band", color=color.gray)
lowerBand = hline(lowerInput, "Lower Band", color=color.gray)
fill(upperBand, lowerBand, title="Background", color=color.new(color.gray, 90))
fill(ctiPlot, midLinePlot, 1.0, upperInput, top_color = color.green, bottom_color = color.new(color.green, 100))
fill(ctiPlot, midLinePlot, lowerInput, -1.0, top_color = color.new(color.red, 100), bottom_color = color.red)

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 (strategySignal == "CTI-Band")
		if ta.crossover(cti, lowerInput)
			strategy.entry("매수", strategy.long, oca_type=strategy.oca.cancel, comment="매수")
		if ta.crossunder(cti, upperInput)
			strategy.close_all('매도')
	if (strategySignal == "CTI-0 Cross")
		if ta.crossover(cti, 0)
			strategy.entry("매수", strategy.long, oca_type=strategy.oca.cancel, comment="매수")
		if ta.crossunder(cti, 0)
			strategy.close_all('매도')
	
bgcolor(strategy.position_size > 0 ? color.new(color.yellow,90) : na)

  

 

  • CTI(Correlation Trend Indicator) pandas-ta 소스
import pandas as pd
import pandas_ta as ta
import FinanceDataReader as fdr

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