金融市场数据与回测验证¶
金融研究不能把价格文件当作无歧义的训练集。市场会适应,数据会修订,不同类型的记录回答不同问题;模型、回测和执行假设还必须使用同一时间尺度。本页给出从金融机器学习、市场数据到 point-in-time(PIT)验证的一套公开检查框架。
金融数据上的机器学习¶
金融数据通常噪声高、非平稳,而且会受到参与者行为和制度变化反向影响。一个模型可能只拟合了特定波动率、流动性或持仓环境;制度切换本身也往往不能被直接观察,只能通过不完美特征推断,并在事后验证。
机器学习结果至少需要满足三个条件才有研究意义:
- 数据生成过程对目标期限足够稳定,或系统能识别稳定性正在破坏;
- 数据质量适合任务,包括 PIT 时间戳、缺失值处理、报价新鲜度和来源标签;
- 特征描述实际决策问题,而不只是拟合原始价格变化。
模型可以支持特征构造、候选排序、波动率或流动性估计、风险诊断和执行成本校准,但输出仍是模型证据。它不能代替可用报价、账户状态、风险控制或事后对账。
交易期限决定什么数据和模型复杂度是合理的:
| 决策期限 | 常见数据 | 合理的模型形态 | 主要执行约束 |
|---|---|---|---|
| 亚秒至数秒 | 报价、成交、订单更新、交易时段与延迟测量 | 当前时段的小型规则、缓存分数或严格受限模型;大型模型更适合离线校准 | 延迟、队列位置、过时报价与 adverse selection |
| 数分钟至日内 | 分钟数据、近期报价、点差状态、事件窗口、当前组合或账户状态 | 表格模型、校准分数、regime 标签和显式成本估计 | 特征新鲜度、报价可用性、滑点与未成交风险 |
| 日频 | 日线、期权曲面快照、OI、实现波动率、宏观和事件背景 | 集成模型、波动率或 regime 模型、曲面诊断和 walk-forward 排序 | 交易成本、到期/指派处理与 regime 稳定性 |
| 周频至月频 | 期限结构、宏观状态、事件日历、组合暴露和跨资产背景 | 组合、仓位、情景与风险模型;复杂研究模型应保留审计路径 | 结构突变、模型衰减、容量和生命周期风险 |
不存在天然更优的期限。每个期限有不同的误差预算,数据新鲜度、模型规模和执行路径必须相互匹配。
一套策略有多只时钟¶
不能只按“多久下一次订单”定义策略频率。至少要分开:
- alpha / decision frequency:多久可以改变目标头寸、结构或风险暴露;
- data frequency:输入观测的粒度与新鲜度;
- holding period:经济风险预计持有多久;
- execution frequency:订单切片、改价、撤单、重试或路由的频率;
- risk / control frequency:保证金、Greeks、报价、账户状态、kill switch 和对账刷新的频率。
算法执行比高频交易更宽泛。日频或日内选择策略可以用秒级订单管理,但这不自动使 alpha 成为 HFT。监管和市场结构文献通常用自动决策、低延迟基础设施、高消息率、短库存周期,以及信号、执行和库存控制的紧密耦合来描述 HFT;分类时应同时检查上述几只时钟,而不是只看最快的一只。
市场数据类型¶
Aggregate bars¶
Bars 用 open、high、low、close 和 volume 汇总一个时间区间,例如 1-minute 或 1-day bar。它们适合广泛研究、信号构造和粗粒度回测,却隐藏了区间内的报价路径、成交顺序与可交易性,因此不能单独证明某个期权曾能以 bar price 成交。
Trades¶
Trade 是已经发生的成交,通常包含成交价、数量、时间和场所标识。它可用于成交量、实际打印价格和逐笔聚合,但 last trade 可能陈旧,也不能代替当前可买卖报价。
Quotes¶
Quote 描述当前 bid、ask、对应 size、时间和场所标识。常用派生量为:
Quotes 是流动性检查、滑点估计和 bid/ask-aware 回测的基础;mid 仍只是参考,不保证成交。报价解释与成本例子见Bid、Ask 与流动性。
Top of book 与完整深度¶
Top-of-book 数据通常只有:
- 当前最优 bid;
- 当前最优 ask;
- 两侧显示 size 及相关元数据。
它不包含完整 level-2 深度、多档订单簿或真实队列位置。即使计划下单量小于显示 size,也不能假定自己排在队首或全部数量会保留到达市场。
为什么期权研究特别需要报价¶
期权可能长时间没有成交。bar 或 last trade 能说明历史活动,却不能回答研究时点的点差、可成交方向和显示规模。若策略按 mid 建仓、按 last trade 平仓,回测可能把流动性不足误写成收益。
因此,执行相关研究至少应:
- 明确买入使用 ask、卖出使用 bid,或说明限价成交模型;
- 对过时报价、锁盘、倒挂、单边零报价和异常 size 设定规则;
- 将组合多腿的净价、不同步成交与未成交纳入成本;
- 把成交量/OI 与当前报价可用性分开。
微观结构与交易成本归因¶
- Market microstructure noise:点差、离散 tick、异步成交、过时报价、有限深度和订单不平衡造成的短期价格扭曲;
- Packet burst:开收盘、宏观公布或波动冲击附近,大量行情消息集中到达。均匀抽样的回放会低估排队、陈旧报价和尾部延迟;
- Bid–ask bounce:成交在 bid 与 ask 之间交替,产生看似反转的短期价格变化,即使有效价格没有反转;
- Adverse selection:对手方更可能在报价即将不利变化时与你成交;
- Market impact:订单本身造成的暂时或永久价格变化;
- Opportunity cost:限价未成交、撤单或等待期间错失的收益或风险变化。
短周期策略可能因为拥有更多下注机会而呈现更高的毛 Sharpe,但这些机会不是免费的。点差、显示深度、滑点、冲击、adverse selection、延迟和未成交机会成本都必须在与决策相同的期限上扣除。
回测验证术语¶
- In-sample:用于设计、调参、调试或筛选规则的区间。这里的表现不能单独作为晋级证据;
- Out-of-sample:在规则和参数范围冻结后才使用的保留区间,用于检查样本外行为;
- Walk-forward:在滚动或扩展窗口中重复“校准下一段之前的数据,再评估下一段”,适合允许定期重估但不能前视的流程;
- Multiple testing / data snooping:搜索许多 DTE、执行价、moneyness、止盈止损、决策时间或平仓时间后,只报告最优组合。可靠产物应同时报告完整搜索族、样本外表现和参数邻域稳定性。
随机切分通常不适合有时间顺序、标签重叠或制度变化的金融数据。切分方法必须阻止未来信息通过特征、标签、修订数据或参数选择进入过去。
Point-in-time 时间语义¶
市场数据与研究元数据使用的字段不同,但原则相同:必须区分“事件何时发生”“外部何时发布”“系统何时能够知道”。
| 字段 | 含义 |
|---|---|
event_ts |
市场事件实际发生时间 |
vendor_publish_ts |
供应商记录何时应视为对系统可用 |
as_of_date |
用于重建某个市场日或快照的基准日期 |
ingested_at |
系统实际保存该记录的时间 |
valid_from / valid_to |
可修订记录的有效版本区间 |
这些字段不能互相替代。历史下载日期不证明当时可见,后来修订的值也不能无标记地覆盖旧版本。论文、报告和研究索引的 published_at、first_discovered_at 与 fetched_at 约定见研究元数据与 PIT 检查表。
Listed universe 与 traded universe¶
- Listed universe:某日实际挂牌存在的全部合约,无论是否成交;最好由逐日合约元数据快照重建;
- Traded universe:某日出现在成交、bars 或某些 quote 数据中的合约;它通常小于 listed universe。
只从成交数据构造期权池会遗漏“存在但没有成交”的合约,并可能造成幸存者或流动性选择偏差。反过来,挂牌存在也不代表报价可用。
调整数据的含义¶
Bars 中的 adjusted 通常指供应商对公司行动或合约历史的调整,不表示隐含波动率经过了某种“修正”。可能涉及:
- 股票拆并股;
- 特别股息;
- 合约交割物变化;
- 执行价、乘数或合约数量调整。
研究必须记录供应商的调整口径。原始序列、复权序列和调整后的期权合约不能在没有映射的情况下混用。
为什么要分开元数据、bars、trades 与 quotes¶
| 数据 | 主要回答的问题 |
|---|---|
| 合约元数据 | 当时有哪些合约,条款是什么 |
| Bars | 区间价格路径大致如何 |
| Trades | 实际打印了什么价格和数量 |
| Quotes | 当时可以向哪一侧、以什么点差尝试交易 |
把四种数据各自保留来源、时间和调整语义,比把它们压成一个“价格表”更容易发现前视、缺失和执行假设错误。
最小验证清单¶
- 决策、数据、持有、执行和风控频率是否分别声明?
- 所有特征是否按当时真实可得时间构造?
- Listed universe 是否来自当时的合约快照,而不是事后成交集合?
- 成交模型是否使用报价方向、时间新鲜度和规模约束?
- 点差、费用、滑点、冲击、未成交和生命周期成本是否进入净收益?
- 规则与参数是否在样本外评估,并报告完整搜索族?
- 公司行动、合约调整、缺失数据和修订版本是否可追溯?
- 模型失效、regime 变化与容量上限是否有独立检查?