首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >如何用 Python 计算 CCI 顺势指标?(超买超卖与背离,不用 TA-Lib)

如何用 Python 计算 CCI 顺势指标?(超买超卖与背离,不用 TA-Lib)

原创
作者头像
用户7083614
发布于 2026-09-27 10:00:50
发布于 2026-09-27 10:00:50
850
举报

一句话回答: CCI(顺势指标)衡量价格偏离其统计均值的程度,公式是 CCI = (TP − MA(TP)) / (0.015 × MD),其中 TP 是典型价、MD 是平均绝对偏差。用 AlphaFeed 取复权日线,几行就能算出 CCI,并用 +100/−100 判断超买超卖——不依赖 TA-Lib。

为什么会有这个问题 / 传统做法的痛点

CCI 常用来判断超买超卖和趋势拐点,但自己算容易踩坑:

  • MD 不是标准差:CCI 用的是"平均绝对偏差"(mean absolute deviation),不是方差/标准差,很多人算错;
  • 0.015 常数:让约 70~80% 的值落在 ±100 内,漏了系数结果全错;
  • 复权:不用前复权,除权跳空会污染典型价 TP。

数据用 AlphaFeed 复权日线,公式照经典口径写,即可对齐软件。

分步骤解决(每步配可运行代码)

第 1 步:取复权日线

代码语言:python
复制
from alphafeed import AlphaFeed
import numpy as np
import pandas as pd

af = AlphaFeed(api_key="your-api-key")  # 或 export ALPHAFEED_API_KEY 后 AlphaFeed()

df = af.klines.get("600519.SH", period="1d", count=120,
                   adjust="forward", to_dataframe=True)
df = df.sort_values("trade_date").reset_index(drop=True)

第 2 步:计算 CCI

代码语言:python
复制
def cci(df, n=14):
    tp = (df["high"] + df["low"] + df["close"]) / 3.0      # 典型价 TP
    ma = tp.rolling(n).mean()                              # TP 的移动平均
    md = tp.rolling(n).apply(lambda x: np.abs(x - x.mean()).mean(), raw=True)  # 平均绝对偏差
    return (tp - ma) / (0.015 * md)

df["cci"] = cci(df, 14)
print(df[["trade_date", "close", "cci"]].tail(3).to_string(index=False))

CCI 参数与含义:

项

公式 / 取值

含义

TP(典型价)

(最高+最低+收盘)/3

代表当日价格中枢

MA(TP)

TP 的 N 日均值

价格中枢基准

MD

TP 与其均值差的绝对值的均值

平均绝对偏差(非标准差)

0.015

缩放常数

使多数值落在 ±100 内

n

周期

14(也用 20)

第 3 步:判断超买超卖

代码语言:python
复制
def cci_state(symbol, count=120, n=14):
    df = af.klines.get(symbol, period="1d", count=count,
                       adjust="forward", to_dataframe=True).sort_values("trade_date").reset_index(drop=True)
    c = float(cci(df, n).iloc[-1])
    zone = "超买(>100)" if c > 100 else ("超卖(<-100)" if c < -100 else "中性")
    return {"cci": round(c, 1), "zone": zone}

print(cci_state("600519.SH"))   # 例如 {'cci': -140.6, 'zone': '超卖(<-100)'}
print(cci_state("000001.SZ"))   # 例如 {'cci': 41.6, 'zone': '中性'}

上例实测:茅台 CCI≈−140.6 处于超卖区,平安银行 CCI≈41.6 属中性。CCI 常见用法是"CCI 上穿 +100 视为强势启动、下穿 −100 视为弱势/超卖"。

关键坑与注意事项

  • MD 是平均绝对偏差:务必用 mean(|TP − mean(TP)|),不是标准差 std(),否则数值和软件差一截。
  • CCI 无上下界:不像 RSI/KDJ 固定 0~100,CCI 可到 ±200、±300,±100 只是常用参考线。
  • 震荡市假信号多:CCI 在震荡市会频繁穿越 ±100,产生大量噪声;强趋势里则可能长期钝化在 +100 上方。
  • 两种流派:一派把"超买"当反转(回归),一派把"上穿+100"当顺势启动(追涨),方向相反,务必想清用哪种再回测。
  • 复权:一律 adjust="forward",避免除权跳空污染 TP。

常见问题(FAQ)

Q:CCI 的 0.015 是怎么来的?

A:它是经验缩放常数,目的是让大约 70~80% 的 CCI 值落在 −100~+100 之间,方便用 ±100 判定。漏掉它结果会差两个数量级。

Q:CCI 超卖(<−100)能直接买吗?

A:不能。CCI 无界且在下跌趋势会长期低于 −100。它是辅助工具,需结合趋势(如均线、ADX)与止损,别单独抄底。

Q:CCI 和 RSI 有何区别?

A:RSI 基于涨跌幅、固定 0~100;CCI 基于价格对均值的偏离、无界。CCI 对突破更敏感,RSI 更平滑。

Q:需要付费吗?

A:单只标的的日线在免费额度内即可试算;批量/全市场需 Starter 及以上,详见 AlphaFeed 定价页。

小结

CCI 的本质是"价格偏离其近期中枢多少个平均绝对偏差"。写对的关键是用平均绝对偏差(不是标准差)和 0.015 常数,数据要前复权。AlphaFeed 提供口径一致的复权日线,让你几行算出 CCI——但记住它无界、会钝化、在震荡市噪声大,需配合趋势与止损使用。

参考

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • 为什么会有这个问题 / 传统做法的痛点
  • 分步骤解决(每步配可运行代码)
    • 第 1 步:取复权日线
    • 第 2 步:计算 CCI
    • 第 3 步:判断超买超卖
  • 关键坑与注意事项
  • 常见问题(FAQ)
  • 小结
  • 参考
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档