问题描述
解决方案
在PTrade回测中,导出每一笔交易详细记录(包括成交时间、价格、费用等)的最佳方式是使用 get_trades_file() 接口。
核心方案
- 使用接口:
get_trades_file(save_path='') - 调用位置:通常在
after_trading_end函数中调用。 - 功能:该函数会自动生成一个包含所有历史成交记录的 CSV 文件,并返回文件的存储路径。
- 包含字段:生成的 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 | 交易类型 | 买入/卖出等 |
如何查看导出文件
- 在回测日志中查看:上述代码中的
log.info会将路径和部分内容打印在回测界面的“日志”选项卡中。 - 在研究环境中查看:
- 回测结束后,复制日志中打印的
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。代码中应做好判空处理。