Python循环处理大列表构建币安USDT交易对DataFrame报错
问题核心原因
- 币安公开API有请求频率限制,全量USDT交易对(当前超过1000个)循环请求时极易触发限流,返回错误报文而非标准K线结构,直接解析就会报错
- 不同USDT交易对的上线时间不同,部分2021年11月之后上线的币种,你请求的时间区间内K线长度和已有DataFrame行数不匹配,列赋值失败
- 现有写法重复请求4次同一份K线数据,既浪费请求配额,也提升了限流触发概率
- 代码中未提前初始化目标DataFrame
df的结构,首次赋值时无基准索引对齐规则
优化修复方案
调整逻辑为:统一以日期为索引,每个交易对仅请求1次K线,增加请求间隔和异常捕获,避免程序中断,参考代码如下:
import pandas as pd import time from binance.client import Client # 初始化币安客户端,替换为你自己的API密钥 client = Client(api_key='your_api_key', api_secret='your_api_secret') # 获取全量USDT交易对 prices = pd.DataFrame(client.get_all_tickers()) coins = [s for s in prices['symbol'].tolist() if "USDT" in s] # 初始化空DataFrame,后续统一按日期索引对齐数据 df = pd.DataFrame() # 循环拉取K线 for n in coins: try: # 单次请求当前币种K线,避免重复请求 kline_data = pd.DataFrame( client.get_historical_klines(n, Client.KLINE_INTERVAL_1DAY, "11 nov, 2021"), columns=['open_time', 'open', 'high', 'low', 'close', 'volume', 'close_time', 'quote_volume', 'trade_count', 'taker_buy_base', 'taker_buy_quote', 'ignore'] ) # 转换时间戳为日期格式设为索引,保证不同币种数据按日期对齐 kline_data['date'] = pd.to_datetime(kline_data['open_time'], unit='ms') kline_data.set_index('date', inplace=True) # 赋值对应列,缺值自动填充NaN df[f"close_{n}"] = kline_data['close'] df[f"high_{n}"] = kline_data['high'] df[f"low_{n}"] = kline_data['low'] df[f"volume_{n}"] = kline_data['volume'] # 增加请求间隔避免触发限流,可根据自身API权限调整 time.sleep(0.1) except Exception as e: print(f"拉取{n}K线失败,错误信息:{e}") continue
额外优化建议
- 若需要拉取的交易对数量很大,可申请币安API更高请求配额,或者改用异步请求提升拉取效率
- 拉取完成后建议先将数据存为本地csv或parquet文件,避免后续重复请求
内容的提问来源于stack exchange,提问作者Leandro Quintana
相关产品推荐
相关产品推荐

