AlphaFeed Blog

如何用 Python 计算梅斯线(Mass Index)预警趋势反转?不用 TA-Lib

分析与指标 · 代码验证于 2026-10-11

如何用 Python 计算梅斯线(Mass Index)预警趋势反转?

一句话回答: 梅斯线(Mass Index,MI)不看方向、只看波动区间的收放:先算每日「高−低」的 9 日 EMA,再除以它自己的 9 日 EMA 得到比值,最后把比值做 25 日累加。当 MI 升破 27 再跌回 26.5,形成所谓「反转鼓包(reversal bulge)」,常预示当前趋势即将反转。用 AlphaFeed 取前复权日线的 high/low,几行就能实现,不需要 TA-Lib。

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

大多数指标(MACD、RSI 等)盯的是价格方向或动量,而梅斯线由 Donald Dorsey 提出,专门盯振幅:当日内高低价差连续放大,说明市场正在积蓄能量,往往出现在趋势的转折附近。它的独特价值是「不预测涨跌、只提示”该变盘了”」,适合和方向性指标搭配。痛点是 TA-Lib 没有现成 Mass Index,而且公式里是「EMA 的 EMA 的比值再累加」,层层嵌套容易写错。

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

第 1 步:取前复权日线(要 high/low)

from alphafeed import AlphaFeed
import numpy as np, pandas as pd

af = AlphaFeed(api_key="your-api-key")  # 或 export ALPHAFEED_API_KEY 后 AlphaFeed()

df = af.klines.get("600519.SH", period="1d", count=300,
                   adjust="forward", to_dataframe=True)
df = df.sort_values("trade_date").reset_index(drop=True)

第 2 步:实现梅斯线(EMA9 / EMA9 的比值,25 日累加)

def mass_index(df, ema_n=9, sum_n=25):
    rng  = df["high"] - df["low"]                      # 当日振幅
    ema1 = rng.ewm(span=ema_n, adjust=False).mean()    # 振幅的 9 日 EMA
    ema2 = ema1.ewm(span=ema_n, adjust=False).mean()   # 再做一次 9 日 EMA
    ratio = ema1 / ema2.replace(0, np.nan)             # 比值
    return ratio.rolling(sum_n).sum()                  # 25 日累加 = Mass Index

df["mi"] = mass_index(df, 9, 25)
print(df[["trade_date", "mi"]].tail())

实测(tools/verify_new_2026-10-11.py,SDK 0.1.4):贵州茅台近 300 日 MI 尾值 ≈ 24.23、区间最大 ≈ 28.94,期间形成 2 次「鼓包」。

第 3 步:检测「反转鼓包」(升破 27 再跌回 26.5)

bulge, above27 = 0, False
for v in df["mi"].dropna():
    if v > 27:
        above27 = True
    elif above27 and v < 26.5:
        bulge += 1; above27 = False      # 一次完整鼓包
print("反转鼓包次数:", bulge)

鼓包只提示「要变盘」,方向需结合价格趋势(如 9 日 EMA 的斜率):原趋势向上时鼓包多预示转跌,反之预示转涨。

参数与字段说明

参数/概念含义备注
adjust="forward"前复权必须,除权缺口会放大”振幅”
high - low当日振幅梅斯线的唯一输入
ema_n=9EMA 周期默认 9,两层都用
sum_n=25累加窗口默认 25 日
27 / 26.5鼓包阈值Dorsey 原始设定
ratioEMA1/EMA2>1 表示振幅在放大

关键坑与注意事项

常见问题(FAQ)

Q:梅斯线和 ATR、布林带宽度有什么区别? A:都刻画波动。ATR 是真实波幅的均值(绝对值);布林带宽度是 ±2σ 的相对宽度;梅斯线独特在用「EMA 的 EMA 比值」捕捉振幅的加速放大并累加,专为”鼓包反转”设计。

Q:没有鼓包是不是指标没用? A:不是。平静市场本就不该频繁给反转信号;梅斯线的价值在于少而关键的提示,宁缺毋滥。

Q:需要付费吗? A:单只股票日线在免费额度内即可;若要对全市场批量扫”正在形成鼓包”的票,需要 klines.batch + universes(Starter 及以上),详见官网定价页。

小结

梅斯线用「高低价差的 EMA 比值再累加」专盯波动的收放,升破 27 再跌回 26.5 的鼓包是经典反转预警。用 AlphaFeed 的前复权 high/low,几行即可实现并检测鼓包——记住它只提示变盘不含方向、阈值需微调、信号稀疏且会有假信号,务必配合趋势判断使用。

相关链接:


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