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

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

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

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

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

第 1 步:取前复权日线

python 复制代码
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(前一日中价为基准)

python 复制代码
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 前一日中价 (前高+前低)/2 CR 的基准
CR 上冲能量 ÷ 下探能量 ×100 高=多方强,低=空方强

第 3 步:CR 均线与区间参考

python 复制代码
# 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」候选

python 复制代码
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)

关键坑与注意事项

  • 必须用前复权价:除权跳空会让中价与能量计算失真。
  • 基准是「前一日中价」 :(前高+前低)/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 并做全市场筛选。

参考

相关推荐
曲径海盗1 小时前
【Python 学习第 34 天】条件判断 if/else
python·学习笔记·编程入门
用户6602676118791 小时前
重试不重复下单还不够:同一幂等键换了参数,应该返回什么?
python
五网1 小时前
用Python搭建创业项目财务测算模型:CAC、LTV、盈亏平衡点一键算出(附完整代码)
python
用户6602676118791 小时前
登录成功就能读取任意任务 ID 吗?给 SaaS 读写加上租户范围
python
用户7624117567052 小时前
第十五章 数据分析
python·数据分析
2601_961963382 小时前
电子合同检索与全文搜索怎么测、怎么选:六个指标 + 五家平台对比 + 八个自测问题
数据库·后端·python·django·智能合约
SEO_juper2 小时前
hreflang 审计工具:外贸多语言站谷歌SEO的隐性杀手
开发语言·人工智能·爬虫·python·seo
打工仔折腾 AI2 小时前
从零开始大模型微调:基于 PyTorch 与 ChatGLM 的 LoRA 实践指南
人工智能·pytorch·后端·python·深度学习·性能优化·ai agent 实战
用户0332126663672 小时前
Python 自动化办公:如何从零快速生成结构清晰的 Excel 报表
python·excel