🚀 AI 一键生成 ptrade 策略代码

PTrade 回测后如何导出详细的逐笔交易记录? (get_trades_file函数详解)

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

问题描述

回测结束后,如何导出每一笔交易的详细记录,包括成交时间、价格和费用?

解决方案

在PTrade回测中,导出每一笔交易详细记录(包括成交时间、价格、费用等)的最佳方式是使用 get_trades_file() 接口。

核心方案

  1. 使用接口get_trades_file(save_path='')
  2. 调用位置:通常在 after_trading_end 函数中调用。
  3. 功能:该函数会自动生成一个包含所有历史成交记录的 CSV 文件,并返回文件的存储路径。
  4. 包含字段:生成的 CSV 文件包含 trade_time(成交时间)、price(成交均价)、trading_fee(交易费用)、volume(成交数量)等关键信息。

策略代码实现

以下是一个完整的策略示例。该策略会进行简单的买入操作以产生交易记录,并在每日盘后导出交易明细文件,同时在日志中打印文件路径和前5条数据以便验证。

import pandas as pd

def initialize(context):
    """
    初始化函数
    """
    # 设置我们要操作的股票,以恒生电子为例
    g.security = '600570.SS'
    set_universe(g.security)
    
    # 设置佣金费率,以便观察交易费用(可选)
    set_commission(commission_ratio=0.0003, min_commission=5.0)

def handle_data(context, data):
    """
    盘中运行函数
    """
    # 简单的交易逻辑:如果当前没有持仓,就买入
    if get_position(g.security).amount == 0:
        order(g.security, 1000)
        log.info("买入 %s 1000股" % g.security)
    
    # 如果有持仓且盈利超过一定比例,卖出(为了产生卖单记录)
    elif get_position(g.security).amount > 0:
        # 这里仅作演示,随机卖出以产生更多记录
        if data[g.security]['close'] > data[g.security]['open']:
            order(g.security, -100)
            log.info("卖出 %s 100股" % g.security)

def after_trading_end(context, data):
    """
    盘后运行函数
    在此处调用导出接口
    """
    # 1. 获取对账数据文件
    # save_path如果不传,默认保存在研究环境的根目录下
    # 文件名通常包含策略ID和日期信息
    file_path = get_trades_file()
    
    if file_path:
        log.info("交易记录文件已生成,路径为: %s" % file_path)
        
        # 2. (可选) 读取并打印部分数据以验证
        # 注意:在回测日志中可以直接看到这些打印信息
        try:
            # 读取CSV文件
            df = pd.read_csv(file_path)
            
            # 打印列名,确认包含所需的字段
            log.info("交易记录包含的字段: %s" % list(df.columns))
            
            # 打印最后几笔交易详情
            # 重点关注: trade_time(时间), price(价格), trading_fee(费用)
            if not df.empty:
                log.info("最近3笔交易记录:")
                log.info(df.tail(3))
        except Exception as e:
            log.error("读取交易文件失败: %s" % str(e))
    else:
        log.info("今日无交易记录生成或获取失败。")

结果说明

get_trades_file() 生成的 CSV 文件包含以下关键列(表头):

字段名 (CSV Header) 含义 说明
trade_time 交易时间 格式通常为 YYYYMMDDHHMMSS 或类似时间戳
price 成交价格 该笔交易的成交均价
trading_fee 交易费用 包含佣金、印花税等总费用
volume 成交数量 正数代表买入,负数代表卖出(视具体版本而定,有时通过order_type区分)
total_money 成交金额 该笔交易的总金额
security_code 标的代码 例如 600570.SS
order_type 交易类型 买入/卖出等

如何查看导出文件

  1. 在回测日志中查看:上述代码中的 log.info 会将路径和部分内容打印在回测界面的“日志”选项卡中。
  2. 在研究环境中查看
    • 回测结束后,复制日志中打印的 file_path
    • 进入 PTrade 的“研究” (Research) 模块。
    • 在左侧文件列表中,您可以找到生成的 .csv 文件,可以直接下载或使用 Notebook 进行分析。

Q&A

Q: get_trades_file 可以在 handle_data 中调用吗?
A: 不建议。虽然技术上可能调用成功,但 handle_data 运行频率高(特别是分钟回测),频繁IO操作会严重拖慢回测速度。建议仅在 after_trading_end(每天收盘后)调用。

Q: 导出的费用包含印花税吗?
A: 是的,trading_fee 字段通常包含了根据 set_commission 设置的佣金以及系统默认或设置的印花税总和。

Q: 如果我想导出到特定的文件夹怎么办?
A: 可以给 get_trades_file 传递参数,例如 get_trades_file('my_backtest_data/trades.csv')。前提是该文件夹在研究环境中必须存在(可以使用 create_dir 创建),且路径长度和字符符合规范。

Q: 为什么有时候 get_trades_file 返回 None?
A: 如果当天或回测期间没有任何成交记录,或者文件生成失败,该接口可能会返回 None。代码中应做好判空处理。