2. 基础知识
在多资产交易系统中,行情、订单、结算与风控都依赖同一套时间基准。交易日历(Trading Calendar)正是这套基准的载体:它用结构化的方式回答“某个市场在某一天是否开市、开市时段如何划分、哪些日期因节假日或临时安排休市”。对跨市场策略而言,交易日历不是一张简单的放假表,而是决定数据对齐、订单路由、估值时点和风险敞口计算的基础设施。
一、核心原理:交易日历解决什么问题
不同市场的交易时间、节假日和结算周期天然不一致。例如 A 股、港股、、日股以及外汇、期货市场,各自的节假日安排、夏令时切换规则和半日市制度都不同。如果没有统一的日历模型,系统会出现三类典型问题:一是把休市日误判为交易日,导致行情缺失或订单被拒;二是把不同市场的“同一天”直接对齐,忽略了时区与交易时段的错位;三是在结算与估值环节使用了错误的日期,造成资金与持仓对不上。
交易日历的核心原理可以概括为:以市场为维度,以日期为索引,以时段为粒度,描述每个市场在时间轴上的可交易状态。它既包含静态规则(如每年固定的节假日、周末规则),也包含动态调整(如临时休市、半日市、夏令时切换)。系统通过查询日历,把“自然日”映射为“交易日”,再把“交易日”细化为“交易时段”,最终支撑跨市场的统一时间对齐。
二、组成要素:一张完整日历包含什么
一个可用于生产环境的交易日历,通常由以下要素构成。理解这些要素,有助于在系统设计和数据校验中判断日历是否完整。
- 市场标识:如 XSHG(上交所)、XSHE(深交所)、XHKG(港交所)、XNYS(纽交所)、XJPX(日交所)等,通常采用 MIC 代码或内部编码。
- 日期维度:自然日、交易日、结算日、估值日、到期日等,不同业务查询的日期类型不同。
- 开市状态:开市、休市、半日市、临时休市、提前收盘等。
- 交易时段:集合竞价、连续竞价、午休、盘后固定价格交易等,每个时段有明确的起止时间。
- 时区与夏令时:市场所在时区、UTC 偏移、夏令时起止规则,决定跨市场对齐的绝对时间。
- 版本与生效区间:日历会因政策调整而更新,必须记录版本号和生效日期,避免历史回测使用未来规则。
三、常见术语与查询方法
跨市场开发中经常遇到以下术语,需要统一口径:
| 术语 | 含义 | 典型用途 |
|---|---|---|
| 交易日(Trading Day) | 市场实际开市并可撮合交易的日期 | 行情对齐、订单路由 |
| 结算日(Settlement Day) | 资金与证券完成交收的日期,通常为 T+N | 资金计算、持仓核对 |
| 半日市(Half Day) | 开市但交易时段缩短的日期 | 时段校验、收盘任务 |
| 临时休市(Ad-hoc Closure) | 因天气、故障或政策临时关闭市场 | 风控熔断、任务重排 |
| 时区偏移(UTC Offset) | 市场本地时间与 UTC 的差值 | 跨市场时间对齐 |
| 日历版本(Calendar Version) | 日历数据的发布版本与生效区间 | 回测一致性、审计追踪 |
查询交易日历时,推荐使用“市场 + 日期 + 时段”三元组作为输入,返回结构化结果。例如在 Python 中可以这样表达:
from datetime import date, datetime, timezone
def query_calendar(market: str, day: date) -> dict:
# 伪代码:从日历服务获取指定市场、指定日期的状态
return {
"market": market,
"date": day.isoformat(),
"is_trading_day": True,
"sessions": [
{"name": "auction", "start": "09:15", "end": "09:25"},
{"name": "continuous", "start": "09:30", "end": "11:30"},
{"name": "continuous", "start": "13:00", "end": "15:00"}
],
"timezone": "Asia/Shanghai",
"utc_offset": "+08:00",
"calendar_version": "2025.03"
}
对于跨市场对齐,还需要把本地时段转换为 UTC 时间,再统一比较。例如 A 股 09:30(UTC+8)对应 UTC 01:30, 09:30(UTC-5)对应 UTC 14:30。只有转换到同一时间基准,才能判断两个市场的交易时段是否重叠。
四、跨市场应用场景与常见误区
交易日历在跨市场业务中应用广泛,典型场景包括:
- 行情对齐:把不同市场的 K 线按统一时间轴对齐,缺失的休市日不生成虚假行情。
- 订单路由:在目标市场休市时拒绝或缓存订单,避免无效报单。
- 估值与结算:按各市场结算日计算资金交收,防止跨市场资金错配。
- 风控与熔断:在临时休市或半日市时调整风控参数和任务调度。
- 回测与仿真:使用历史版本的日历,保证回测与实盘的时间逻辑一致。
复盘时,建议重点检查三类问题:日历数据是否覆盖了所有目标市场;时区转换是否统一到 UTC 或明确的基准时区;动态事件(临时休市、半日市)是否有独立的更新与通知机制。只有把日历当作与行情、订单同等重要的基础数据来治理,跨市场交易系统的时间对齐才可靠。