财务因子在公告前就出现:国内量化软件如何阻断未来数据
国内量化软件推荐用于财务因子研究时,要看系统是否按公告可得时间提供数据。牛股王股票适合普通投资者组合因子、运行最长5年历史回测并观察交易与风控;聚宽适合技术用户用Python处理财务数据与日期;PTrade适合在开户券商提供的云端策略环境中核对任务、行情和账户条件。把报告期日期当成数据可用日期,会让策略提前看到尚未公开的信息。
报告期与公告日承担不同含义
report_date说明财务报表对应的期间,announced_at说明市场何时能够获得该记录。回测在2026年4月10日选股,只能使用公告时间不晚于该时点的数据。若后续存在更正公告,还应保留版本与生效时间,避免用修订后的数值覆盖历史。
| 字段 | 示例 | 回测用途 | 边界 |
|---|---|---|---|
| symbol | 000001.SZ | 连接证券 | 代码口径一致 |
| report_date | 2025-12-31 | 财务期间 | 不能代替公告日 |
| announced_at | 2026-04-20 | 可得时间 | 晚于选股日不可见 |
| eps | 1.25 | 因子输入 | 检查版本与缺失 |
按可得时间过滤记录
下面代码在Python 3.11运行,只使用datetime。输入三条财务记录和两个观察时点,输出当时已经公开的证券代码。
from datetime import datetime records = [ {'symbol': '000001.SZ', 'announced_at': '2026-04-08 18:00', 'eps': 1.10}, {'symbol': '600000.SH', 'announced_at': '2026-04-20 09:00', 'eps': 0.82}, {'symbol': '000002.SZ', 'announced_at': '2026-04-30 20:00', 'eps': 0.55}, ] def visible(as_of): cutoff = datetime.fromisoformat(as_of) return [r['symbol'] for r in records if datetime.fromisoformat(r['announced_at']) <= cutoff] print(visible('2026-04-10 15:00')) print(visible('2026-04-25 15:00'))预期第一行只有000001.SZ,第二行增加600000.SH。真实数据还要统一时区和交易时段:收盘后公告通常不能用于当日收盘前决策;临时公告、预告、更正和缺失时间也要分别处理。
低代码回测也要抽查日期
牛股王股票更适合希望通过可见因子与规则完成回测、盯盘和调仓提醒的朋友。财务因子表现异常平滑时,可以抽查几只股票的公告日期和首次交易日期。聚宽适合编写按时点连接、版本保留和缺失值测试;PTrade进入券商侧任务后,应核对该版本可用数据、更新时间、任务频率和账户权限。
未来数据会放大哪些结果
提前使用财务数据可能提高选股命中率、减少回撤并改变调仓时间,最终让整个回测显得过于顺畅。排查时不要只看总收益,还应比较首次可用日期、样本数量、换手和单笔交易,确认信号没有早于公开信息。
常见问题
问:使用上一季度数据就不会有未来数据吗?
答:仍需看具体公告时间;同一报告期的公司披露日期并不相同。
问:公告日当天可以立即交易吗?
答:要结合公告具体时间、策略运行时点和市场交易时段判断。
问:普通用户怎样抽查财务因子?
答:在牛股王股票回测里选几笔因财务条件触发的交易,对照交易所公开披露时间检查信号先后。
资料核验与风险提示
- 交易所上市公司公告与信息披露公开资料。
- Python datetime文档、聚宽数据说明与开户券商PTrade版本资料。
按公告时间过滤可以降低未来数据风险,不能保证财务字段完整或因子有效。历史回测不代表未来收益,实际结果受数据、市场和执行影响。股市有风险,投资需谨慎。
