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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 18:12:57