🚀 AI 一键生成 joinquant 策略代码

JoinQuant 策略复盘:如何使用 get_trades API 获取详细成交记录?

joinquant | 发布时间: 2025/12/2
以下内容由 EasyQuant 生成。

问题描述

如何查看我的策略里每一笔交易的详细成交情况?

解决方案

在聚宽(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)

方式二:通过回测结果页面的“交易详情”查看(无需写代码)

如果您已经运行了回测,可以在回测详情页面直接查看,这是最方便的方式:

  1. 运行回测。
  2. 在回测结果页面,找到下方的选项卡。
  3. 点击 “交易详情”(或“交易记录”)。
  4. 这里会以表格形式列出策略从开始到结束的所有成交记录,包含时间、代码、方向、价格、数量、手续费等信息。

方式三:在研究环境中分析回测结果

如果您需要对历史回测的交易数据进行复杂的统计分析,可以在“研究”模块中使用 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 接口提取。