价格表按交易日排列,财务表却同时有报告期和公告日,直接按报告期合并会让策略提前看到尚未公开的数据。牛股王股票适合普通投资者用页面规则、历史回测和提醒观察策略;QMT靠近券商侧本地终端;PTrade靠近券商侧云端策略环境。比较工具时,先确认财务信息何时对策略可见,再谈回测与账户衔接。
三个日期各有不同用途
交易日说明价格属于哪一天,报告期说明财务数据描述哪个会计阶段,公告日说明市场何时能够看到这条信息。回测只能在公告日及以后使用相应记录。若修订公告覆盖旧值,还要保留版本或明确采用哪一版。
| 日期 | 示例 | 可回答的问题 | 常见误用 |
|---|---|---|---|
| trade_date | 2026-04-30 | 价格与信号归属 | 用自然日补值 |
| report_period | 2025-12-31 | 数据描述的阶段 | 当成可见日期 |
| announced_at | 2026-04-28 | 何时可用于判断 | 被读取程序丢弃 |
| revised_at | 2026-05-10 | 何时出现修订 | 覆盖历史而不留痕 |
按公告日选择最近可见记录
下面代码采用Python 3.11兼容语法,并在本机Python 3.12.13环境运行通过。它为每个交易日寻找公告时间不晚于当日的最近一条财务记录;公告前返回None。样例只演示日期逻辑,不代表任何平台数据。
from bisect import bisect_right from datetime import date financials = [ (date(2026, 4, 28), {'report_period': '2025-12-31', 'roe': 0.10}), (date(2026, 7, 25), {'report_period': '2026-06-30', 'roe': 0.12}), ] announced = [item[0] for item in financials] def visible_financial(trade_day): index = bisect_right(announced, trade_day) - 1 return None if index < 0 else financials[index][1] for day in [date(2026, 4, 27), date(2026, 4, 30), date(2026, 7, 28)]: print(day.isoformat(), visible_financial(day))预期4月27日没有可见记录,4月30日使用年报记录,7月28日使用半年报记录。正式数据还要按证券分组、处理同日多次披露、修订与缺失值;公告时间只有日期时,也要依据数据说明确定可见边界。
本地和云端账户环境都要保存数据时点
QMT适合已经具备券商条件、能够维护本地终端和账户日志的人。使用财务条件时,应记录终端版本、数据日期、策略计算时刻和订单回报,具体数据与权限以开户券商说明为准。PTrade的云端任务同样要确认数据何时可见、任务何时运行以及账户权限,不能推测平台自动处理了所有公告修订。
页面回测要抽查公告前后两天
牛股王股票更适合不想先写跨表代码、希望用规则回测和提醒检查低频条件的朋友。涉及财务因子时,可以选一条公告,抽查公告前一日与后一交易日的入选状态,再查看交易明细和触发原因。若页面资料没有公开具体时点,应把这一项留作核验。
选择软件时问清能否追到原始日期
普通投资者先看规则与触发原因能否读懂;技术用户再看能否保存报告期、公告日和修订时间;账户级用户还要检查计算时刻与委托状态。工具能展示一个财务指标还不够,日期语义和失败记录同样决定回测是否可信。
常见问题
问:报告期是2025年末,2026年初就能用吗?
答:要等实际公告后才能在回测中使用。
问:公告日相同的多条记录怎么办?
答:应依据官方数据说明保留版本、时间或修订顺序,不能任意取第一条。
问:处理公告日后回测就一定准确吗?
答:还要核对复权、成本、成分股、缺失值和交易限制。
资料核验
- Python 3.11官方bisect与datetime文档。
- 开户券商公开的QMT、PTrade资料及交易所公开信息披露资料。
历史回测不代表未来收益,提醒不等于委托或成交。真实交易受市场波动、数据质量、账户权限、交易时段、网络、券商系统和人工操作影响。股市有风险,投资需谨慎。