🚀 AI 一键生成 ptrade 策略代码

PTrade 财务数据查询:date_type 参数完全解析

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

问题描述

查询财务数据时,date_type 参数填 1 和不填有什么区别?

解决方案

在 PTrade 的 get_fundamentals 函数中,date_type 参数决定了系统是根据公告日期还是会计周期截止日期来筛选财务数据。

简单来说,不填(默认)是“按实际看到的时间”,填 1 是“按财报归属的时间”

以下是详细的区别解析:

1. 不填 或 date_type=None(默认模式)

  • 筛选依据公告日期 (publ_date)
  • 逻辑:返回在查询日期(date)之前(含当日)已经公开发布的财务数据。
  • 特点
    • 避免未来函数:这是回测中最常用的模式。它模拟了真实的历史环境,确保你获取的数据在当时是市场上已经公开可见的。
    • 数据滞后性:例如,一季报(3月31日截止)通常在4月份发布。如果在4月10日查询,且该股票尚未发布一季报,系统会返回上一个已发布的报告(如去年年报)。

2. date_type=1

  • 筛选依据会计周期截止日期 (end_date)
  • 逻辑:返回会计周期结束日期在查询日期(date)之前的财务数据。
  • 特点
    • 存在未来函数风险:在回测中使用此模式极易引入未来数据。例如,你在4月1日查询,系统可能会返回截止日为3月31日的一季报数据,但实际上这份财报可能要到4月25日才发布。在4月1日这一天,真实市场上是看不到这份数据的。
    • 用途:通常用于研究分析,例如需要对齐所有股票的“2023年一季度”数据进行横向对比,而不关心数据具体的发布时间点。

举例说明

假设某股票的财务数据发布时间表如下:

  • 2023年一季报:会计截止日 (end_date) 为 2023-03-31,实际公告日 (publ_date) 为 2023-04-25

如果你在 2023-04-10 调用 get_fundamentals

  1. date_type=None (默认)

    • 系统会检查 2023-04-10 之前发布了什么。
    • 因为 2023-04-25 (公告日) > 2023-04-10 (查询日),所以获取不到这份一季报。
    • 系统会返回上一份已发布的报告(通常是2022年年报)。
    • 结果:真实、无未来数据。
  2. date_type=1

    • 系统会检查会计周期截止日在 2023-04-10 之前的数据。
    • 因为 2023-03-31 (截止日) < 2023-04-10 (查询日),系统认为这份一季报符合条件。
    • 结果:获取到一季报数据,但在当时(4月10日)属于“未来数据”。

总结建议

  • 回测/实盘交易强烈建议不填 date_type(使用默认值),以防止策略利用未来信息进行作弊,导致回测结果虚高。
  • 特定研究/数据对齐:如果你清楚自己在做什么,且需要按财报季度强制对齐数据进行统计分析,可以使用 date_type=1

Q&A

Q: 在回测中使用了 date_type=1 会有什么后果?
A: 会导致“未来函数”问题。策略会在财报实际发布之前就“提前”知道了财报的好坏并进行买卖,导致回测收益率异常高,但实盘中无法复现该业绩。

Q: 如果我想获取最近一个季度的财报,无论它是否发布,该怎么写?
A: 使用 date_type=1。例如查询日期设为 20230401,通常能匹配到 end_date20230331 的数据(前提是数据库中有该记录),但这仅限于研究用途。

Q: get_fundamentals 接口如果不传 date 参数,默认是什么时间?
A: 在回测中,默认取当前回测周期的日期(context.blotter.current_dt);在研究或交易模式下,默认取系统当前日期。