如何用 Python 计算估波曲线(Coppock Curve)判断长期底部?用上证指数月线实现
如何用 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 轴 | 买入信号 | 负值区掉头上穿更可靠 |
关键坑与注意事项
- 为指数设计,不是个股:Coppock 的统计规律基于宽基指数的长期均值回归;套在单只股票上含义弱、噪声大,慎用。
- 慢且滞后:14 个月 ROC + 10 期 WMA 决定了它反应很慢,底部确认往往已反弹一段;它换来的是少假信号,不是抄到最低点。
- 需要足够长历史:至少 14+10≈24 个月才出第一个值,样本太短无法用。
- 只在月末更新:别用日线频繁看,那样违背设计初衷。
- 历史不代表未来:A 股与美股节奏不同,经典阈值和周期不保证同样有效,可回测校准。
常见问题(FAQ)
Q:估波曲线和 MACD、ROC 有何不同? A:都是动量类。ROC 是单段变动率;MACD 是均线差(可日可周);估波曲线专用月线、把两段长 ROC 相加再加权平滑,为”长期底部”量身定制,周期比前两者长得多。
Q:能不能把周期改短用在日线? A:可以改参数,但那已不是经典 Coppock,失去了”情绪恢复周期”的统计含义,等于另造一个指标,需自行回测验证。
Q:需要付费吗?
A:单个指数的长历史日线在免费额度内即可;若要对多个指数/宽基批量算估波曲线做轮动,需要 klines.batch(Starter 及以上),详见官网定价页。
小结
估波曲线用「14 月+11 月 ROC 之和的 10 期加权均」刻画指数的长期情绪恢复,负值区上穿 0 轴是经典中长线买点。用 AlphaFeed 把指数日线重采样成月线、几行即可实现——记住它为指数而非个股设计、慢且滞后、需要足够长历史,换来的是少而关键的信号。
相关链接:
- AlphaFeed 官网:https://alphafeed.org/
- Python SDK 快速开始:https://docs.alphafeed.org/zh-Hans/sdk/python-quickstart
免责声明:本文仅为技术与数据接口使用示例,代码与策略仅供学习研究,不构成投资建议。市场有风险,历史数据不代表未来表现。