如何用 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 并做全市场筛选。

参考

相关推荐
打工仔折腾 AI1 小时前
LangChain 工具调用实战:从 Tool 定义到 Agent 执行链路拆解
java·前端·人工智能·后端·python·langchain·ai agent 实战
hhb_6181 小时前
Flask+SQLite实现用户管理接口
python·sqlite·flask
全栈练习生1 小时前
RAG 准确率保障的体系化方案
python·ai
秋秋小事1 小时前
python 基础知识总结(一)
python
临床数据科学和人工智能兴趣组1 小时前
在R语言的生态系统中,字符串处理一直是一个重要且复杂的任务
开发语言·正则表达式·r语言·r语言-4.2.1
蜗牛互联网1 小时前
Python调用Gemini Structured Outputs实现工单路由门禁
java·开发语言·人工智能·python
TomEval2 小时前
【测AI】第12篇:NLP / CV / 语音 —— 三大 AI 方向速通
人工智能·python·自然语言处理·aigc·测试用例
SEO_juper2 小时前
给网页做可引用性评分:判断内容够不够让 AI 引用(GEO 工具,附代码)
开发语言·人工智能·爬虫·python·seo·独立站
AI直播技术杂谈2 小时前
无人直播中控的硬件底线,旧电脑要满足哪些条件
网络·python·ai·云计算