首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >如何用 Python 计算 MFI 资金流量指标?(带成交量的 RSI)

如何用 Python 计算 MFI 资金流量指标?(带成交量的 RSI)

原创
作者头像
用户7083614
发布于 2026-10-04 15:00:36
发布于 2026-10-04 15:00:36
780
举报

一句话回答: MFI(资金流量指标)可以理解为「带成交量的 RSI」:用 典型价=(高+低+收)/3 乘成交量得到资金流,再按典型价涨跌把资金流分成正/负,取 14 日比值套进 100 − 100/(1+比值)。用 AlphaFeed 取复权日线,几行就能算出 MFI,并用 80/20 判断超买/超卖。

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

RSI 只看价格涨跌,忽略了「有没有量配合」。MFI 把成交量加进来,衡量的是资金推动的强弱:

  • 量价结合:同样是上涨,放量上涨的资金流权重更大;
  • 参数:经典 14 日,也有人用 9/21;
  • 复权:除权日的假跌会让典型价错判为下跌、资金流被误算,务必用前复权。

数据用 AlphaFeed 复权日线,计算用几行 pandas 即可。

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

第 1 步:取复权日线(含高开低收与成交量)

代码语言:python
复制
from alphafeed import AlphaFeed

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

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

第 2 步:计算 MFI

代码语言:python
复制
import numpy as np

def mfi(df, n=14):
    tp = (df["high"] + df["low"] + df["close"]) / 3.0   # 典型价
    mf = tp * df["volume"]                               # 资金流 = 典型价 × 成交量
    up = mf.where(tp > tp.shift(), 0.0)                  # 典型价上涨 -> 正资金流
    dn = mf.where(tp < tp.shift(), 0.0)                  # 典型价下跌 -> 负资金流
    mr = up.rolling(n).sum() / dn.rolling(n).sum().replace(0, np.nan)
    return 100 - 100 / (1 + mr)

df["mfi"] = mfi(df, 14)
print(df[["trade_date", "close", "mfi"]].tail(3).to_string(index=False))

字段与参数说明:

字段/参数

含义

备注

high/low/close

最高/最低/收盘价

AlphaFeed 复权日线列

volume

成交量

A股为真实量;美股/港股 amount=0,用 volume

典型价 tp

(高+低+收)/3

MFI 的价格基准

n

统计周期

14(经典)、9/21

MFI 区间

0~100

80 超买,<20 超卖

第 3 步:判断资金超买超卖

代码语言:python
复制
def mfi_state(symbol, count=120, n=14):
    df = af.klines.get(symbol, period="1d", count=count,
                       adjust="forward", to_dataframe=True).sort_values("trade_date").reset_index(drop=True)
    v = float(mfi(df, n).iloc[-1])
    zone = "超买(>80)" if v > 80 else ("超卖(<20)" if v < 20 else "中性")
    return {"mfi": round(v, 1), "zone": zone}

print(mfi_state("600519.SH"))   # 例如 {'mfi': 38.0, 'zone': '中性'}
print(mfi_state("000001.SZ"))   # 例如 {'mfi': 57.7, 'zone': '中性'}

上例实测茅台 MFI≈38.0、平安银行≈57.7,都在中性区间。

关键坑与注意事项

  • 和 RSI 的区别:RSI 只用收盘价涨跌,MFI 用「典型价×成交量」。放量时 MFI 反应更剧烈,缩量时更钝——两者背离时往往说明「涨得没量」。
  • 缩量失真:极端缩量日资金流很小,会让 MFI 上下跳动,注意结合成交额一起看。
  • 80/20 不是买卖信号:强势股 MFI 可以长期贴在 80 以上,超买≠马上跌。它是资金强弱参考,需结合趋势。
  • 平盘处理:典型价持平(tp == tp.shift())的日子既不计正也不计负,本文按此实现,可能与个别软件略有差异。
  • 复权:一律 adjust="forward",避免除权日假跌污染资金流。

常见问题(FAQ)

Q:MFI 和 RSI 到底选哪个?

A:想看纯价格动能用 RSI;想看「涨跌有没有资金配合」用 MFI。实战常两者并看,背离时更有参考价值。

Q:MFI 用几日周期?

A:默认 14 日。周期越短越灵敏、噪声越多;越长越平滑、越滞后。

Q:为什么我的 MFI 和行情软件差一点?

A:多因平盘日处理、复权口径不同。确认都用前复权、平盘不计入,再对比即可。

Q:需要付费吗?

A:单只标的日线在免费额度内即可试算;批量/全市场需 Starter 及以上,详见 AlphaFeed 定价页。

小结

MFI 的本质是「把成交量加权进 RSI」,用典型价的涨跌方向给资金流分正负,再算一段时间的占比。写起来只需几行,但要记住它对量敏感、会因缩量失真、超买不等于卖点。AlphaFeed 提供口径一致、含真实成交量的复权日线,让你几行算出 MFI——当资金强弱参考、配合价格与趋势用。

参考

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • 为什么会有这个问题 / 传统做法的痛点
  • 分步骤解决(每步配可运行代码)
    • 第 1 步:取复权日线(含高开低收与成交量)
    • 第 2 步:计算 MFI
    • 第 3 步:判断资金超买超卖
  • 关键坑与注意事项
  • 常见问题(FAQ)
  • 小结
  • 参考
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档