58 lines
1.7 KiB
Python
58 lines
1.7 KiB
Python
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 |