MFI指标(Money Flow Index) 也可以叫资金流量指标MFI指标实际是将RSI加以修改后,演变而来。RSI以成交价为计算基础;MFI指标则结合价和量,将其列入综合考虑的范围。可以说,MFI指标是成交量的RSI指标。


1.典型价格(TP)=N日内收盘价中最高价、最低价与最后一天收盘价的算术平均值
2.货币流量(MF)=典型价格(TP)×N日内成交金额
3.如果当日MF>昨日MF,则将当日的MF值视为正货币流量(PMF)
4.如果当日MF<昨日MF,则将当日的MF值视为负货币流量(NMF)
5.MFI=100-[100/(1+PMF/NMF)]
6.参数N一般设为14日。
回测代码如下
第一部分 准备工作
import numpy as npimport pandas as pdimport talibstart = '2016-02-01' # 回测起始时间end = '2017-02-01' # 回测结束时间universe = set_universe('HS300') # 证券池,支持股票、基金、期货、指数四种资产benchmark = 'HS300' # 策略参考标准freq = 'd' # 策略类型,'d'表示日间策略使用日线回测,'m'表示日内策略使用分钟线回测refresh_rate = 1 # 调仓频率,表示执行handle_data的时间间隔,若freq = 'd'时间间隔的单位为交易日,若freq = 'm'时间间隔为分钟# 配置账户信息,支持多资产多账户accounts = {'fantasy_account': AccountConfig(account_type='security', capital_base=10000000)}##买入卖出阈值buy_threshold = 20sell_threshold = 80def initialize(context):mfi = Signal('MFI') #默认24天context.signal_generator = SignalGenerator(mfi)def handle_data(context):timing(context)
第二部分 策略购买
在mfi<20的时候买入 在mfi>80的时候卖出,基于仓位管理的需要 每只股票的最大投资为100000元(风控)
def timing_Basic_MFI(context):##在mfi<20的时候买入 在mfi>80的时候卖出(策略)##基于仓位管理的需要 每只股票的最大投资为100000元(风控)account = context.get_account('fantasy_account')current_universe = context.get_universe( exclude_halt=True)mfi = context.signal_result['MFI']security_position = account.get_positions()cash = account.cashbuy_list = []for sec in current_universe:if mfi[sec] < buy_threshold and sec not in security_position:buy_list.append(sec)elif mfi[sec]>sell_threshold and sec in security_position:account.order_pct_to(sec,0)cash += security_position[sec].amount *context.current_price(sec)d = min(len(buy_list),int(cash)//100000)for sec in buy_list[:d]:account.order(sec,100000/context.current_price(sec))
跑了一下回测 表现一般

超买/超卖
超买超卖水平可以用来识别不可持续的价格极值。通常,MFI高于80被认为超买,低于20的MFI被认为是超卖。强劲的趋势可能会造成这些经典超买和超卖水平的问题。当上涨趋势强劲时,MFI可能会超买(> 80),价格可能继续上涨。相反,MFI可能会出现超卖(<20),当下跌趋势强劲时,价格可能会继续走低。Quong和Soudack建议扩展这些极值以进一步限定信号。90以上的走势确实超买,10以下的走势确实超卖。在90以上和10以下的情况很罕见,这表明价格走势不可持续。无可否认,许多股票交易很长一段时间没有达到90/10的极限。

上面这只股票在10月末和2月初的资金流指数低于10时变得超卖。上述跌幅足够锐利以产生这些读数,但超卖极值表明这些跌幅不可持续。单独超卖的水平不足以转变看涨。需要某种逆转或好转才能确认价格确实已经拐弯。该股证实了第一次超卖数据,在良好交易量方面出现缺口和趋势线突破。该股证实了第二次超卖数据,并在良好交易量下出现阻力突破。

如上面这只股票显示的,当资金流向指数在9月下旬和12月下旬超过90时,该股变得超买。MFI的极端情况表明这些进展是不可持续的,并且即将出现回落。第一次超买导致相当大的下降,但第二次没有。请注意,该股在第一次超买读数达到顶峰,并在10月形成较低的高点。10月底的支撑位突破标志着明显的趋势逆转。在12月超买后,该股上涨至23元以上并巩固。有两个下降的差距和一个支持突破,但这些并没有成立。价格行为强于超买。该股最终在24元突破阻力位并回升至28元以上。第二个信号没有奏效。
分歧和失败
可以组合失败波动和发散来创建更强大的信号。当MFI超过20以下,20以上的涨幅,20以上的回撤,然后突破其之前的反应高点时,会出现看涨失败的摆动。当价格走低时,形成看涨的分歧,但该指标形成更高的低点,以显示货币流通或动力的改善。
在下面的这只股票的图表中,1月至2月形成了看涨背离和失败波动。首先,请注意2月份股价如何形成较低的低点,而MFI远高于1月低点,看涨背离。其次,请注意1月份小额信贷机构如何跌破20元,2月份保持在20元以上,并于2月底突破前期高点。这种信号组合预示着3月份的强劲上涨。

当MFI在80以上超买时,跌破80,在反弹时未超过80,然后突破低于先前的反应低点,则出现看跌失败。当股票形成一个较高的高点并且指标形成一个较低的高点时,形成看跌的分歧,这表明货币流动或势头恶化。
在上面的该股图表中,8月至9月形成了看跌背离和失败波动。该股在9月份创下新高,但MFI形成了一个较低的高点。8月下旬MFI超过80点超买,9月反弹未能达到80点,9月下旬跌破前期低点,出现看跌失败。
结论
资金流量指数是一个相当独特的指标,它将动量和交易量与RSI公式结合起来。当指标高于50时,RSI动能通常有利于多头,而在低于50时则承受多头。即使MFI被认为是成交量加权的RSI,利用中线确定看涨或看跌偏见也不会奏效。相反,MFI更适合识别潜在的反转,超买/超卖水平,看涨/看跌的分歧以及看涨/看跌的失败波动。与所有指标一样,MFI不应该单独使用。纯动量振荡器(如RSI)或模式分析可以与MFI结合使用,以提高信号的稳健性。




