You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python循环处理大列表构建币安USDT交易对DataFrame报错

问题核心原因

  • 币安公开API有请求频率限制,全量USDT交易对(当前超过1000个)循环请求时极易触发限流,返回错误报文而非标准K线结构,直接解析就会报错
  • 不同USDT交易对的上线时间不同,部分2021年11月之后上线的币种,你请求的时间区间内K线长度和已有DataFrame行数不匹配,列赋值失败
  • 现有写法重复请求4次同一份K线数据,既浪费请求配额,也提升了限流触发概率
  • 代码中未提前初始化目标DataFramedf的结构,首次赋值时无基准索引对齐规则

优化修复方案

调整逻辑为:统一以日期为索引,每个交易对仅请求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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 00:06:05