🚀 AI 一键生成 qmt 策略代码
立即体验

QMT平台如何使用 get_result_records 获取并导出回测交易明细?

qmt | 发布时间: 2026/8/11
以下内容由 EasyQuant 生成。

问题描述

qmt 回测绩效挖掘:使用 get_result_records 导出交易明细
qmt 怎么在回测结束时用 get_result_records 获取全部交易明细并导出?

解决方案

QMT回测绩效挖掘:使用 get_result_records 导出交易明细

在QMT(Quantitative Trading System)平台中,进行策略回测后,除了在界面上查看绩效分析外,我们常常需要将交易明细买入/卖出持仓等数据导出到本地,以便进行更深度的多维绩效分析(如胜率计算、归因分析等)。

QMT 提供了内置函数 get_result_records,可以精准获取回测过程中的各项记录。本文将教你如何在回测的最后一根K线上,自动触发该函数获取全部交易明细并导出为 CSV 文件。


1. get_result_records 函数详解

接口定义

get_result_records(recordtype, index, ContextInfo)

参数说明

  • recordtype (string): 记录类型,可选值包括:
    • 'dealdetails':交易明细(最常用)
    • 'buys':买入持仓
    • 'sells':卖出持仓
    • 'holdings':当前持仓
    • 'historysums':历史汇总
  • index (number): 当前主图对应 K 线索引(通常传入当前 ContextInfo.barpos)。
  • ContextInfo: 策略运行环境对象。

返回值

返回一个 list,其中包含 0 个或多个 Python 对象。每个对象包含以下常用属性:

  • market: 市场代码
  • stockcode: 合约代码
  • open_close: 期货开平(1开 0平);股票(1买 0卖)
  • trade_price: 成交价格
  • trade_balance: 成交额或市值
  • trade_date: 交易日期(毫秒时间戳)
  • commission: 手续费

2. 核心实现逻辑

为了获取完整的回测交易明细,我们需要满足两个条件:

  1. 触发时机:必须在回测的最后一根 K 线(ContextInfo.is_last_bar()True)执行。
  2. 数据转换:将返回的 Python 对象列表转换为 Pandas DataFrame,并利用 timetag_to_datetime 将毫秒时间戳转换为可读的日期时间,最后导出为 CSV。

3. 完整 Python 源码示例

以下是一个完整的策略模板,展示了如何在回测结束时自动导出交易明细:

#encoding:gbk
import pandas as pd

def init(ContextInfo):
    # 设定基础股票池
    ContextInfo.set_universe(['600000.SH', '000001.SZ'])
    # 设定回测初始资金
    ContextInfo.capital = 1000000
    # 标记是否已导出,避免重复执行
    ContextInfo.exported = False 

def handlebar(ContextInfo):
    # 简单的模拟交易信号(仅用于产生回测明细)
    if ContextInfo.barpos == 10:
        passorder(23, 1101, 'test', '600000.SH', 5, -1, 100, ContextInfo)
    elif ContextInfo.barpos == 20:
        passorder(24, 1101, 'test', '600000.SH', 5, -1, 100, ContextInfo)

    # 核心:判断是否运行到最后一根K线(回测结束点)
    if ContextInfo.is_last_bar() and not ContextInfo.exported:
        export_backtest_details(ContextInfo)
        ContextInfo.exported = True

def export_backtest_details(ContextInfo):
    """获取并导出交易明细"""
    print("正在获取回测交易明细...")
    index = ContextInfo.barpos
    
    # 获取交易明细记录列表
    records = get_result_records('dealdetails', index, ContextInfo)
    
    if not records:
        print("未找到任何交易明细记录!")
        return
        
    # 解析对象属性并构建 DataFrame
    data_list = []
    for r in records:
        # 将毫秒时间戳转换为可读时间
        trade_time_str = timetag_to_datetime(r.trade_date, '%Y-%m-%d %H:%M:%S')
        
        data_list.append({
            '交易时间': trade_time_str,
            '证券代码': r.stockcode,
            '市场': r.market,
            '操作类型': '买入' if r.open_close == 1 else '卖出',
            '成交价格': r.trade_price,
            '成交额/市值': r.trade_balance,
            '手续费': r.commission
        })
        
    df = pd.DataFrame(data_list)
    
    # 导出到本地路径(请根据实际情况修改路径)
    export_path = 'D:/qmt_backtest_dealdetails.csv'
    try:
        df.to_csv(export_path, index=False, encoding='gbk')
        print(f"回测明细导出成功!保存路径为: {export_path}")
    except Exception as e:
        print(f"导出失败: {str(e)}")

4. 注意事项

  1. 运行模式get_result_records 仅在回测模式下有效。在实盘或模拟交易模式下,请使用 get_trade_detail_data 接口获取实时账户的成交与委托。
  2. 第三方库支持:导出 CSV 依赖 pandas 库,QMT 平台默认已内置该库,无需额外安装。
  3. 文件路径:示例中的保存路径为 D:/qmt_backtest_dealdetails.csv,请确保您的电脑有 D 盘且程序有写入权限,或者修改为其他有效路径(如 C:/Users/Public/)。