import numpy as np import pandas as pd from stock.analysis.Common import Common # https://hotorch.tistory.com/366 class MFI: common = None def __init__(self): self.common = Common() return def apply(self, df, period = 14): typical_price = (df.high + df.low + df.close) / 3 money_flow = typical_price * df.volume positive_flow = [] negative_flow = [] for i in range(1, len(typical_price)): if typical_price[i] > typical_price[i-1]: positive_flow.append(money_flow[i-1]) negative_flow.append(0) elif typical_price[i] < typical_price[i - 1]: positive_flow.append(0) negative_flow.append(money_flow[i - 1]) else: positive_flow.append(0) negative_flow.append(0) positive_mf = [] negative_mf = [] for i in range(period-1, len(positive_flow)): positive_mf.append(sum(positive_flow[i+1-period: i+1])) for i in range(period - 1, len(negative_flow)): negative_mf.append(sum(negative_flow[i + 1 - period: i + 1])) mfi = list(100 * (np.array(positive_mf) / (np.array(positive_mf) + np.array(negative_mf)))) mfi = list(np.repeat(np.nan, len(df)-len(mfi))) + mfi #df = df.assign(macd=macd, macds=macds, macdo=macdo).dropna() df = df.assign(mfi=mfi) return df def analyze(self, stock): df = pd.DataFrame() df = df.from_dict(stock['PRICE']) df = self.apply(df) for i in range(len(df.macd)): stock['PRICE'][i]['mfi'] = df.mfi.values[i] return