计算 T+1 或 T+2 结算日期

2026年11月25日星期三成交的美国股票按 T+1 于2026年11月27日星期五结算,USD/JPY 即期交易按 T+2 于11月30日星期一结算,因为11月26日星期四是美国假日。结算日期 = 交易日期加 N 个工作日,跳过周末以及任何相关国家休业的日期。

使用 API 计算结算日期

T+1 指交易日期之后的一个工作日。美国股票和 ETF 自2024年5月28日起按 T+1 结算。外汇即期交易通常按 T+2 结算,但结算天数取决于市场惯例,因此应根据交易场所的规则选择结算周期。

  1. 选择结算周期 将 days 设为交易后需要经过的工作日天数。示例对美国股票使用 T+1,对 USD/JPY 即期交易使用 T+2。交易日期是起点,不计入该周期。
  2. 设置你的 API 密钥 获取免费 API 密钥,并将其保存在 NARWHAL_API_KEY 环境变量中。脚本读取该变量,并通过 Authorization: Bearer YOUR_KEY 将密钥发送至 https://api.narwhalapi.com。
  3. 选择国家 美国股票示例使用 USA,USD/JPY 同时使用 USA 和 JPN。脚本通过 GET /v1/calendars/holidays/{country}/{year} 请求节假日。列表中任一国家的假日都会使该日期不计入工作日天数。
  4. 计算日期 将交易日期、结算周期和国家列表用于脚本。脚本每次向前移动一个自然日,仅在该日期属于周一至周五且没有列表中的假日时计数。循环逐日运行时,缓存保存各国家和年份的假日,无需重复请求。
    Python,股票和货币对的结算日期
    import os
    from datetime import date, timedelta
    from functools import cache
    import requests
    
    API = "https://api.narwhalapi.com"
    HEADERS = {"Authorization": f"Bearer {os.environ['NARWHAL_API_KEY']}"}
    
    @cache  # one request per country and year, however many days the loop walks
    def holidays(country: str, year: int) -> frozenset[str]:
        r = requests.get(f"{API}/v1/calendars/holidays/{country}/{year}", headers=HEADERS, timeout=10)
        r.raise_for_status()
        return frozenset(h["date"] for h in r.json()["holidays"])
    
    def settlement(trade: date, days: int, countries: list[str]) -> date:
        """The date `days` business days after the trade, skipping a day any listed country is closed."""
        day = trade
        while days > 0:
            day += timedelta(1)
            closed = any(day.isoformat() in holidays(c, day.year) for c in countries)
            if day.weekday() < 5 and not closed:
                days -= 1
        return day
    
    trade = date(2026, 11, 25)
    print("US stock, T+1:", settlement(trade, 1, ["USA"]))
    print("USD/JPY spot, T+2:", settlement(trade, 2, ["USA", "JPN"]))

假日查询使用当前待判断日期的年份,因此循环进入另一年份时,可以请求相应的国家假日列表。缓存属于假日函数,结算函数则接收每笔交易的日期、天数和国家作为输入。假日日期来自响应中的 holidays 列表。函数读取每个 date 值并与循环中的日期比较;只要与任一所列国家的假日匹配,该日期就不计入结算工作日。

在电子表格中计算结算日期

Excel 和 Google Sheets 可以使用 WORKDAY 按相同的工作日天数计算。将休业日期放入名为 Holidays 的范围,再在公式中使用交易日期和结算周期。对于货币对,将两个国家的假日列表合并到该范围中。

2026年11月25日的 T+1
=WORKDAY(DATE(2026,11,25), 1, Holidays)
2026年11月25日的 T+2
=WORKDAY(DATE(2026,11,25), 2, Holidays)

Holidays 范围提供公式除周末外必须跳过的日期。美国股票示例使用美国列表。对于 USD/JPY,应包含美国和日本的列表,这样任一国家休业时,该日期都不会计入。

公式中的结算周期和假日范围各有作用。将周期从 T+1 改为 T+2 会改变需要计算的工作日天数;修改假日范围会改变哪些日期可以计入。准备假日范围时,应使用交易涉及的国家。

不同情况应选哪种方法

情况最合适的方法原因
单笔交易电子表格中的 WORKDAY,配合合并后的假日列表公式根据你提供的休业日期计算结算周期。
交易流水记录或每晚运行的结算任务Python 脚本国家列表确定适用的假日,函数根据交易日期计算结算日期。
交易所专用日历,包含耶稣受难日或提前收市安排交易所自己的日历Narwhal 的列表包含节假日;交易所的休市安排可能不同。

T+2 会跳过另一货币所属国家的假日吗?

会。按照外汇市场惯例,只有两种货币所属国家均为工作日时才计数,因此任一国家的假日都会被跳过。对于 USD/JPY,将 USA 和 JPN 同时传给函数。只使用一个国家的列表会使计算遗漏另一个国家的假日。

交易与结算之间遇到假日时,结算周期仍为 T+2。假日不计入工作日天数,因此会使结算日期在日历上顺延。即使已计入第一个工作日,之后的周末仍会被跳过。

交易日期本身是假日时怎么办?

交易日期之后的第一个工作日计为第1天。脚本从提供的交易日期开始,先前进到下一个自然日,再查找属于周一至周五且在所列国家均不为假日的日期。

如果提供的日期之后紧接着周末或另一个假日,也会跳过。函数持续运行,直到计满所需的工作日天数。这是脚本对传入交易日期的处理方式;结算周期仍由市场惯例和交易场所的规则确定。

节假日列表与交易所日历一致吗?

不一定。Narwhal 的假日数据包含各国节假日,交易所的休市安排可能不同。NYSE 在2026年4月3日耶稣受难日休市,该日期不在 API 的美国联邦假日列表中。

结算依赖交易所特定的休市或提前收市安排时,请使用交易所自己的日历。国家列表为计算提供节假日;列表中没有的交易所休市日期不会自动加入。

计算示例:2026年11月25日星期三成交

从2026年11月25日星期三开始。11月26日星期四是美国感恩节,因此在两个示例中都不计入工作日。11月27日星期五是第1天:美国股票达到 T+1,于当天结算。

日期美国股票,T+1USD/JPY 即期,T+2
2026年11月25日星期三交易日期交易日期
2026年11月26日星期四跳过感恩节跳过美国感恩节
2026年11月27日星期五第1天,结算第1天
2026年11月28日星期六跳过周末
2026年11月29日星期日跳过周末
2026年11月30日星期一第2天,结算

对于 USD/JPY,星期五是第一个工作日。星期六和星期日不计数,因此11月30日星期一是第2天。2026年11月25日交易的 T+2 结算日期是2026年11月30日星期一。

2026年11月25日交易的结算日期
US stock, T+1: 2026-11-27
USD/JPY spot, T+2: 2026-11-30

发布于。