
CCI의 수식, 엑셀과 트레이딩뷰로 구현해보기
*2021-10-26 글
CCI란 Commodity Channel Index의 약자입니다.
상품가격의 흐름을 알아보기 위해 제작된 지표이기에, Commodity(원자재)라는 단어가 사용되는 지표입니다.
주가와 주가 평균의 차를 표준편차로 나눈 수식으로 구성되어 있으며, 이는 성과 지표인 Sharpe Ratio와 부분적으로 흡사한 모습을 보입니다.
A = 고저종가의 평균
B = A의 N기간 이동평균
C = A-B의 N기간 표준편차
CCI = (A - B)/(0.015*C)
Sharpe Ratio의 수식은 다음과 같습니다.
(수익률 - 무위험수익률(벤치마크 수익률)) / 표준편차
Sharpe Ratio의 수익률을 CCI에서의 B 대비 A의 위치로 가정했을 때, 이를 표준편차로 나눈다는 것에 대해 유사한 모습을 보입니다.
CCI는 100과 -100을 기준으로 단기적인 과열구간을 정의합니다.
때문에 위 사진자료와 같이 -100 아래에서 -100을 넘어가는 경우 상승추세의 시작,
반대로 100위에서 100 아래로 내려가는 경우를 하락추세의 시작으로 기준합니다.
그러나 CCI 또한 RSI와 같이, 일정 기준 이상에서의 지속적인 추세를 설명하지 못한다는 한계가 존재합니다.
Sharpe Ratio의 경우: 확정 된 수익률을 표준편차로 나누기 때문에 펀드나 전략의 성과, 즉 변동성 대비 수익률을 나타내지만,
CCI의 경우: 단순히 주가와 평균의 차를 표준편차로 나누기 때문에, 사실상 눌림목에서 객관적인 시세의 위치를 정의하지 못합니다.
Backtest
카카오를 대상으로, 2000년 3월부터 2021년 10월까지 CCI를 사용한 "Long Only" 백테스팅 결과입니다.
모든 백테스트는 리스크 관리를 따로 하지 않았으며, 조건에 따라 자산의 100%를 전부 운용했을 때의 결과입니다.
CCI 설정 값은 14입니다.
1.
매수 조건: CCI가 -100을 상향 돌파 하였을 때
매도 조건: CCI가 100을 하향 돌파 하였을 때
Sharpe Ratio = 0.053
Sortino Ratio = 0.079
좋지 못한 결과입니다. CCI의 변동성 대비 -100부터 100까지의 수치는 좁기에, 전략의 손익비가 좋지 못했다는 것을 알 수 있습니다.
2.
매수 조건: CCI가 -100이하이며 전일 CCI 값보다 금일 CCI 값이 높을 때
매도 조건: CCI가 0이상이며 CCI 값이 2거래일 연속 하락하였을 때
Sharpe Ratio = 0.061
Sortino Ratio = 0.105
1번 결과를 바탕으로, -100을 상향 돌파하는 것이 아닌 전일 대비 CCI 증가 여부를 조건으로 둠에 따라 Hold 기간을 늘리고,
매도 조건 또한 전일 대비 감소 여부를 조건으로 하였습니다. 100아래에서 하락하는 경우를 생각하여 100을 기준으로 두지 않고 0을 기준으로 두었습니다.
결과는 더 나아졌으며, 가정했던 대로 "거래시 평균 캔들 수"와 "거래 당 평균 수익"이 증가한 모습을 확인할 수 있습니다.
3.
매수 조건: CCI가 2거래일 연속 0 이상일 때
매도 조건: CCI가 100을 하향돌파하였을 때
Sharpe Ratio = 0.105
Sortino Ratio = 0.163
이번엔 반대로 보다 추세추종의 성격을 띄는 조건으로 설정하였습니다.
CCI값이 2거래일 연속 0이상일 때의 추세의 흐름을 상승 추세로 정의하고, 매도 조건은 1번과 같이 100을 하향 돌파 하였을 때로 바꾸었습니다.
결과는 매우 나아졌으나, 거래 횟수가 많아 수수료나 슬리피지에 대한 리스크는 커졌다고 볼 수 있습니다.
백테스팅 결과, CCI의 표준적인 기준인 -100과 100은 완전한 임의의 기준으로, 그 근거가 부족한 모습을 보입니다.
다만 상승 추세를 정의할 때 CCI의 제로선은 어느정도 의미가 있는 모습을 보이는 듯 합니다.
Excel
1. 고가, 저가, 종가의 평균
먼저 AVERAGE 함수를 사용해 고가, 저가, 종가의 평균을 구합니다.
"=AVERAGE(B2:D2)"
2. 1번의 이동평균
다시 AVERAGE 함수를 사용해 hlc3(고가,저가,종가의 평균)의 N일 평균을 만들어 줍니다. 저는 14일 평균으로 하였습니다.
"=AVERAGE(E2:E15)"
3. 1,2번 차
hlc3 - hlc3의 평균입니다.
이 때, 표준편차에는 절대값이 사용되기 때문에 ABS 함수를 사용해주시면 됩니다.
"=ABS(E15-F15)"
4. 1,2번 차의 표준편차
STDEV를 사용해 표준편차를 구해주시면 됩니다. 이번에도 아까와 동일하게 14일로 기간을 잡았습니다.
"=STDEV(G15:G28)"
5. CCI
표준편차에 0.015를 곱한 이후 나누어주셔야합니다.
0.015는 임의의 Smooth 값으로, 해당 값이 빠지면 표준적으로 사용되는 CCI와 괴리가 발생합니다.
아까 계산한 hlc3과 hlc3 평균의 차는 절대값을 씌웠으나, 이번에 나누어야하는 대상은 절대값이 아닌 순수 차이기에 해당 부분도 다시 계산해줍니다.
"=(E28-F28)/(H28*0.015)"
TradingView
고저종가의 평균의 계산식은 "(high+low+close)/3"이나, "hlc3"로 대체하셔도 됩니다.
이후 sma함수를 통해 이동평균선을 정의하신 후,
hlc3과 hlc3의 평균의 차에 stdev를 사용하여 표준편차를 구해주시면 됩니다.
//@version=4 study("CCI") N=input(title="N",defval=14,type=input.integer) A = (high+low+close)/3 B = sma(close,N) C = stdev(abs(A-B),N) CCI = (A-B)/(0.015*C) plot(CCI,color=color.black) plot(0,color=color.black,style=plot.style_circles) plot(100,color=color.red,style=plot.style_circles) plot(-100,color=color.navy,style=plot.style_circles)