BigQuant使用文档

本地查询我的模拟交易策略的持仓、绩效等

由bq1fuwkt创建,最终由bq1fuwkt 被浏览 2 用户

问题描述

我在 BigQuant 平台上运行了模拟交易策略,想在本地查询策略的持仓、订单、成交、绩效等信息,应该如何实现?

详细解答

BigQuant SDK 提供了 papertrading 模块,可以方便地在本地查询和管理模拟交易策略的各类数据。

1.获取策略列表

首先查看您有哪些策略

 import bigquant

# 获取自己的策略列表(默认每页1000条)
result = bigquant.papertrading.list(page=1, size=10)

# 查看策略数量和列表
print(f"策略总数: {result['count']}")
print(f"总页数: {result['total']}")

# 遍历策略信息
for item in result['items']:
    print(f"策略ID: {item['id']}")
    print(f"策略名称: {item.get('strategy_name', 'N/A')}")
    print(f"状态: {item.get('status', 'N/A')}")
    print("-" * 50)
  • 关键说明
    • list() 返回包含分页信息的字典:count(总数)、page(当前页)、size(每页条数)、total(总页数)、items(策略列表)
    • 可以使用 constraints、order_by、include_fields 参数进行高级查询

2. 获取策略对象

当我们需要获取策略的详细信息时,需要选定一个策略:

  # 使用 constraints 过滤策略
  result = bigquant.papertrading.list(
      constraints={"strategy_name__icontains": "双均线"},  # 策略名包含"双均线"
      order_by=["-created_at"],  # 按创建时间倒序
      include_fields=["id", "strategy_name", "created_at", "status"],  # 只返回这些字段
      page=1,
      size=10
  )

  print(f"找到 {result['count']} 个策略")
  for item in result['items']:
      print(f"{item['strategy_name']} (ID: {item['id']})")
  • 关键说明
    • constraints 支持 Django 风格的查询语法(如 __icontains、__gte 等)
    • order_by 使用 - 前缀表示倒序排列
    • include_fields 可以减少返回数据量,提高查询速度

3. 获取社区分享的策略

  # 获取社区分享的策略列表
  shared_result = bigquant.papertrading.list_shared(
      page=1,
      size=20,
      isrelative=False,  # False表示绝对收益,True表示相对收益
      benchmark="000300.SH"  # 基准指数(沪深300)
  )

  print(f"分享策略总数: {shared_result['count']}")

  # 查看前几个策略
  for item in shared_result['items'][:5]:
      print(f"策略名称: {item.get('strategy_name')}")
      print(f"策略ID: {item.get('strategy_id')}")  # 注意这里是 strategy_id
      print(f"累计收益率: {item.get('cumulative_return', 0):.2%}")
      print("-" * 50)
  • 关键说明
    • list_shared() 用于查询社区公开分享的策略
    • 返回的字段中使用 strategy_id 而非 id
    • isrelative 参数控制收益率计算方式(绝对收益 vs 相对基准的超额收益)

4. 查询持仓信息

选定一个策略,获取策略对象以便后续操作:

  # 使用策略 ID 获取策略对象
  strategy_id = "4f24dd2f-0457-46fd-9b58-4c061e124ad7"  # 替换为你的策略 ID
  strategy = bigquant.papertrading.get(strategy_id)

  # 查看策略基本信息
  print(f"策略信息: {strategy.strategy_info}")
  print(f"策略ID: {strategy.strategy_info['id']}")
  • 关键说明
    • get() 方法返回 Strategy 对象
    • strategy.strategy_info 包含策略的详细配置信息(字典格式)
    • 如果策略 ID 不存在,会抛出 ValueError: Strategy not found

5. 查询持仓信息

查询策略的持仓数据:

  # 查询持仓信息
  positions_result = strategy.get_positions(
      constraints={"trading_day__in": ["2024-12-16", "2024-12-17"]},  # 查询这两天的持仓
      page=1,
      size=100
  )

  print(f"持仓记录数: {positions_result['count']}")

  # 查看持仓详情
  for pos in positions_result['items'][:5]:  # 只显示前5条
      print(f"交易日: {pos.get('trading_day')}")
      print(f"标的: {pos.get('instrument')}")
      print(f"持仓数量: {pos.get('amount')}")
      print(f"可用数量: {pos.get('available')}")
      print(f"持仓均价: {pos.get('cost_basis', 0):.2f}")
      print(f"最新价格: {pos.get('last_price', 0):.2f}")
      print("-" * 50)
  • 关键说明
    • get_positions() 返回分页字典,包含 items、count、page、size、total
    • 可以使用 constraints 参数过滤,如 trading_day__in 查询指定日期
    • 返回的是数据库中的历史持仓记录

6. 查询订单信息

查询策略的订单记录:

  # 查询订单信息
  orders_result = strategy.get_orders(
      constraints={"trading_day__in": ["2024-12-16", "2024-12-17"]},
      order_by=["-created_at"],  # 按创建时间倒序
      page=1,
      size=50
  )

  print(f"订单总数: {orders_result['count']}")

  # 查看订单详情
  for order in orders_result['items'][:5]:
      print(f"订单ID: {order.get('id')}")
      print(f"交易日: {order.get('trading_day')}")
      print(f"标的: {order.get('instrument')}")
      print(f"方向: {order.get('side')}")  # long/short 或 buy/sell
      print(f"委托数量: {order.get('amount')}")
      print(f"委托价格: {order.get('limit_price', 0):.2f}")
      print(f"订单状态: {order.get('status')}")
      print(f"成交数量: {order.get('filled', 0)}")
      print(f"创建时间: {order.get('created_at')}")
      print("-" * 50)
  • 关键说明
    • get_orders() 返回分页字典
    • 可以使用 order_by 参数排序
    • 订单状态可能包括:filled(已成交)、open(未成交)、cancelled(已撤单)等

7. 查询计划订单(交易信号)

  查询策略产生的交易信号:

  # 查询计划订单
  planned_orders_result = strategy.get_planned_orders(
      constraints={"trading_day__in": ["2024-12-16", "2024-12-17"]},
      page=1,
      size=50
  )

  print(f"计划订单数: {planned_orders_result['count']}")

  # 查看计划订单详情
  for order in planned_orders_result['items'][:5]:
      print(f"交易日: {order.get('trading_day')}")
      print(f"标的: {order.get('instrument')}")
      print(f"方向: {order.get('side')}")
      print(f"计划数量: {order.get('amount')}")
      print(f"目标权重: {order.get('target_weight', 0):.2%}")
      print("-" * 50)
  • 关键说明
    • 计划订单是策略生成的交易信号,不一定会被执行
    • 用于分析策略的信号质量和执行情况

8. 查询绩效指标

  # 查询绩效数据(默认返回常用字段)
  performances = strategy.get_performances()

  print(f"绩效记录数: {len(performances)}")

  # 查看最新绩效
  if performances:
      latest_perf = performances[-1]
      print(f"交易日: {latest_perf.get('trading_day')}")
      print(f"总资产: {latest_perf.get('portfolio_value', 0):,.2f}")
      print(f"累计收益率: {latest_perf.get('cumulative_return', 0):.2%}")
      print(f"年化收益率: {latest_perf.get('annualized_return', 0):.2%}")
      print(f"最大回撤: {latest_perf.get('max_drawdown', 0):.2%}")
      print(f"夏普比率: {latest_perf.get('risk_indicator', {}).get('sharpe_ratio', 0):.4f}")
      print(f"胜率: {latest_perf.get('win_percent', 0):.2%}")
  • 关键说明
    • get_performances() 返回列表,不是分页字典
    • 可以通过 fields 参数指定返回的字段列表
    • 包含常用的量化指标:收益率、夏普比率、最大回撤等

9. 自定义绩效字段

  # 只获取特定字段的绩效数据
  performances = strategy.get_performances(
      fields=[
          "trading_day",
          "cumulative_return",
          "annualized_return",
          "max_drawdown",
          "portfolio_value"
      ]
  )

  # 转换为 DataFrame 方便分析
  import pandas as pd
  df_perf = pd.DataFrame(performances)
  print(df_perf.head())

关键概念解释

PaperTrading vs Strategy

  • 代码中使用 bigquant.papertrading 模块(不是 bigquant.strategy)
  • papertrading.get() 返回 Strategy 对象

返回数据格式

  • 大部分查询方法返回分页字典
  {
      "items": [...],      # 数据列表
      "count": 100,        # 总记录数
      "page": 1,           # 当前页码
      "size": 10,          # 每页数量
      "total": 10          # 总页数
  }

例外:get_performances() 直接返回列表,不是分页字典。

Constraints 查询语法

  • 使用 Django 风格的查询语法
    • __in: 在列表中,如 trading_day__in: ["2024-12-16", "2024-12-17"]
    • __icontains: 包含(忽略大小写),如 strategy_name__icontains: "均线"
    • __gte: 大于等于,如 created_at__gte: "2024-01-01"
    • __lte: 小于等于

持仓相关字段

  • amount: 总持仓数量
  • available: 可用数量(可卖出)
  • cost_basis: 持仓成本价
  • last_price: 最新市场价格

订单相关字段

  • side: 买卖方向(buy/sell 或 long/short)
  • amount: 委托数量
  • filled: 已成交数量
  • limit_price: 委托价格
  • status: 订单状态

绩效指标字段

  • cumulative_return: 累计收益率
  • annualized_return: 年化收益率
  • max_drawdown: 最大回撤
  • portfolio_value: 总资产
  • today_return: 今日收益率
  • week_return: 本周收益率
  • month_return: 本月收益率
  • risk_indicator: 风险指标(包含夏普比率等)
  • win_percent: 胜率

注意事项

  • 返回格式:大部分方法返回分页字典(items、count 等),访问数据需使用 result['items']
  • 绩效数据特殊:get_performances() 直接返回列表,不是分页字典
  • 日期格式:使用 YYYY-MM-DD 格式的字符串
  • 账户绑定:Strategy 对象会自动使用关联的第一个账户进行查询
  • 权限限制:只能查询自己有权限的策略数据

\

{link}