3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在QMT(Quantitative Trading System)平台中,进行策略回测后,除了在界面上查看绩效分析外,我们常常需要将交易明细、买入/卖出持仓等数据导出到本地,以便进行更深度的多维绩效分析(如胜率计算、归因分析等)。
QMT 提供了内置函数 get_result_records,可以精准获取回测过程中的各项记录。本文将教你如何在回测的最后一根K线上,自动触发该函数获取全部交易明细并导出为 CSV 文件。
get_result_records(recordtype, index, ContextInfo)
'dealdetails':交易明细(最常用)'buys':买入持仓'sells':卖出持仓'holdings':当前持仓'historysums':历史汇总ContextInfo.barpos)。返回一个 list,其中包含 0 个或多个 Python 对象。每个对象包含以下常用属性:
market: 市场代码stockcode: 合约代码open_close: 期货开平(1开 0平);股票(1买 0卖)trade_price: 成交价格trade_balance: 成交额或市值trade_date: 交易日期(毫秒时间戳)commission: 手续费为了获取完整的回测交易明细,我们需要满足两个条件:
ContextInfo.is_last_bar() 为 True)执行。timetag_to_datetime 将毫秒时间戳转换为可读的日期时间,最后导出为 CSV。以下是一个完整的策略模板,展示了如何在回测结束时自动导出交易明细:
#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)}")
get_result_records 仅在回测模式下有效。在实盘或模拟交易模式下,请使用 get_trade_detail_data 接口获取实时账户的成交与委托。pandas 库,QMT 平台默认已内置该库,无需额外安装。D:/qmt_backtest_dealdetails.csv,请确保您的电脑有 D 盘且程序有写入权限,或者修改为其他有效路径(如 C:/Users/Public/)。