Files
DeepStock/stock/analysis/MFI.py
dsyoon dc0770de94 init
2024-02-06 02:15:39 +09:00

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