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 结算,但结算天数取决于市场惯例,因此应根据交易场所的规则选择结算周期。
- 选择结算周期 将
days设为交易后需要经过的工作日天数。示例对美国股票使用 T+1,对 USD/JPY 即期交易使用 T+2。交易日期是起点,不计入该周期。 - 设置你的 API 密钥 获取免费 API 密钥,并将其保存在
NARWHAL_API_KEY环境变量中。脚本读取该变量,并通过Authorization: Bearer YOUR_KEY将密钥发送至https://api.narwhalapi.com。 - 选择国家 美国股票示例使用
USA,USD/JPY 同时使用USA和JPN。脚本通过GET /v1/calendars/holidays/{country}/{year}请求节假日。列表中任一国家的假日都会使该日期不计入工作日天数。 - 计算日期 将交易日期、结算周期和国家列表用于脚本。脚本每次向前移动一个自然日,仅在该日期属于周一至周五且没有列表中的假日时计数。循环逐日运行时,缓存保存各国家和年份的假日,无需重复请求。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 的范围,再在公式中使用交易日期和结算周期。对于货币对,将两个国家的假日列表合并到该范围中。
=WORKDAY(DATE(2026,11,25), 1, Holidays)=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+1 | USD/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日星期一。
US stock, T+1: 2026-11-27
USD/JPY spot, T+2: 2026-11-30发布于。
