如何用 Python 计算 BBI 多空指标?

一句话回答: BBI(Bull and Bear Index,多空指标)是 3、6、12、24 日四条简单均线的平均值:BBI = (MA3 + MA6 + MA12 + MA24) / 4,用一条线同时兼顾短、中期均线,价格在 BBI 之上视为多头、之下视为空头。用 AlphaFeed 取回前复权日线后,几行 pandas 就能算出 BBI,完全不需要 TA-Lib。

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

看均线时同时挂 5/10/20/60 太乱,判断多空要来回比对多条线。BBI 的思路是把几条不同周期均线平均成一条,兼顾灵敏与稳健,得到一条清爽的「多空分界线」:站上就是多头格局,跌破就是空头格局。坑在于要用前复权价,否则除权跳空让均线失真。

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

第 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)

BBI 由多条均线构成,务必用 adjust="forward"(前复权),避免除权断层。

第 2 步:计算 BBI

python 复制代码
def bbi(close: pd.Series, windows=(3, 6, 12, 24)) -> pd.Series:
    mas = [close.rolling(w).mean() for w in windows]
    return sum(mas) / len(mas)

df["BBI"] = bbi(df["close"])
df["pos"] = (df["close"] > df["BBI"]).map({True: "多头", False: "空头"})
print(df[["trade_date", "close", "BBI", "pos"]].tail(5).to_string(index=False))

参数与含义:

参数/字段 含义 常用值
windows 四条均线周期 (3, 6, 12, 24)
BBI 四条均线的平均 多空分界线
收盘 > BBI 多头格局 偏多
收盘 < BBI 空头格局 偏空

第 3 步:识别多空穿越(金叉/死叉分界线)

python 复制代码
df["cross"] = df["pos"].ne(df["pos"].shift())
sig = df[df["cross"] & df.index.to_series().gt(0)]
print(sig[["trade_date", "close", "BBI", "pos"]].tail(5).to_string(index=False))
# pos 由"空头"变"多头" = 站上 BBI(偏多信号);反之跌破 BBI(偏空信号)

第 4 步:全市场筛「站上 BBI」的多头股

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)  # dict{symbol: DataFrame}

bull = []
for sym, k in data.items():
    k = k.sort_values("trade_date")
    b = bbi(k["close"])
    if k["close"].iloc[-1] > b.iloc[-1]:
        bull.append(sym)
print("站上 BBI(多头格局):", bull)

关键坑与注意事项

  • 必须用前复权价:除权跳空会让四条均线与 BBI 失真。
  • BBI 是格局线不是精确买卖点:站上/跌破反映多空格局,具体择时需配合量能、其它指标。
  • 震荡市易反复穿越:横盘时价格反复上下穿 BBI,会产生较多假信号,可加趋势过滤(如 ADX)。
  • 头部数据为 NaN :最长的 24 日均线需要预热期,count 建议 ≥ 30 以上,忽略序列最前面若干根。
  • 参数可调:短线可缩短为 (3,6,9,18) 等,但改参数后与通用 BBI 数值不同,跨平台对比先统一。
  • 权重相等:BBI 对四条均线等权平均,短周期占比其实更高(因为短均线波动大),理解这点有助于判断灵敏度。

常见问题(FAQ)

Q:BBI 和单看均线有什么优势?

A:BBI 把多条周期均线合成一条,既有短均线的灵敏、又有长均线的稳健,判断多空格局更省事、更少噪音。

Q:默认参数 3/6/12/24 能改吗?

A:能。想更灵敏可用更短的组合,想更稳健可拉长。默认 3/6/12/24 是通用设置,先用它。

Q:为什么前面几十行是 NaN?

A:24 日均线需要 24 根数据预热,序列头部为 NaN 属正常,取足够长样本即可。

Q:需要付费吗?

A:单只历史日线有免费额度;全市场批量筛 BBI(klines.batch + universes)需 Starter 及以上。详见定价页。

小结

BBI 多空指标的本质是「多条周期均线的平均分界线」,用一条线判断多空格局。实现只需 pandas 的 rolling 求四条均线再平均,不依赖 TA-Lib。关键是用前复权价、把它当格局线而非精确买卖点。用 AlphaFeed 取回前复权日线,从单股多空判断到全市场多头筛选都能几行搞定。

参考

相关推荐
必须得开心呀4 小时前
为什么 python-docx 打不开加密的 .docx,Word COM 却能打开
python·word
VidDown4 小时前
上传 2GB 文件别让 Django 接:分片上传、对象存储直传与秒传
python·django·音视频·状态模式·实时音视频·视频编解码·视频
老王爱玩车4 小时前
动态内存管理
c语言·开发语言·学习·面试
I'm Jie4 小时前
【开源】7 天,我用 Rust 复刻了 FinalShell!Rhost v1.0.0 发布
开发语言·rust·开源
打工仔折腾 AI4 小时前
FaceFusion本地换脸实战:Windows整合包、模型选择与遮罩调参记录
人工智能·windows·后端·python·深度学习·性能优化·ai agent 实战
yi0114 小时前
DAY24: LeetCode 167:两数之和 II|从暴力枚举到左右双指针
笔记·python·算法·leetcode·二分查找·双指针
kimnoic4 小时前
Python常用命令提示符使用方法详解
开发语言·python
Crazy________4 小时前
05Linux内存管理核心原理与运维实战
java·开发语言
Nebula_g4 小时前
JavaSE拓展:工具类Executors
java·开发语言·后端·spring·基础·javase