使用Python的Pyti、Pandas、GDAX计算比特币MFI的技术问询
完善比特币资金流量指标(MFI)计算的代码方案
我来帮你补全并优化这段计算比特币MFI的代码,顺便梳理下关键的处理细节:
先说说原代码的几个待完善点
- 代码写到
df = df.he就截断了,应该是要处理数据结构或预览数据 - GDAX(现Coinbase Pro)返回的历史数据是倒序排列(最新数据在前),不处理的话会导致时间序列逻辑混乱
- 计算MFI需要先做好数据预处理,pyti的
money_flow_index函数需要特定格式的输入
完整可运行代码示例
import gdax import pandas as pd from pyti.money_flow_index import money_flow_index as mfi from datetime import datetime import time # 设置请求间隔(和K线粒度保持一致,避免触发API限流) REQUEST_INTERVAL = 60 while True: try: # 初始化Coinbase Pro公共客户端 public_client = gdax.PublicClient() # 获取BTC-USD的1分钟K线数据(默认返回最近200条) historic = public_client.get_product_historic_rates('BTC-USD', granularity=60) # 处理空数据情况 if not historic: print("未获取到数据,等待重试...") time.sleep(REQUEST_INTERVAL) continue # 转换为DataFrame并设置列名 df = pd.DataFrame(historic) df.columns = ['Time', 'Low', 'High', 'Open', 'Close', 'Volume'] # 1. 反转数据:把倒序的K线转为时间正序(旧数据在前,新数据在后) df = df.iloc[::-1].reset_index(drop=True) # 2. 把时间戳转换为可读的datetime格式 df['Time'] = pd.to_datetime(df['Time'], unit='s') # 3. 计算典型价格(MFI的核心输入,公式:(最高价+最低价+收盘价)/3) df['Typical_Price'] = (df['High'] + df['Low'] + df['Close']) / 3 # 4. 计算资金流量:典型价格 × 成交量 df['Money_Flow'] = df['Typical_Price'] * df['Volume'] # 5. 调用pyti计算MFI,默认周期为14(可根据需求调整,比如改成7或21) df['MFI'] = mfi(df[['High', 'Low', 'Close', 'Volume']], period=14) # 按你设置的行数显示数据 pd.set_option('display.max_rows', 28) print("最新BTC-USD 1分钟K线及MFI数据:") print(df[['Time', 'High', 'Low', 'Close', 'Volume', 'MFI']]) except Exception as e: print(f"请求或计算出错:{str(e)}") # 等待下一次请求 time.sleep(REQUEST_INTERVAL)
关键细节解释
- 数据反转:Coinbase Pro的历史数据接口默认返回最新K线在前,反转后才能保证MFI计算基于连续的时间序列,顺序错误会导致结果完全失真
- MFI周期:默认用14周期(行业通用标准),你可以通过修改
period参数调整周期长度 - 异常处理:加入try-except块捕获API请求失败、数据格式异常等问题,避免程序直接崩溃
- 限流规避:设置和K线粒度一致的请求间隔,避免触发Coinbase Pro的API速率限制
常见问题排查
- 如果MFI列出现NaN:这是正常现象,因为MFI需要至少
period条数据才能计算,前14行的MFI会显示为NaN - 遇到API限流错误(429):延长
REQUEST_INTERVAL的数值,或者查看Coinbase Pro官方的API速率规则 - pyti模块报错:确保安装了最新版本,可执行
pip install --upgrade pyti更新
内容的提问来源于stack exchange,提问作者This play nay mm
相关产品推荐
相关产品推荐

