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

ptrade 财务数据查询中如何使用 merge_type 避免未来函数?

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

问题描述

ptrade 回测避坑:利用 get_fundamentals 的 merge_type 参数彻底消除基本面选股未来函数
在 ptrade 财务数据查询中,如何使用 merge_type 确保回测使用的是首次发布数据以避免未来函数?

解决方案

在量化回测中,**未来函数(Look-ahead Bias)**是导致回测业绩虚高、实盘表现拉胯的罪魁祸首之一。在进行基本面选股时,上市公司往往会由于审计、差错更正等原因对历史财报数据进行修正。如果回测时使用了修正后的“最新”数据,而该数据在当时的历史时间点尚未发布,就会引入未来函数。

ptrade 平台在 get_fundamentals 接口中提供了 merge_type 参数,专门用于解决这一痛点。


一、 merge_type 参数详解

在调用 get_fundamentals 获取财务数据时,merge_type 参数控制返回的是首次发布的数据还是最新修正的数据:

参数取值 数据获取规则 适用场景 避坑说明
None (或不传) 获取首次发布的数据。即使后续实际数据发生修正,也只返回历史当时首次公布的原样数据。 回测场景 彻底避免未来函数。确保回测时使用的财务数据与历史交易日实际能看到的数据完全一致。
1 获取最新发布的数据。包含后续所有的修正和更新。 研究场景 / 实盘交易 实盘时需要最新、最准确的数据,因此建议使用此模式。

二、 避坑代码示例

1. 回测环境:严格防范未来函数(不传 merge_type 或设为 None

在回测中,为了确保策略的严谨性,我们应当获取首次发布的数据:

def handle_data(context, data):
    stocks = ['600570.SS', '600000.SS']
    
    # 方式一:不传入 merge_type 参数(默认即为首次发布数据,最安全)
    df_first_publish = get_fundamentals(
        security=stocks, 
        table='balance_statement', 
        fields='total_assets', 
        date=None,  # 默认取当前回测交易日
        merge_type=None
    )
    
    log.info(df_first_publish)

2. 实盘/研究环境:获取最新修正数据(merge_type=1

在实盘交易或离线研究时,为了基于最准确的财务状况做决策,应当使用最新修正的数据:

def handle_data(context, data):
    stocks = ['600570.SS', '600000.SS']
    
    # 传入 merge_type=1,获取最新修正后的财务数据
    df_latest = get_fundamentals(
        security=stocks, 
        table='balance_statement', 
        fields='total_assets', 
        date=None, 
        merge_type=1
    )
    
    log.info(df_latest)

三、 额外避坑指南:date 字段与未来函数

除了 merge_type 之外,get_fundamentals 中的 date 字段也需要注意:

  1. 回测中不传 date:默认获取当前回测历史交易日(context.blotter.current_dt)之前已公布的最新财报,这是最安全的做法。
  2. 手动传入 date:如果手动传入 date,必须确保传入的日期小于或等于当前回测日期。若传入了未来的日期,同样会引入未来函数。