3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在基本面量化和单因子检验中,财务数据的**“统计截止日”(Stat Date)与“实际披露日”(Pub Date / Watch Date)之间存在时间差是一个非常核心的问题。如果处理不当,极易引入未来函数(Look-ahead Bias)**,导致回测结果虚高但在实盘中失效。
在定义T期时,绝对不能使用财务报表的统计截止日(如03-31)作为T期。T期必须是你实际进行调仓或计算因子的交易日。在T期这个时点上,你只能使用该时点之前已经公开发布的数据。
JoinQuant 平台在底层API设计上已经充分考虑了这个问题,提供了非常便捷的规避未来函数的取数方式。
get_fundamentals 的 date 参数(推荐)在调用 get_fundamentals 时,强烈建议使用 date 参数,而不是 statDate 参数。
date 参数:当你传入 date='2023-04-15' 时,JoinQuant 引擎会自动去数据库中查找在 2023-04-15 收盘后已经实际披露的最新一期财务数据。如果一季报在4月22日才披露,那么在4月15日取数时,系统会自动返回上一年的年报数据。这完美契合了 PIT 原则,绝对不会产生未来函数。statDate 参数:如果你传入 statDate='2023q1',系统会强制返回2023年一季报的数据。如果你在4月15日的逻辑中使用了这个数据,就引入了未来函数。# 正确做法:按实际交易日(T期)取数
q = query(valuation.code, income.net_profit)
# 假设 context.current_dt 是 2023-04-15
# 引擎会自动获取 2023-04-15 当天能看到的最新财报(可能是2022年报)
df = get_fundamentals(q, date=context.current_dt)
get_history_fundamentals 的 watch_date 参数如果你需要获取历史多个季度的财务数据进行计算(例如计算TTM或者同比增长率),可以使用 get_history_fundamentals 并指定 watch_date。
# 指定观察日期 watch_date,系统只会返回该日期前(包含该日期)发布的报表数据
df = get_history_fundamentals(
security=['000001.XSHE'],
fields=[income.total_operating_revenue],
watch_date='2023-04-15',
count=4,
interval='1q'
)
get_fundamentals(date=T_n) 获取因子暴露度(Factor Exposure)。界定T期的核心在于**“站在当前看历史”**。不要被财报的“所属期(03-31)”迷惑,永远以“交易日(04-22之后)”为时间锚点。在 JoinQuant 中,只要坚持使用 date 或 watch_date 参数进行截面取数,平台底层会自动帮你处理好披露延迟的映射,从而确保单因子检验的严谨性。