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}請求國定假日。只要清單中任何一個國家在該日放假,該日期就不會計入。 - 計算日期 將交易日、交割期間及國家清單傳入指令碼。它會每次往後移一個曆日,只有平日且未列為假日的日期才會計入。快取會保留每個國家及年份的假日,讓迴圈逐日推算時不必再次請求。
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發布於 。
後續步驟
建立免費金鑰,從自己的程式碼呼叫 API。 取得免費 API 金鑰
