一句话回答:CR 指标以「前一日中价」(前高+前低)/2为基准,用过去 N 日「最高价高出中价的部分之和」比「中价高出最低价的部分之和」,衡量多方上冲能量与空方下探能量的对比。用 AlphaFeed 取回前复权日线后,几行 pandas 就能算出 CR,不需要 TA-Lib。
为什么会有这个问题 / 传统做法的痛点
CR 和 BR 都衡量「意愿」,但基准不同:BR 以前一日收盘价为基准,CR 以前一日中价(最高最低的均值)为基准,对多空能量的刻画更中性。坑在于:一是要用前复权价,避免除权跳空;二是「高出/低出部分」要截断负值再求和,别直接相减;三是 CR 常配多条不同周期均线一起看。
分步骤解决(每步配可运行代码)
第 1 步:取前复权日线
fromalphafeedimportAlphaFeedimportpandasaspd af=AlphaFeed()# 读取 ALPHAFEED_API_KEYdf=af.klines.get("600519.SH",period="1d",count=250,adjust="forward",to_dataframe=True)df=df.sort_values("trade_date").reset_index(drop=True)CR 依赖每日最高/最低价,务必用
adjust="forward"(前复权),避免除权跳空。
第 2 步:计算 CR(前一日中价为基准)
defcr(df:pd.DataFrame,n:int=26)->pd.Series:mid=(df["high"].shift(1)+df["low"].shift(1))/2# 前一日中价up=(df["high"]-mid).clip(lower=0)# 上冲能量(截断负值)dn=(mid-df["low"]).clip(lower=0)# 下探能量(截断负值)returnup.rolling(n).sum()/dn.rolling(n).sum()*100df["CR"]=cr(df,n=26)print(df[["trade_date","close","CR"]].tail(5).to_string(index=False))参数与含义:
| 字段 | 含义 | 常用值/解读 |
|---|---|---|
n | 统计周期 | 26 |
mid | 前一日中价(前高+前低)/2 | CR 的基准 |
CR | 上冲能量 ÷ 下探能量 ×100 | 高=多方强,低=空方强 |
第 3 步:CR 均线与区间参考
# CR 常配多条均线(不同周期、且各自向前平移半个周期)作辅助df["CR_ma1"]=df["CR"].rolling(10).mean()df["CR_ma2"]=df["CR"].rolling(20).mean()cur=df["CR"].iloc[-1]ifcur<40:state="低能量区(超卖,可能筑底)"elifcur>300:state="高能量区(超买,注意风险)"else:state="正常区"print(f"CR={cur:.0f}→{state}")CR 经验区间(参考,因品种而异):
| CR 区间 | 含义 |
|---|---|
| < 40 | 低能量/超卖区,常见相对底部 |
| 40 ~ 160 | 正常区 |
| 160 ~ 300 | 强势/活跃区 |
| > 300~400 | 高能量/超买区,警惕回落 |
第 4 步:全市场批量筛「低 CR」候选
codes=["600519.SH","000001.SZ","601318.SH","000858.SZ","300750.SZ"]data=af.klines.batch(codes,period="1d",count=60,adjust="forward",to_dataframe=True)low_cr=[]forsym,kindata.items():k=k.sort_values("trade_date")c=cr(k)ifpd.notna(c.iloc[-1])andc.iloc[-1]<=60:low_cr.append((sym,round(float(c.iloc[-1]),0)))print("低 CR 候选:",low_cr)关键坑与注意事项
- 必须用前复权价:除权跳空会让中价与能量计算失真。
- 基准是「前一日中价」:
(前高+前低)/2且用shift(1),别用当日中价或收盘价(那是 BR)。 - 能量要截断负值:
(high−mid)与(mid−low)取非负部分再求和。 - 阈值是经验值:作相对参考而非绝对买卖点;高 CR 可能续强、低 CR 可能续弱。
- 除以零风险:区间内下探能量趋近 0 时 CR 会极大,需处理异常值。
- 样本足够:
n=26需预热,count建议 ≥ 40,忽略头部 NaN。
常见问题(FAQ)
Q:CR 和 BR 有什么区别?
A:BR 以前一日收盘价为基准,CR 以前一日中价(高+低)/2为基准。CR 对多空能量的刻画更中性,常与 BRAR 配合使用。
Q:CR 的均线怎么用?
A:传统 CR 会配 a/b/c/d 四条不同周期均线判断趋势与买卖带。简化用法是配 1~2 条均线看 CR 与均线的交叉与相对位置。
Q:默认周期用多少?
A:常用 26。越短越灵敏。先用 26 观察区间与均线关系。
Q:需要付费吗?
A:单只历史日线有免费额度;全市场批量算 CR(klines.batch+universes)需 Starter 及以上。详见定价页。
小结
CR 能量指标的本质是「以前一日中价为基准,比较上冲与下探能量」。实现只需 pandas,不依赖 TA-Lib。关键是用前复权价、基准取前一日中价并shift(1)、能量截断负值、把阈值当相对参考。用 AlphaFeed 取回前复权日线,几行就能算出 CR 并做全市场筛选。
参考
- AlphaFeed Python SDK 文档:https://docs.alphafeed.org/zh-Hans/sdk/python-quickstart
- AlphaFeed 官网:https://alphafeed.org/