3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
announce_time 与 report_time 的差异与选择在 QMT(迅投量化终端)中进行基于基本面的量化策略回测时,正确提取财务数据是确保策略真实性的关键。许多开发者在调用 ContextInfo.get_financial_data() 接口时,由于未能区分 公告期(announce_time) 与 报告期(report_time),导致策略引入了严重的未来函数(Look-ahead Bias),使回测收益虚高。
QMT 财务数据接口中的 report_type 参数控制着财报数据的对齐时间维度:
| 时间类型 | 参数值 | 含义 | 回测应用场景 | 未来函数风险 |
|---|---|---|---|---|
| 公告期 | 'announce_time'(默认) |
财报在市场中实际公开发布的自然日期 | 实盘与回测(推荐) | 无(符合真实信息披露时序) |
| 报告期 | 'report_time' |
财报所对应的会计结算周期截止日(如一季报为3月31日) | 仅用于财报同比/环比横向对比分析 | 极高(若在回测中使用会引入未来函数) |
report_time 会引入未来函数?假设某上市公司:
report_time):2023-03-31announce_time):2023-04-26如果回测时间运行到 2023-04-01:
report_type='report_time':QMT 接口在 2023-04-01 就能取到该公司 2023 年一季报的财务数据。但在实际历史中,市场投资者在 2023-04-26 之前根本无法获知该财报内容。这就相当于策略“穿越”到了未来获取了未公开信息,产生了严重的未来函数。report_type='announce_time':QMT 接口在 2023-04-01 至 2023-04-25 期间依然使用的是上一期已公布的财报数据,直到 2023-04-26 公告日当天及之后,才会更新为 2023 一季报的数据。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
)
在日常量化回测与实盘中,应严格显式指定或保留默认值 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)
report_type='announce_time'(或保持默认不传该参数),以确保策略信号基于市场已公开的真实财务数据触发。ContextInfo.get_trading_dates() 或时间戳对齐,避免因交易所财报修正/补充更正导致的微小时间差错位。