計算 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

發布於 。

後續步驟