所以我用pandas,gdax和pyti来计算比特币的货币流量指数(MFI)。在
代码如下:
import gdax
import pandas as pd
from pyti.money_flow_index import money_flow_index as mfi
from datetime import datetime
import time
while True:
public_client = gdax.PublicClient()
historic = public_client.get_product_historic_rates('BTC-USD', granularity=60)
pd.set_option('display.max_rows', 28)
df = pd.DataFrame(historic)
df.columns = ['Time', 'Low', 'High', 'Open', 'Close', 'Volume']
df = df.head(n=28)
for i in range(len(df['Time'])):
df['Time'][i] = datetime.fromtimestamp(df['Time'][i]).strftime('%Y-%m-%d %H:%M:%S')
print(df, '\n')
close_data = df['Close']
high_data = df['High']
low_data = df['Low']
volume_data = df['Volume']
period = 14
mfiDf = pd.DataFrame(mfi(close_data, high_data, low_data, volume_data, period))
print(mfiDf)
time.sleep(60)
数据帧有28行,因为我要计算14个周期。 但是,当我运行这个程序时,我得到的是。在
^{pr2}$不太清楚怎么读这个。我的猜测是——它根据0-13之间的14分钟周期进行MFI计算,以提供14-27的值。在
我需要这样做,因为我的原始数据帧是按时间递减排序的。在
下面是计算如何在资金流中工作_索引.py以下内容:
def money_flow_index(close_data, high_data, low_data, volume, period):
"""
Money Flow Index.
Formula:
MFI = 100 - (100 / (1 + PMF / NMF))
"""
catch_errors.check_for_input_len_diff(
close_data, high_data, low_data, volume
)
catch_errors.check_for_period_error(close_data, period)
mf = money_flow(close_data, high_data, low_data, volume)
tp = typical_price(close_data, high_data, low_data)
flow = [tp[idx] > tp[idx-1] for idx in range(1, len(tp))]
pf = [mf[idx] if flow[idx] else 0 for idx in range(0, len(flow))]
nf = [mf[idx] if not flow[idx] else 0 for idx in range(0, len(flow))]
pmf = [sum(pf[idx+1-period:idx+1]) for idx in range(period-1, len(pf))]
nmf = [sum(nf[idx+1-period:idx+1]) for idx in range(period-1, len(nf))]
# Dividing by 0 is not an issue, it turns the value into NaN which we would
# want in that case
with warnings.catch_warnings():
warnings.simplefilter("ignore", category=RuntimeWarning)
money_ratio = np.array(pmf) / np.array(nmf)
mfi = 100 - (100 / (1 + money_ratio))
mfi = fill_for_noncomputable_vals(close_data, mfi)
return mfi
看来颠倒测向顺序才是解决办法。我从tradingview和cryptowatch得到的值的差别似乎来自于它们处理实时数据——很可能是web套接字。我处理的是历史数据,但有点滞后。谢谢彼得·莱姆比格勒!
相关问题 更多 >
编程相关推荐