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

Binance API返回-2014错误:API-key格式无效致DataFrame为空

问题分析与解决方案

核心错误:API-key格式无效(-2014)

这个错误的关键原因有两个:

  • 你使用的是占位符'my_api_key',必须替换为Binance后台生成的真实API Key,且要确保该API已开启「现货杠杆」权限。
  • 杠杆账户的allOrders是私有接口,必须对请求参数做HMAC SHA256签名,你的代码完全缺失签名逻辑,这是触发错误的核心。

导致空DataFrame的其他问题

  1. 参数类型错误:startTime和endTime应传入整数格式的毫秒时间戳,而非字符串。
  2. DataFrame列映射错误:你用字典指定列索引对应字段的方式完全错误,接口返回的data是字典列表,直接转DataFrame即可,手动指定索引会导致列与数据不匹配,生成空表。
  3. 循环逻辑错误:break语句后的时间更新代码永远不会执行,导致无法分页查询更早的订单。
  4. 冗余代码:重复定义timestamp变量,属于无效代码。

修正后的完整代码

import requests
import time
import pandas as pd
import hmac
import hashlib

pd.set_option('expand_frame_repr', False)

# 替换为你自己的真实API密钥
API_KEY = "你的Binance API Key"
API_SECRET = "你的Binance API Secret"

base_url = "https://api.binance.com"
api_path = "/sapi/v1/margin/allOrders"
limit = 500
end_time = int(time.time() * 1000)  # 当前毫秒时间戳
start_time = end_time - 7 * 86400 * 1000  # 初始查询最近7天的订单,可自行调整

while True:
    timestamp = int(time.time() * 1000)
    params = {
        'symbol': 'BTCUSDT',
        'startTime': start_time,
        'endTime': end_time,
        'timestamp': timestamp,
        'limit': limit
    }

    # 生成API签名
    query_string = '&'.join([f"{k}={v}" for k, v in params.items()])
    signature = hmac.new(API_SECRET.encode('utf-8'), query_string.encode('utf-8'), hashlib.sha256).hexdigest()
    params['signature'] = signature

    headers = {
        'X-MBX-APIKEY': API_KEY
    }

    url = base_url + api_path
    response = requests.get(url, params=params, headers=headers)
    data = response.json()

    # 检查API返回错误
    if 'code' in data:
        print(f"API错误: {data['msg']}")
        break

    # 转换为DataFrame
    df = pd.DataFrame(data)
    if not df.empty:
        # 追加写入CSV,避免覆盖已有数据
        df.to_csv("Query Margin Account's All Orders_1.csv", mode='a', header=not pd.io.common.file_exists("Query Margin Account's All Orders_1.csv"), index=False)
        print(df)
    else:
        print("当前时间范围内无订单")

    # 更新时间范围,分页查询更早的订单
    if len(df) < limit:
        break
    end_time = start_time
    start_time = end_time - 7 * 86400 * 1000  # 每次往前查询7天,可按需调整

关键注意事项

  1. API权限配置:登录Binance后台,在API管理页面确保开启「现货杠杆交易」权限,若设置了IP白名单,需将当前运行代码的IP加入白名单。
  2. 签名逻辑:所有私有接口必须将参数拼接成查询字符串,用API Secret进行HMAC SHA256加密,生成的签名作为signature参数传入请求。
  3. 时间窗口调整:示例中用7天作为单次查询的时间窗口,你可以根据自己的订单数量调整,避免因时间范围过大导致返回数据不全。
  4. CSV写入方式:使用追加模式写入,避免每次循环覆盖之前的数据,首次写入时自动添加表头。

内容的提问来源于stack exchange,提问作者Melody nb

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 19:13:33