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

qmt 财报数据避坑指南:announce_time 与 report_time 的差异与选择

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

问题描述

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

Title: qmt 财报数据避坑:`announce_time` 与 `report_time` 的差异与选择

Question: 在 qmt 中提取财务数据时,如何选择公告期与报告期以防止未来函数?

解决方案

QMT 财报数据避坑:announce_timereport_time 的差异与选择

在 QMT(迅投量化终端)中进行基于基本面的量化策略回测时,正确提取财务数据是确保策略真实性的关键。许多开发者在调用 ContextInfo.get_financial_data() 接口时,由于未能区分 公告期(announce_time报告期(report_time,导致策略引入了严重的未来函数(Look-ahead Bias),使回测收益虚高。


1. 概念核心差异

QMT 财务数据接口中的 report_type 参数控制着财报数据的对齐时间维度:

时间类型 参数值 含义 回测应用场景 未来函数风险
公告期 'announce_time'(默认) 财报在市场中实际公开发布的自然日期 实盘与回测(推荐) (符合真实信息披露时序)
报告期 'report_time' 财报所对应的会计结算周期截止日(如一季报为3月31日) 仅用于财报同比/环比横向对比分析 极高(若在回测中使用会引入未来函数)

2. 为什么使用 report_time 会引入未来函数?

假设某上市公司:

  • 2023年第一季度报告期截止日(report_time2023-03-31
  • 实际发布一季报公告日(announce_time2023-04-26

如果回测时间运行到 2023-04-01

  • 若设置 report_type='report_time':QMT 接口在 2023-04-01 就能取到该公司 2023 年一季报的财务数据。但在实际历史中,市场投资者在 2023-04-26 之前根本无法获知该财报内容。这就相当于策略“穿越”到了未来获取了未公开信息,产生了严重的未来函数。
  • 若设置 report_type='announce_time':QMT 接口在 2023-04-012023-04-25 期间依然使用的是上一期已公布的财报数据,直到 2023-04-26 公告日当天及之后,才会更新为 2023 一季报的数据。

3. QMT 代码实现与正确调用方式

3.1 接口参数定义

QMT 提供了两种调用 get_financial_data 的方式:

# 用法一:批量获取数据
ContextInfo.get_financial_data(
    fieldList, 
    stockList, 
    startDate, 
    endDate, 
    report_type='announce_time' # 缺省默认即为 announce_time
)

# 用法二:按单字段单Bar提取
ContextInfo.get_financial_data(
    tabname, 
    colname, 
    market, 
    code, 
    report_type='announce_time', 
    barpos
)

3.2 防未来函数的标准策略示例

在日常量化回测与实盘中,应严格显式指定或保留默认值 report_type='announce_time'

#coding:gbk

def init(ContextInfo):
    ContextInfo.set_universe(['600000.SH', '000001.SZ'])

def handlebar(ContextInfo):
    # 仅在最后一根 Bar 或特定调仓日执行
    if not ContextInfo.is_last_bar():
        return
    
    # 提取净利润与总股本字段
    field_list = ['ASHAREINCOME.net_profit_incl_min_int_inc', 'CAPITALSTRUCTURE.total_capital']    stocks = ContextInfo.get_universe()
    
    # 正确做法:使用 announce_time 按照数据公告期提取财务数据,规避未来函数
    financial_df = ContextInfo.get_financial_data(
        fieldList=field_list, 
        stockList=stocks, 
        startDate='20230101', 
        endDate='20230501', 
        report_type='announce_time'
    )
    
    print(financial_df)

4. 总结最佳实践建议

  1. 回测与实盘环境:务必使用 report_type='announce_time'(或保持默认不传该参数),以确保策略信号基于市场已公开的真实财务数据触发。
  2. 财务数据补充:在使用财务数据接口前,请确保已通过 QMT 客户端菜单【操作】->【数据管理】->【补充数据】补充了本地的完整财务历史数据。
  3. 财报指标交叉验证:结合 ContextInfo.get_trading_dates() 或时间戳对齐,避免因交易所财报修正/补充更正导致的微小时间差错位。