CCI (Commodity Channel Index) - 商品通道指标
1 公式
TYP典型价格 = (最高价 + 最低价 + 收盘价) ➗ 3
CCI = (TYP - TYP的N日简单移动平均 ) ➗ (0.015 ✖ TYP的N日平均偏差)
其中,TYP的N日平均绝对方差,计算方式 = (N日内的TYP价格 - N日TPY价格的算术平均值) 的绝对值的平均
2 数据准备
我们以科创50指数 000688 为例,指数开始日期为2019-12-31,数据格式如下:
3 计算过程
def calculate_cci(df: pd.DataFrame, N=14):
'''
计算 Commodity Channel Index (CCI)。
参数:
df (pd.DataFrame): 包含至少 'high', 'low', 'close' 列的DataFrame,分别代表每日最高价、最低价和收盘价。
N (int): 用于计算CCI的时间窗口大小,默认为14。
返回:
pd.DataFrame: 包含 CCI 值的DataFrame。
'''
# 创建一个df的副本以避免修改原始数据
data = df.copy()
# 计算典型价格,它是每日最高价、最低价和收盘价的平均值
typical_price = (data['high'] + data['low'] + data['close']) / 3
# 计算典型价格的N期简单移动平均线 (SMA)
typical_price_ma = typical_price.rolling(N).mean()
# 计算平均偏差,这是典型价格与典型价格移动平均线之间的绝对偏差的平均值
mean_deviation = typical_price.rolling(N).apply(
lambda x: np.mean(np.abs(x - x.mean())), raw=True)
# 计算 CCI
# CCI = (典型价格 - 典型价格的移动平均) / (常数 * 平均偏差)
# 常数通常为0.015
cci = (typical_price - typical_price_ma) / (0.015 * mean_deviation)
# 将计算出的 CCI 添加到 DataFrame
data['cci'] = cci
# 返回包含所有计算出指标的 DataFrame
return data
4 注意事项
参数N=14时,计算结果与东方财富软件中一致
与雪球中显示值不一致