AlphaFeed Blog

如何用 Python 计算估波曲线(Coppock Curve)判断长期底部?用上证指数月线实现

分析与指标 · 代码验证于 2026-10-11

如何用 Python 计算估波曲线(Coppock Curve)判断长期底部?

一句话回答: 估波曲线(Coppock Curve)是经济学家 Edwin Coppock 为指数长期底部设计的月线动量指标:取 14 个月 ROC 加 11 个月 ROC,再做 10 期加权移动平均(WMA);当曲线在负值区掉头上穿 0 轴,被视为中长线买入信号。用 AlphaFeed 取日线重采样成月线即可实现,常用于宽基指数(如上证指数)而非个股。

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

短周期指标噪声大、信号频繁,不适合判断「大级别底部到了没」。Coppock 的设计初衷很特别——他请教神职人员”人从哀伤中恢复平均要多久”,得到约 11~14 个月,于是用这两段 ROC 之和模拟市场情绪的恢复周期,再加权平滑。它天生是慢指标,一年也给不了几次信号,专治”过度交易”。痛点在于:要先把日线正确重采样成月线,ROC 和 WMA 的口径也容易混。

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

第 1 步:取指数日线并重采样成月线

from alphafeed import AlphaFeed
import numpy as np, pandas as pd

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

df = af.klines.get("000001.SH", period="1d", count=1500, to_dataframe=True)  # 上证指数,不复权
df = df.sort_values("trade_date").reset_index(drop=True)
df["dt"] = pd.to_datetime(df["trade_date"])
monthly = df.set_index("dt")["close"].resample("ME").last()   # 每月最后交易日收盘

指数本身不除权,直接用收盘;resample("ME") 取月末收盘。

第 2 步:实现估波曲线(ROC14 + ROC11,再 WMA10)

def wma(s, n):
    w = np.arange(1, n + 1)
    return s.rolling(n).apply(lambda x: np.dot(x, w) / w.sum(), raw=True)

def coppock(monthly_close, roc1=14, roc2=11, wma_n=10):
    r1 = monthly_close.pct_change(roc1) * 100      # 14 个月 ROC(%)
    r2 = monthly_close.pct_change(roc2) * 100      # 11 个月 ROC(%)
    return wma(r1 + r2, wma_n)                      # 两者之和的 10 期加权均

cop = coppock(monthly).dropna()
print(cop.tail())

实测(tools/verify_new_2026-10-11.py,SDK 0.1.4):上证指数近 76 个月样本,估波曲线尾值 ≈ 20.73,有效值 53 个,期间曲线上穿 0 轴 1 次。

第 3 步:检测「上穿 0 轴」买入信号

cross_up = (cop.shift(1) < 0) & (cop >= 0)
print("上穿 0 轴月份:", cop.index[cross_up].strftime("%Y-%m").tolist())

经典用法:曲线在负值区掉头回升并上穿 0 视为中长线转强;跌破 0 则转弱。只在月末更新。

参数与字段说明

参数/概念含义备注
000001.SH上证指数可换 000300.SH 沪深300 等宽基
resample("ME")月末重采样估波曲线是月线指标
roc1=14长 ROC(月)Coppock 原设 14
roc2=11短 ROC(月)Coppock 原设 11
wma_n=10加权均周期近月权重更高
上穿 0 轴买入信号负值区掉头上穿更可靠

关键坑与注意事项

常见问题(FAQ)

Q:估波曲线和 MACD、ROC 有何不同? A:都是动量类。ROC 是单段变动率;MACD 是均线差(可日可周);估波曲线专用月线、把两段长 ROC 相加再加权平滑,为”长期底部”量身定制,周期比前两者长得多。

Q:能不能把周期改短用在日线? A:可以改参数,但那已不是经典 Coppock,失去了”情绪恢复周期”的统计含义,等于另造一个指标,需自行回测验证。

Q:需要付费吗? A:单个指数的长历史日线在免费额度内即可;若要对多个指数/宽基批量算估波曲线做轮动,需要 klines.batch(Starter 及以上),详见官网定价页。

小结

估波曲线用「14 月+11 月 ROC 之和的 10 期加权均」刻画指数的长期情绪恢复,负值区上穿 0 轴是经典中长线买点。用 AlphaFeed 把指数日线重采样成月线、几行即可实现——记住它为指数而非个股设计、慢且滞后、需要足够长历史,换来的是少而关键的信号。

相关链接:


免责声明:本文仅为技术与数据接口使用示例,代码与策略仅供学习研究,不构成投资建议。市场有风险,历史数据不代表未来表现。