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

ptrade 平台如何利用 merge_type 避免财务数据未来函数?(附 Python 源码)

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

问题描述

请根据以下 SEO 主题生成完整页面内容:

Title: ptrade 回测防“踩坑”:利用 merge_type 避免财务数据未来函数

Question: 在ptrade里用get_fundamentals获取财务报表,怎么保证拿到的是首次发布的数据而不是修正后的最新数据?

解决方案

在 ptrade 量化交易平台中,进行基于财务数据的策略回测时,最容易遇到的“陷阱”之一就是未来函数。上市公司在发布财报后,后续可能会对历史财务数据进行修正或重分类。如果我们在回测中直接使用了修正后的“最新数据”,就会导致回测时使用了当时根本无法获知的未来信息,从而使回测结果虚高。

为了解决这一痛点,ptrade 的 get_fundamentals 接口提供了 merge_type 参数。通过合理配置该参数,我们可以完美规避未来函数。

1. 核心解决方案:merge_type 参数解析

在调用 get_fundamentals 获取三大报表(资产负债表、利润表、现金流量表)时,可以通过设置 merge_type 来控制数据更新版本:

  • merge_type = None(或不传)获取首次发布的数据。即使后续实际数据发生了修正或变化,也只返回最初公布的原样数据。在回测场景中,为了避免未来数据,强烈建议使用此默认模式。
  • merge_type = 1获取最新发布的数据。系统会返回经过修正、重分类后的最新财务数据。此模式更适用于研究场景实盘交易场景

2. 规避未来函数的最佳实践代码示例

以下是一个实用的 ptrade 策略初始化与盘前处理示例,展示了如何正确获取首次发布的资产负债表数据:

import time

def initialize(context):
    # 初始化策略,设置股票池
    g.security = ['600570.SS', '000001.SZ']
    set_universe(g.security)

def before_trading_start(context, data):
    # 盘前获取财务数据
    # 显式不传 merge_type 或传入 None,确保获取的是首次发布的数据,彻底规避未来函数
    try:
        # 获取 2023 年报的资产总计数据
        funda_data = get_fundamentals(
            security=g.security, 
            table='balance_statement', 
            fields='total_assets', 
            start_year='2023', 
            end_year='2023', 
            report_types='4',
            merge_type=None  # 关键点:获取首次发布数据,防范未来函数
        )
        log.info("成功获取首次发布的资产数据:")
        log.info(funda_data)
    except Exception as e:
        log.error(f"获取财务数据失败: {e}")
    
    # 接口限流保护:get_fundamentals 每秒不得调用超过 100 次,单次最大调用量 500 条
    time.sleep(1)

def handle_data(context, data):
    pass

3. 财务数据获取注意事项

  1. 流控限制get_fundamentals 接口有严格的流量限制,每秒不得调用超过 100 次,单次最大调用量是 500 条数据。在多股、多字段、多年份查询时,务必在代码中加入 time.sleep(1) 进行限流保护。
  2. 估值表限制:注意,估值数据表 valuation 是日频数据,不支持 start_yearend_yearreport_typesdate_typemerge_type 参数。获取估值数据时,建议通过 date 参数传入上一个交易日的日期,以防盘中未更新导致获取到 NaN。