AlphaFeed Blog

如何用 Python 计算 BBI 多空指标?(多周期均线的多空分界线)

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

如何用 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 步:取前复权日线

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

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 步:识别多空穿越(金叉/死叉分界线)

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」的多头股

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)

关键坑与注意事项

常见问题(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 取回前复权日线,从单股多空判断到全市场多头筛选都能几行搞定。

相关链接:


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