CCI (Commodity Channel Index) 파이썬 코딩
현재의 가격이 이동 평균선과 얼마만큼 떨어져 있는지를 나타내는 지수가 바로 CCI입니다. 함께 만들고 모두 누리는 우리말 사전에서는 CCI를 영문 Commodity Channel Index 그대로 코모디티 채널 인덱스라고 부릅니다. 이번 포스팅에서는 코모디티 채널 인덱스를 파이썬으로 구현하는 방법을 알아보겠습니다.
글의 순서
코모디티 채널 인덱스(CCI, Commodity Channel Index)
CCI 계산 방법
예제를 통한 CCI 계산 방법 이해
파이썬 코드 : CCI
코모디티 채널 인덱스(CCI, Commodity Channel Index)
코모디티 채널 인덱스(Commodity Channel Index)는 기술적 분석에서 주로 과매수(overbought)와 과매도(oversold) 수준을 식별하기 위해 사용되는 모멘텀 오실레이터입니다. CCI는 주식, 외환, 가상화폐 등 금융 상품의 가격 변동이 통계적 평균에서 얼마나 벗어났는지를 측정합니다. 그러니까 CCI를 통해 현재 가격이 과거의 평균 가격으로부터 얼마나 떨어져 있는지를 알 수 있습니다.
도널드 램버트(Donald Lambert)가 1980년에 개발한 CCI는 트레이더들 사이에서 널리 사용되는 지표로, 과매수/과매도 수준 외에 반전(reversals)과 다이버전스(divergences)를 찾기 위해서도 사용됩니다.
CCI 계산 방법
코모디티 채널 인덱스를 계산하는 과정은 다음과 같습니다.
step1) Typical Price(TP)을 계산
TP = (고가 + 저가 + 종가) / 3
step2) TP의 20 기간 동안의 단순 이동 평균(SMA) 계산
step3) 평균 편차 계산
– 최근 20 기간 동안의 모든 TP에서 SMA를 뺀 값을 구합니다.
– 이 값들의 절대 값을 더합니다.
– 이 값을 전체 기간(이 경우 20)으로 나눕니다.
step4) CCI 계산
CCI = (TP – 20 기간 TP의 SMA) / (0.015 x 평균 편차)
여기서, 0.015는 CCI 값을 표준화하기 위한 상수입니다. 이 상수가 들어감으로써 대부분의 코모디티 채널 인덱스 값이 +100에서 -100 사이에 위치하게 됩니다.
예제를 통한 CCI 계산 방법 이해
예제 값을 이용해서 CCI 구하는 과정을 이해해 보겠습니다.
Step 1) TP(Typical Price) 계산
Typical Price(TP)는 고가, 저가, 종가의 평균입니다.
1 |
TP = (고가 + 저가 + 종가) / 3 |
예를 들어, 고가가 129.40, 저가가 128.91, 종가가 129.20이라면,
1 |
TP = (129.40 + 128.91 + 129.20) / 3 = 129.17 |
Step 2) TP의 단순 이동 평균 (SMA_TP) 계산
TP의 5기간 단순 이동 평균을 계산합니다. 예를 들어, 다음과 같은 TP 값이 있을 때,
1 2 |
TP 값들: [126.88, 128.09, 128.68, 129.17, 128.59] SMA_TP = (126.88 + 128.09 + 128.68 + 129.17 + 128.59) / 5 = 128.68 |
Step 3) 평균 편차 (Mean Deviation) 계산 – 각 TP 값에서 SMA_TP를 뺀 후 절대값을 구합니다. – 이 절대값들의 합을 구합니다. – 이 값을 기간(이 예제에서는 5)으로 나눕니다.,
1 2 3 4 5 6 7 8 9 10 11 12 |
TP 값들: [126.88, 128.09, 128.68, 129.17, 128.59] SMA_TP: 128.68 각 TP 값에서 SMA_TP를 뺀 값의 절대값: |126.88 - 128.68| = 1.80 |128.09 - 128.68| = 0.59 |128.68 - 128.68| = 0.00 |129.17 - 128.68| = 0.49 |128.59 - 128.68| = 0.09 절대값의 합: 1.80 + 0.59 + 0.00 + 0.49 + 0.09 = 2.97 평균 편차: 2.97 / 5 = 0.594 |
파이썬 코드 : 코모디티 채널 인덱스(CCI)
CCI를 아래의 파이썬 코드에서 구현하였습니다. Commodity Channel Index와 실제 가격과의 상관관계를 파악할 수 있도록 캔들차트와 이동평균선, CCI를 함께 나타내었습니다. 실습코드는 파이썬 pyplot으로 구현한 캔들스틱 차트에 이동평균선을 함께 그리고, 그 아래에는 Commodity Channel Index를 나타내는 코드입니다.
위에서 설명한 CCI 구하는 절차 Step1 ~ step 3 기준으로 코드를 보시면 이해가 빠를 것입니다.
코드의 맨 마지막 부분에 차트를 그림파일로 저장하는 방법을 보여줍니다. 이 포스팅에서도 그래프가 C:/_python/pandas/candle_pyplot/ 이라는 폴더에 저장됩니다. 물론 파일이 저장되는 경로는 각자 개인이 원하는 곳으로 지정하시면 되겠습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 |
import os import pandas as pd import numpy as np from binance.client import Client import datetime from datetime import datetime, timedelta import matplotlib.pyplot as plt import matplotlib.dates as mdates # 01) 바이낸스 계정 접속 api_key = os.getenv('Binan_API_KEY') api_secret = os.getenv('Binan_SECRET_KEY') client = Client(api_key, api_secret) print('\n', '[ BINANCE ACCOUNT ACCESSED ]') # 02) 입력 : 시계열 데이터 수집 구간(tstt~tend), 시간 간격(t_interval) tstt_utc = '2024-07-01 00:00:00' tend_utc = '2024-08-06 23:59:59' t_interval = '12h' ticker = 'BTCUSDT' # 02-1) 그래프에 나타낼 구간 tstt_KST_plt = datetime.strptime('2024-07-01 00:00:00', '%Y-%m-%d %H:%M:%S') tend_KST_plt = datetime.strptime('2024-08-06 18:00:00', '%Y-%m-%d %H:%M:%S') # 02-2) 시간 형식을 'YYMMDD_HHMM'로 변환 : string tstt_KST = tstt_KST_plt.strftime('%y%m%d_%H%M') tend_KST = tend_KST_plt.strftime('%y%m%d_%H%M') # 02-3) 그래프 출력, 파일명 file_path = 'C:/_python/pandas/candle_pyplot/' file_name = file_path + f'{tend_KST}_{ticker}_{t_interval}_CCI.png' # 02-4) SMA, CCI 구하기 위한 시간 구간 개수 period = 20 # 03) 파이썬 바이낸스 API로 비트코인 가격 데이터 가져오기 bars = client.get_historical_klines(ticker, t_interval, tstt_utc, tend_utc, limit=1000) # 03-1) ohlcv 데이터만 추출 for i in bars: del i[6:] # 03-2) 데이터프레임 열 이름 붙여주기 df = pd.DataFrame(bars, columns=['Date', 'Open', 'High', 'Low', 'Close', 'Volume']) # 03-3) 데이터프레임 열 type을 실수형으로 변환 df = df.astype({'Open': 'float', 'High': 'float', 'Low': 'float', 'Close': 'float', 'Volume': 'float'}) # 03-4) Date 열의 형태를 epoch에서 Pandas.Timestamp로 변경 df['Date'] = pd.to_datetime(df['Date'], unit='ms').dt.tz_localize('UTC').dt.tz_convert('Asia/Seoul').dt.tz_localize(None) # 04-1) Commodity Channel Index 계산 함수 def calculate_cci(df, period): # step1) typical price(TP) = (고가 + 저가 + 종가) / 3 df['TP'] = (df['High'] + df['Low'] + df['Close']) / 3 # step2) TP의 단순 이동 평균(SMA) df['SMA_TP'] = df['TP'].rolling(window=period).mean() # step3) 평균 편차 def mean_deviation(series): mean = series.mean() return (series - mean).abs().mean() df['Mean_Deviation'] = df['TP'].rolling(window=period).apply(mean_deviation) # 코모디티 채널 인덱스(CCI) constant = 0.015 df['CCI'] = (df['TP'] - df['SMA_TP']) / (constant * df['Mean_Deviation']) return df # 04-2) 단순 이동평균 df['SMA'] = df['Close'].rolling(window=period).mean() # 04-3) Commodity Channel Index df = calculate_cci(df, period) # 05) 캔들 차트 및 CCI 그래프 df = df[(df['Date'] >= tstt_KST_plt) & (df['Date'] <= tend_KST_plt)] fig, axs = plt.subplots(2, 1, figsize=(12, 12), sharex=True) title_plot = f'{ticker} Candlestick with CCI' # 캔들 차트 그리기 candle_width = max(0.1, 0.5 * (axs[1].get_window_extent().width / len(df))) for i in range(len(df)): color = 'green' if df['Close'].iloc[i] >= df['Open'].iloc[i] else 'red' axs[0].plot([df['Date'].iloc[i], df['Date'].iloc[i]], [df['Low'].iloc[i], df['High'].iloc[i]], color=color) axs[0].plot([df['Date'].iloc[i], df['Date'].iloc[i]], [df['Open'].iloc[i], df['Close'].iloc[i]], color=color, linewidth=candle_width) axs[0].plot(df['Date'], df['SMA'], label='SMA', color='navy', linestyle='-.') axs[0].set_title(title_plot, fontsize=20) axs[0].set_ylabel('Price (USDT)') axs[0].legend() axs[0].grid(True) # CCI 차트 그리기 axs[1].plot(df['Date'], df['CCI'], label='CCI', color='b') axs[1].axhline(100, color='r', linestyle='--', label='Overbought (100)') axs[1].axhline(-100, color='g', linestyle='--', label='Oversold (-100)') axs[1].set_ylabel('CCI') axs[1].set_xlim([tstt_KST_plt, tend_KST_plt]) axs[1].tick_params(axis='x', rotation=15) axs[1].legend() axs[1].grid(True) plt.subplots_adjust(hspace=0.1) plt.savefig(file_name, dpi=100) plt.show() |
마치며 …
이번 포스팅에서는 코모디티 채널 인덱스(CCI, Commodity Channel Index)를 파이썬 코드로 구현해보았습니다. Commodity Channel Index는 최근 가격이 이동평균과 얼마나 떨어져 있는지를 표시함으로써 추세의 강도와 방향을 나타내줍니다. 코모디티 채널 인덱스는 대체로 0을 기준으로 +100과 -100 사이에서 움직이는데, 급격한 가격의 변동이 있을 경우 100보다 큰 값이 나올 수도 있습니다. 이번 포스팅에서 보여드린 파이썬 코드를 통해 최적의 매매 기회를 포착하는데 유용하게 사용하시길 바랍니다.
함께 참고하면 좋은 글
▶ 호크아이 거래량 지표 (HawkEye Volume Indicator) 파이썬 코딩
▶ 볼린저밴드, BBW, 파이썬 pyplot 캔들스틱 차트에 표시 방법
▶ 파이썬 pyplot 캔들스틱 차트, 스토캐스틱 RSI 차트
▶ 바이낸스 API, 판다스 시계열 데이터 분석. 볼린저 밴드 지표 %b, 밴드폭(Bandwidth)
▶ 캔들 차트의 의미와 파이썬 pyplot으로 그리는 캔들스틱 차트
▶ 파이썬 바이낸스 API로 시계열 데이터 분석. 판다스, 볼린저 밴드 (Bollinger Band)
▶ 파이썬 바이낸스 비트코인 투자 백테스팅 : 볼린저 밴드 추세 추종 매매 기법
▶ 파이썬 바이낸스 API로 시계열 데이터를 가져오는 파이썬 프로그래밍
▶ mplfinance 캔들 차트 스타일
▶ 캔들 차트 스타일 변경 (mplfinance, customization)
▶ 바이낸스 API 보안을 위한 환경 변수 설정 : 윈도우 10
▶ 시계열 데이터 분석 : 추세분석 지표 6가지
참고자료
WIKIPEDIA, commodity channel index