AlphaFeed Blog

如何用 Python 计算 CR 能量指标(中间意愿指标)?判断多空能量强弱

分析与指标 · 代码验证于 2026-09-30

如何用 Python 计算 CR 能量指标(中间意愿指标)?

一句话回答: CR 指标以「前一日中价」(前高+前低)/2 为基准,用过去 N 日「最高价高出中价的部分之和」比「中价高出最低价的部分之和」,衡量多方上冲能量与空方下探能量的对比。用 AlphaFeed 取回前复权日线后,几行 pandas 就能算出 CR,不需要 TA-Lib。

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

CR 和 BR 都衡量「意愿」,但基准不同:BR 以前一日收盘价为基准,CR 以前一日中价(最高最低的均值)为基准,对多空能量的刻画更中性。坑在于:一是要用前复权价,避免除权跳空;二是「高出/低出部分」要截断负值再求和,别直接相减;三是 CR 常配多条不同周期均线一起看。

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

第 1 步:取前复权日线

from alphafeed import AlphaFeed
import pandas as pd

af = AlphaFeed()  # 读取 ALPHAFEED_API_KEY

df = 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(前一日中价为基准)

def cr(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)                   # 下探能量(截断负值)
    return up.rolling(n).sum() / dn.rolling(n).sum() * 100

df["CR"] = cr(df, n=26)
print(df[["trade_date", "close", "CR"]].tail(5).to_string(index=False))

参数与含义:

字段含义常用值/解读
n统计周期26
mid前一日中价 (前高+前低)/2CR 的基准
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]
if cur < 40:
    state = "低能量区(超卖,可能筑底)"
elif cur > 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 = []
for sym, k in data.items():
    k = k.sort_values("trade_date")
    c = cr(k)
    if pd.notna(c.iloc[-1]) and c.iloc[-1] <= 60:
        low_cr.append((sym, round(float(c.iloc[-1]), 0)))
print("低 CR 候选:", low_cr)

关键坑与注意事项

常见问题(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 并做全市场筛选。

相关链接:


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