2. 基础知识

在多资产交易系统中,行情、订单、结算与风控都依赖同一套时间基准。交易日历(Trading Calendar)正是这套基准的载体:它用结构化的方式回答“某个市场在某一天是否开市、开市时段如何划分、哪些日期因节假日或临时安排休市”。对跨市场策略而言,交易日历不是一张简单的放假表,而是决定数据对齐、订单路由、估值时点和风险敞口计算的基础设施。

一、核心原理:交易日历解决什么问题

不同市场的交易时间、节假日和结算周期天然不一致。例如 A 股、港股、、日股以及外汇、期货市场,各自的节假日安排、夏令时切换规则和半日市制度都不同。如果没有统一的日历模型,系统会出现三类典型问题:一是把休市日误判为交易日,导致行情缺失或订单被拒;二是把不同市场的“同一天”直接对齐,忽略了时区与交易时段的错位;三是在结算与估值环节使用了错误的日期,造成资金与持仓对不上。

交易日历的核心原理可以概括为:以市场为维度,以日期为索引,以时段为粒度,描述每个市场在时间轴上的可交易状态。它既包含静态规则(如每年固定的节假日、周末规则),也包含动态调整(如临时休市、半日市、夏令时切换)。系统通过查询日历,把“自然日”映射为“交易日”,再把“交易日”细化为“交易时段”,最终支撑跨市场的统一时间对齐。

跨市场交易日历:自然日 → 交易日 → 交易时段 自然日时间轴(UTC+8) 周一 周二 周三 周四 周五 周六 A股 09:30-15:00 A股 09:30-15:00 A股 09:30-15:00 A股 09:30-15:00 A股 09:30-15:00 休市 21:30-04:00 21:30-04:00 21:30-04:00 21:30-04:00 21:30-04:00 休市 港股 09:30-16:00 港股 09:30-16:00 港股 09:30-16:00 港股 09:30-16:00 港股 09:30-16:00 休市 对齐要点: 1. 同一自然日,不同市场可能处于不同交易状态;2. 跨市场策略需按“市场+日期+时段”三元组查询; 3. 夏令时切换会导致时段偏移;4. 半日市与临时休市必须纳入动态日历。

二、组成要素:一张完整日历包含什么

一个可用于生产环境的交易日历,通常由以下要素构成。理解这些要素,有助于在系统设计和数据校验中判断日历是否完整。

  • 市场标识:如 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。只有转换到同一时间基准,才能判断两个市场的交易时段是否重叠。

四、跨市场应用场景与常见误区

交易日历在跨市场业务中应用广泛,典型场景包括:

  1. 行情对齐:把不同市场的 K 线按统一时间轴对齐,缺失的休市日不生成虚假行情。
  2. 订单路由:在目标市场休市时拒绝或缓存订单,避免无效报单。
  3. 估值与结算:按各市场结算日计算资金交收,防止跨市场资金错配。
  4. 风控与熔断:在临时休市或半日市时调整风控参数和任务调度。
  5. 回测与仿真:使用历史版本的日历,保证回测与实盘的时间逻辑一致。
常见误区一:把自然日等同于交易日。跨市场策略中,A 股休市而开市是常态,直接按自然日对齐会产生大量空值。误区二:忽略夏令时。欧美市场夏令时切换会使交易时段相对 UTC 偏移一小时,若未处理,跨市场套利信号会错位。误区三:使用单一日历覆盖所有市场。不同市场的节假日和半日市规则差异很大,必须按市场分别维护。误区四:回测使用最新日历。历史回测应使用当时生效的日历版本,否则会引入未来信息偏差。

复盘时,建议重点检查三类问题:日历数据是否覆盖了所有目标市场;时区转换是否统一到 UTC 或明确的基准时区;动态事件(临时休市、半日市)是否有独立的更新与通知机制。只有把日历当作与行情、订单同等重要的基础数据来治理,跨市场交易系统的时间对齐才可靠。