本地查询我的模拟交易策略的持仓、绩效等
由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 对象会自动使用关联的第一个账户进行查询
- 权限限制:只能查询自己有权限的策略数据
\