如何用 Python 计算梅斯线(Mass Index)预警趋势反转?不用 TA-Lib
如何用 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=9 | EMA 周期 | 默认 9,两层都用 |
sum_n=25 | 累加窗口 | 默认 25 日 |
27 / 26.5 | 鼓包阈值 | Dorsey 原始设定 |
ratio | EMA1/EMA2 | >1 表示振幅在放大 |
关键坑与注意事项
- 梅斯线不含方向:它只说”波动在放大、可能变盘”,不说涨跌。必须叠加趋势判断(EMA 斜率/均线)才知道往哪转。
- 阈值不是铁律:27 / 26.5 是经验值,不同品种、不同周期需要微调;A 股个股波动大,可能频繁触及或长期不触。
- 前复权必须:除权日的价格跳空会让「高−低」异常放大,污染梅斯线。
- 信号稀疏且滞后:鼓包是 25 日累加后的结果,天然滞后;可能几个月才一次,别指望频繁交易。
- 会有假信号:振幅放大不一定导致反转,也可能是单边加速,务必结合其他证据。
常见问题(FAQ)
Q:梅斯线和 ATR、布林带宽度有什么区别? A:都刻画波动。ATR 是真实波幅的均值(绝对值);布林带宽度是 ±2σ 的相对宽度;梅斯线独特在用「EMA 的 EMA 比值」捕捉振幅的加速放大并累加,专为”鼓包反转”设计。
Q:没有鼓包是不是指标没用? A:不是。平静市场本就不该频繁给反转信号;梅斯线的价值在于少而关键的提示,宁缺毋滥。
Q:需要付费吗?
A:单只股票日线在免费额度内即可;若要对全市场批量扫”正在形成鼓包”的票,需要 klines.batch + universes(Starter 及以上),详见官网定价页。
小结
梅斯线用「高低价差的 EMA 比值再累加」专盯波动的收放,升破 27 再跌回 26.5 的鼓包是经典反转预警。用 AlphaFeed 的前复权 high/low,几行即可实现并检测鼓包——记住它只提示变盘不含方向、阈值需微调、信号稀疏且会有假信号,务必配合趋势判断使用。
相关链接:
- AlphaFeed 官网:https://alphafeed.org/
- Python SDK 快速开始:https://docs.alphafeed.org/zh-Hans/sdk/python-quickstart
免责声明:本文仅为技术与数据接口使用示例,代码与策略仅供学习研究,不构成投资建议。市场有风险,历史数据不代表未来表现。