pandas计算币安BTCUSDT 1分钟K线收盘价涨跌幅结果恒为0问题求助
问题根因
你代码的核心错误有2个:
- 每次调用币安API拉取K线时设置了
limit=1,每次返回的DataFrame仅包含1行最新K线数据。diff(1)是计算当前行与前1行的差值,单条数据无法计算差值,结果为NaN后被你用fillna(0)填充,所以始终为0 - 涨跌幅计算公式错误:涨跌幅的计算基数是上一根K线的收盘价,你代码里用当前K线收盘价做分母,计算结果逻辑错误
修改方案
- 把
get_klines的limit参数调整为2,每次拉取最近2根1分钟K线,获得上一根K线的收盘价做对比 - 修正涨跌幅计算公式,分母改为上一根K线的收盘价
- 若只需要输出最新一根K线的结果,取DataFrame最后一行即可
修改后参考代码
import time import pandas as pd from binance.client import Client # 按需补充你自己的api_key和api_secret,仅拉取公开K线可以不用填写 client = Client() def get_live_data(symbol): # limit改为2,拉取最近2根1分钟K线 candles = pd.DataFrame(client.get_klines(symbol=symbol, interval=Client.KLINE_INTERVAL_1MINUTE, limit=2, startTime=None, endTime=None)) candles.columns = ['Date', 'Open', 'High', 'Low', 'Close', 'Volume', 'Close_Time', 'Quote_Volume', 'Trades_Count', 'BUY_VOL', 'BUY_VOL_VAL', 'x'] # 批量做类型转换 numeric_cols = ['Open', 'High', 'Low', 'Close', 'Volume', 'Quote_Volume'] candles[numeric_cols] = candles[numeric_cols].apply(pd.to_numeric) candles["Volume"] = round(candles["Volume"]) candles["Quote_Volume"] = round(candles["Quote_Volume"]) candles["Close_Time"] = pd.to_datetime(candles["Close_Time"], unit='ms') candles["Date"] = pd.to_datetime(candles["Date"], unit="ms") # 计算差值和涨跌幅,分母改为上一根收盘价 candles['pchange1M'] = candles.Close.diff(1) candles['pchange1Mpct'] = round((candles['pchange1M'] / candles["Close"].shift(1)) * 100, 2) # 删除多余列 candles = candles.drop(columns=["Trades_Count", "BUY_VOL", "BUY_VOL_VAL", "x"]) # 只返回最新的那根K线数据,fillna仅兼容第一次返回的第一行数据 return candles.iloc[-1].fillna(0) symbol = "BTCUSDT" while True: candles = get_live_data(symbol=symbol) print(candles) time.sleep(60)
补充说明
如果你需要计算的是已经完全收盘的K线的涨跌幅,可以把limit调整为3,取倒数第二根已完成的K线计算,避免当前还在走的未完成K线收盘价波动影响结果。
内容的提问来源于stack exchange,提问作者Mohamed Nagy
相关产品推荐
相关产品推荐

