问题描述
解决方案
在聚宽(JoinQuant)平台中,查看策略里每一笔交易的详细成交情况,主要有以下三种方式:
方式一:在策略代码中使用 get_trades() 函数
这是最直接的编程方式。get_trades() 函数用于获取当前交易日的所有成交记录。通常建议在 after_trading_end(收盘后)函数中调用它,打印当天的所有成交详情到日志中。
注意:get_trades() 仅返回当日的成交记录,无法直接获取历史所有日期的成交记录(除非您每天都保存)。
以下是一个完整的策略示例代码,展示了如何下单并在收盘后打印详细的成交情况:
# -*- coding: utf-8 -*-
# 导入函数库
from jqdata import *
def initialize(context):
# 设定沪深300作为基准
set_benchmark('000300.XSHG')
# 开启动态复权模式(真实价格)
set_option('use_real_price', True)
# 设定日志级别,确保info能被输出
log.set_level('order', 'info')
# 每天开盘时运行
run_daily(market_open, time='09:30')
# 每天收盘后运行,用于查看当日成交
run_daily(after_trading_end, time='15:30')
def market_open(context):
# 示例:买入平安银行 100 股
order('000001.XSHE', 100)
# 示例:买入万科A 100 股
order('000002.XSHE', 100)
def after_trading_end(context):
# 获取当天的所有成交记录
trades = get_trades()
log.info("================ 当日成交详情 ================")
# 遍历每一笔成交
for trade_id, trade_obj in trades.items():
# trade_obj 是一个 Trade 对象,包含以下属性:
# time: 交易时间
# security: 标的代码
# amount: 交易数量(正数)
# price: 交易价格
# trade_id: 交易记录id
# order_id: 对应的订单id
log.info(f"成交时间: {trade_obj.time}")
log.info(f"标的: {trade_obj.security}")
log.info(f"成交价格: {trade_obj.price}")
log.info(f"成交数量: {trade_obj.amount}")
log.info(f"订单ID: {trade_obj.order_id}")
log.info("-" * 30)
方式二:通过回测结果页面的“交易详情”查看(无需写代码)
如果您已经运行了回测,可以在回测详情页面直接查看,这是最方便的方式:
- 运行回测。
- 在回测结果页面,找到下方的选项卡。
- 点击 “交易详情”(或“交易记录”)。
- 这里会以表格形式列出策略从开始到结束的所有成交记录,包含时间、代码、方向、价格、数量、手续费等信息。
方式三:在研究环境中分析回测结果
如果您需要对历史回测的交易数据进行复杂的统计分析,可以在“研究”模块中使用 get_backtest 函数读取回测数据。
# 在研究环境(Notebook)中运行
import pandas as pd
# 1. 获取回测对象 (将 '你的回测ID' 替换为实际的 ID,可在回测详情页URL中找到)
# 例如 URL 是 https://www.joinquant.com/algorithm/backtest/detail?backtestId=123456...
bt = get_backtest('你的回测ID')
# 2. 获取所有交易详情
# get_orders() 返回回测期间所有的订单和成交信息
orders_list = bt.get_orders()
# 3. 转换为 DataFrame 方便查看
df_orders = pd.DataFrame(orders_list)
# 4. 筛选出已成交的订单 (filled > 0)
df_trades = df_orders[df_orders['filled'] > 0]
# 显示前5条成交记录
print(df_trades[['time', 'security', 'action', 'price', 'filled', 'commission']].head())
总结
- 实时监控/日志记录:使用 方式一,在
after_trading_end中调用get_trades()。 - 快速查看:使用 方式二,直接看网页上的交易详情表。
- 深度分析:使用 方式三,在研究环境中提取数据进行分析。
Q&A
Q: get_trades() 和 get_orders() 有什么区别?
A: get_orders() 获取的是订单(委托)信息,包含已成交、未成交或已撤单的所有委托请求。get_trades() 获取的是成交信息,只有当订单真正撮合成交后才会产生 Trade 记录。一个订单(Order)可能对应多笔成交(Trade)(例如分批成交),也可能没有成交。
Q: 为什么我在 initialize 中调用 get_trades() 返回空?
A: get_trades() 获取的是当日的成交记录。在 initialize 运行时,策略尚未开始交易,因此没有当天的成交记录。
Q: 如何获取历史所有日期的成交记录?
A: 在策略运行过程中,API 只能获取当日记录。若需获取历史所有记录,建议回测结束后在“交易详情”面板查看,或使用研究环境的 get_backtest 接口提取。