Python对接Bybit API如何遍历全部分页数据并保存为单个JSON文件
问题背景
- 目标是开发自定义自动化交易日志,基于
pybit库连接Bybit API,拉取账户已平仓盈亏(closed P&L)头寸数据 - 已完成API基础鉴权连接,但
closed_profit_and_loss接口单页请求最多仅返回50条结果,无法直接获取全量数据 - 现有代码仅能拉取单页数据,实现如下:
import pybit as pybit from pybit import inverse_perpetual session_unauth = inverse_perpetual.HTTP( endpoint="https://api-testnet.bybit.com" ) session_auth = inverse_perpetual.HTTP( endpoint="https://api.bybit.com", api_key="", api_secret="" ) data = session_auth.closed_profit_and_loss(symbol="BTCUSD", limit=50) import json with open('journal.json', 'w', encoding='utf-8') as f: json.dump(data, f, ensure_ascii=False, indent=4) import pandas as pd df = pd.read_json(r"C:\Users\Work\PycharmProjects\pythonProject\journal.json") df.to_csv (r"C:\Users\Work\PycharmProjects\pythonProject\journal.csv", index = None)
注:代码中
api_key与api_secret字段留空属于涉密信息处理,不影响逻辑实现。
分页拉取实现方案
该接口采用ID游标分页规则,单次返回结果中携带的last_id字段即为下一页请求的起始游标,当单次返回的记录数小于设置的limit值时,代表已拉取到最后一页,直接终止遍历即可。
完整可运行代码如下:
import json import time import pandas as pd from pybit import inverse_perpetual # 初始化鉴权会话 session_auth = inverse_perpetual.HTTP( endpoint="https://api.bybit.com", api_key="替换为你的API_KEY", api_secret="替换为你的API_SECRET" ) def fetch_all_closed_pnl(symbol="BTCUSD", limit=50): all_records = [] from_id = None while True: # 构造请求参数 params = { "symbol": symbol, "limit": limit } # 非第一页请求时带上游标参数 if from_id: params["from_id"] = from_id # 发起请求 resp = session_auth.closed_profit_and_loss(**params) # 接口报错直接抛出 if resp["ret_code"] != 0: raise Exception(f"API请求错误: {resp['ret_msg']}") current_page_data = resp["result"]["data"] all_records.extend(current_page_data) # 返回数据量小于limit,说明到最后一页,退出循环 if len(current_page_data) < limit: break # 更新下一页游标 from_id = resp["result"]["last_id"] # 加100ms延时避免触发API限流 time.sleep(0.1) return all_records if __name__ == "__main__": # 拉取全量平仓记录 full_pnl_data = fetch_all_closed_pnl(symbol="BTCUSD", limit=50) # 保存为JSON文件 with open('journal.json', 'w', encoding='utf-8') as f: json.dump(full_pnl_data, f, ensure_ascii=False, indent=4) # 直接从内存数据转CSV,无需重复读文件 df = pd.DataFrame(full_pnl_data) df.to_csv(r"journal.csv", index=None)
关键说明
- 代码默认拉取
BTCUSD交易对的全量平仓记录,如需拉取所有交易对数据,去掉symbol参数即可 - 每次请求后增加100ms延时,避免触发Bybit API的频率限制被临时封禁
- 最终保存的JSON文件仅包含平仓记录列表,没有接口返回的冗余状态字段,后续做数据分析处理更方便
- 转CSV环节直接用拉取到的内存数据生成,省去了读写本地JSON文件的IO开销,效率更高
内容的提问来源于stack exchange,提问作者Mark Müller
相关产品推荐
相关产品推荐

