Commodity Channel Index (CCI)를 활용한 트레이딩전략(Trading Strategy Using Commodity Channel Index)

Commodity Channel Index (CCI)의 개념

Commodity Channel Index (CCI)는 Donald Lambert가 1980년대에 개발한 모멘텀 기반 기술적 지표이다. CCI는 주가, 상품 가격 등이 통계적으로 정상 범위에서 벗어나는 시점을 파악하기 위해 사용된다. 이 지표는 현재 가격을 이전 가격의 평균과 비교하여 계산된다.

CCI는 다음과 같은 공식으로 계산된다:

CCI = (Typical Price - Simple Moving Average(Typical Price, n)) / (0.015 * Mean Deviation(Typical Price, n))

여기서, Typical Price = (High + Low + Close) / 3이고, n은 일반적으로 20일로 설정한다. Mean Deviation은 Typical Price의 평균에서 각 Typical Price의 절대 편차의 평균이다.

CCI의 값은 일반적으로 -100에서 +100 사이에 위치한다. +100 이상의 값은 강한 상승 추세를, -100 이하의 값은 강한 하락 추세를 나타낸다. 또한, CCI가 +100에서 -100으로, 또는 -100에서 +100으로 교차할 때, 추세 전환 신호로 해석할 수 있다.

CCI를 활용한 트레이딩전략

CCI를 활용한 트레이딩전략은 다음과 같이 구성할 수 있다:

  1. CCI가 +100 이상으로 상승하면 매수 신호로 간주한다.
  2. CCI가 -100 이하로 하락하면 매도 신호로 간주한다.
  3. CCI가 +100에서 -100으로 하향 돌파할 때 매도 신호로, -100에서 +100으로 상향 돌파할 때 매수 신호로 간주할 수 있다.
  4. 추가적으로, 가격 차트와 CCI를 함께 분석하여 매매 타이밍을 결정할 수 있다. 예를 들어, CCI가 +100 이상이고 가격이 상승 추세를 보인다면 매수 신호로 간주할 수 있다.

이 전략은 CCI를 통해 가격의 모멘텀을 파악하고, 이를 기반으로 매매 타이밍을 결정하는 것이 특징이다.

파이썬 코드 예시

다음은 FinanceDataReader 모듈을 사용하여 VOO ETF 데이터를 가져와 CCI를 계산하고, 이를 기반으로 매매 신호를 생성하는 파이썬 코드 예시이다.

먼저, 필요한 라이브러리를 가상환경에 설치한다:

python -m venv myenv
source myenv/bin/activate
pip install finance-datareader pandas numpy matplotlib

이제 코드를 실행할 수 있다:

import FinanceDataReader as fdr
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

def calculate_cci(data, ndays=20):
    typical_price = (data['High'] + data['Low'] + data['Close']) / 3
    moving_avg = typical_price.rolling(ndays).mean()
    mean_deviation = typical_price.rolling(ndays).apply(lambda x: pd.Series(x).mad())
    cci = (typical_price - moving_avg) / (0.015 * mean_deviation)
    return cci

try:
    # VOO ETF 데이터 가져오기
    data = fdr.DataReader('VOO', data_source='yahoo')

    # CCI 계산
    data['CCI'] = calculate_cci(data)

    # 매매 신호 생성
    data['signal'] = 0
    data['signal'][data['CCI'] > 100] = 1
    data['signal'][data['CCI'] < -100] = -1

    # 수익률 계산
    data['returns'] = data['Close'].pct_change()
    data['strategy_returns'] = data['signal'].shift(1) * data['returns']

    # 누적 수익률 계산
    data['cumulative_returns'] = (1 + data['strategy_returns']).cumprod()

    # 결과 출력
    print(data.tail())

    # 그래프 그리기
    plt.figure(figsize=(12, 8))
    plt.plot(data['cumulative_returns'])
    plt.title('Commodity Channel Index (CCI) Strategy Backtest')
    plt.ylabel('Cumulative Returns')
    plt.xlabel('Date')
    plt.grid(True)
    plt.show()

except Exception as e:
    print(f"An error occurred: {e}")

이 코드는 FinanceDataReader 모듈을 사용하여 VOO ETF 데이터를 가져와 CCI를 계산한다. 그런 다음, CCI가 +100 이상이면 매수 신호(+1), -100 이하이면 매도 신호(-1)를 생성한다. 이 신호를 기반으로 전략의 일간 수익률과 누적 수익률을 계산하고, 마지막으로 누적 수익률을 그래프로 그려 전략의 성과를 시각화한다.

또한, 코드는 try-except 블록으로 감싸져 있어 오류가 발생하면 오류 메시지를 출력한다. 이는 데이터를 가져오거나 계산하는 과정에서 발생할 수 있는 오류를 처리하기 위함이다.

Leave a Reply

error: Content is protected !!