Binance API返回-2014错误:API-key格式无效致DataFrame为空
问题分析与解决方案
核心错误:API-key格式无效(-2014)
这个错误的关键原因有两个:
- 你使用的是占位符
'my_api_key',必须替换为Binance后台生成的真实API Key,且要确保该API已开启「现货杠杆」权限。 - 杠杆账户的
allOrders是私有接口,必须对请求参数做HMAC SHA256签名,你的代码完全缺失签名逻辑,这是触发错误的核心。
导致空DataFrame的其他问题
- 参数类型错误:
startTime和endTime应传入整数格式的毫秒时间戳,而非字符串。 - DataFrame列映射错误:你用字典指定列索引对应字段的方式完全错误,接口返回的
data是字典列表,直接转DataFrame即可,手动指定索引会导致列与数据不匹配,生成空表。 - 循环逻辑错误:
break语句后的时间更新代码永远不会执行,导致无法分页查询更早的订单。 - 冗余代码:重复定义
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天,可按需调整
关键注意事项
- API权限配置:登录Binance后台,在API管理页面确保开启「现货杠杆交易」权限,若设置了IP白名单,需将当前运行代码的IP加入白名单。
- 签名逻辑:所有私有接口必须将参数拼接成查询字符串,用API Secret进行HMAC SHA256加密,生成的签名作为
signature参数传入请求。 - 时间窗口调整:示例中用7天作为单次查询的时间窗口,你可以根据自己的订单数量调整,避免因时间范围过大导致返回数据不全。
- CSV写入方式:使用追加模式写入,避免每次循环覆盖之前的数据,首次写入时自动添加表头。
内容的提问来源于stack exchange,提问作者Melody nb
相关产品推荐
相关产品推荐

