台股新上市股票前 5 個交易日無漲跌幅限制 — TWT88U 端點、自動化 ±10% 誤判陷阱與 ROC 日期解析
台股一般上市股票的每日漲跌幅限制為 ±10%。然而 TWSE 有一個明確例外:初次上市的普通股,自上市日起前 5 個交易日,漲跌幅限制為「無」,股價可由市場完全自由定價。這個例外在實務上有兩個常見的誤判點:第一,不熟悉制度的投資人誤以為新股第一天也受 ±10% 約束;第二,工程師在建立自動化行情警報或盤前篩選邏輯時,沿用 ±10% 規則套到新掛牌股票,在窗口期內靜默誤判。
TWSE 為此專門提供了 TWT88U 端點,回傳最近一批新掛牌普通股首五日的成交明細,連同掛牌基本資料與逐筆承銷商成交。此端點並非「今日仍在窗口才回傳」的即時篩選,呼叫端必須以 1stTradingDate <= today <= 5thTradingDate 自行判斷窗口(詳見 §④/§⑤)。本文整理制度依據、端點欄位的讀法陷阱、自動化整合邏輯,以及 ROC 民國日期的正確解析方式。
① 無漲跌幅限制的制度依據
TWSE 官方交易制度說明的原文:
初次上市普通股票…自上市日起五個交易日,其股市價格升降幅度為無漲跌幅限制
同頁另有:
94年3月1日起實施初上市首五日無漲跌幅調整案
這個制度自民國 94 年(西元 2005 年)3 月 1 日起正式實施。在此之前,新上市股票首日適用的漲跌幅規則另有安排;94 年 3 月 1 日後統一採用「前 5 個交易日完全無漲跌幅限制」。
計算範圍:第 1 至第 5 個交易日(以實際交易日計,跳過非交易日)均無漲跌幅限制。
新上市首五日相較一般股票的差異只有兩點:(1) 升降幅度為無漲跌幅限制;(2) 首五日期間不實施盤中瞬間價格穩定措施。第 6 個交易日起恢復一般 ±10% 漲跌幅,並恢復實施盤中瞬間價格穩定措施。撮合方式前後一致——台股自逐筆交易改制後,所有股票盤中時段(9:00–13:25)一律採逐筆交易,開盤及收盤採集合競價;新股首五日的盤中同樣是逐筆交易,並非集合競價,第 6 日也沒有「集合競價→逐筆」的撮合切換。官方原文「開盤及收盤仍採集合競價方式」的「仍」字,指的是與一般市場相同的開收盤集合競價,不是指盤中採集合競價。
② TWT88U 端點:什麼資料
GET https://openapi.twse.com.tw/v1/exchangeReport/TWT88U
TWSE OpenAPI Swagger 對此端點的官方描述:「上市個股首五日無漲跌幅」。
端點回傳最近一批新掛牌普通股首五日的成交明細(不可假設「出現在回傳結果=今日仍在窗口」,須自行以 1stTradingDate <= today <= 5thTradingDate 判斷),每筆包含兩層欄位:
掛牌基本資料層(每檔股票固定)
| 欄位 | 型別 | 說明 |
|---|---|---|
SecurCode | 字串 | 股票代號(如 "4582") |
SecurName | 字串 | 股票名稱(如 "聚恆-創") |
1stTradingDate | 字串 | 第 1 個交易日(ROC 民國 7 位,如 "1150522") |
5thTradingDate | 字串 | 第 5 個交易日(ROC 民國 7 位,如 "1150528") |
PriceUnderwritten | 字串 | 承銷價格(元,如 "24.34") |
OverAllotmentShares | 字串 | 超額配售股數(千股,如 "300") |
逐筆承銷商成交明細層(每成交筆一行)
| 欄位 | 型別 | 說明 |
|---|---|---|
Code | 字串 | 承銷商代號(官方描述為「代碼別」,如 "11") |
Name | 字串 | 承銷商名稱(官方描述為「承銷商名稱」,即參與該新股承銷的證券商,如 "統 一"=統一證券,含全形空格) |
BuySell | 字串 | 買賣方向("B" = 買進,"S" = 賣出) |
TradingPrice | 字串 | 成交價格(元) |
TradingVolume | 字串 | 成交股數(股) |
AccTradingVolume | 字串 | 累計成交股數(股) |
近期一次查詢抓到的樣本(每日滾動,內容會變動):SecurCode: "4582"(聚恆-創),1stTradingDate: "1150522",5thTradingDate: "1150528",多筆成交紀錄均為同一股票、同一承銷商(Code: "11" / Name: "統 一",統一證券)的逐筆成交,差異在成交價量(TradingPrice 23.85 / 23.90 / 23.95 / 24.00 / 24.30,累計量 10 / 15 / 19 / 50 / 300)。同一檔新股可能有多筆同一承銷商成交,去重與彙總邏輯不可假設一行就是一家券商。
③ Schema 最容易誤讀的兩個點
誤讀點 1:Code / Name 是承銷商,不是股票
同一筆 JSON 回傳內,SecurCode / SecurName 是股票代號 / 股票名稱,Code / Name 是承銷商代號 / 承銷商名稱(官方對 Name 的描述為「承銷商名稱」、Code 為「代碼別」,即參與該新股承銷的證券商)。兩組欄位命名相鄰,初次接觸這個端點時,很容易把 Name(承銷商)誤讀為股票名稱。
Name 欄位的值如 "統 一",含多個全形空格(這是 TWSE 原始資料的對齊格式,不是去空白後的乾淨字串)。程式取值後若直接用於顯示或比對,需先做 strip(),否則字串匹配會靜默失敗。
誤讀點 2:日期欄位是 ROC 民國 7 位字串
1stTradingDate 與 5thTradingDate 的值格式為 7 位民國年 YYYMMDD,例如 "1150522" 代表民國 115 年 5 月 22 日(即西元 2026-05-22)。
這個格式與 TWSE 其他端點的日期格式不統一:TWSE 體系內同時存在「ROC 7 位」、「ROC 年/月/日斜線格式」、「西元 8 位 YYYYMMDD」等多種日期表示,不可混用 general datetime parse(會靜默錯誤或拋例外)。正確的解析方式見下方 §⑤。
④ 自動化 ±10% 邏輯的靜默誤判陷阱
工程師在建立盤前篩選工具(如突破警報、異常波動偵測、漲跌停追蹤)時,常見的設計是:
- 抓取全市場行情(如 TWSE
STOCK_DAY_ALL或盤中MIS端點) - 比對「今日最高 / 最低 / 收盤 vs 昨日收盤 ± 10%」
- 判斷是否觸及漲停或跌停
這個邏輯套用在一般個股是正確的。但新上市股票在前 5 個交易日沒有 ±10% 的限制,股價可以在任意範圍波動。套用 ±10% 邏輯會產生兩種靜默誤判:
誤判類型 A:漲停永遠不觸發
如果偵測邏輯是「收盤價 ≥ 昨日收盤 × 1.1 → 視為漲停」,新股在前 5 日的實際成交價可能遠超 +10%,但因為沒有漲停板的實際約束,偵測邏輯不會回傳「觸及漲停」,呼叫端以為「沒有漲停」,實際上只是 ±10% 規則對新股不適用。
誤判類型 B:正常波動被誤判為訊號
如果偵測邏輯反過來是「漲幅不超過 ±10% 的個股排除」,新股前 5 日可能因市場對承銷價發現折溢價而在 ±10% 範圍內正常成交,反而被排除在篩選結果之外,錯過觀察對象。
正解:在判斷 ±10% 邏輯前先查 TWT88U
流程:每個交易日開始前,先呼叫 TWT88U,取得目前仍在無漲跌幅窗口的股票代號集合。對於集合內的股票,跳過 ±10% 漲跌停偵測邏輯(或另外以「無限制」模式處理);集合外的股票正常套用 ±10% 規則。
floviq 的台股盤前推播模板在自動化盤前篩選時就是這樣處理:先判斷個股是否仍在新掛牌無漲跌幅窗口,再決定要不要套用漲跌停邏輯,避免把新股誤判。
⑤ Python:ROC 日期解析與窗口判斷範例
下方範例示範:解析 TWT88U 的 ROC 7 位日期 → 判斷今日是否仍在無漲跌幅窗口內 → 建立「窗口股票代號集合」供後續邏輯使用。
from datetime import date
def parse_roc_date(roc_str: str) -> date:
"""
解析 TWSE ROC 民國 7 位日期字串 (YYYMMDD → datetime.date)
例: "1150522" → date(2026, 5, 22)
注意: 不使用 strptime,避免年份解析歧義
"""
# 前 3 碼是民國年 (YYY),後 4 碼是月日 (MMDD)
roc_year = int(roc_str[:3]) # 例: 115
month = int(roc_str[3:5]) # 例: 05
day = int(roc_str[5:7]) # 例: 22
western_year = roc_year + 1911
return date(western_year, month, day)
def build_no_limit_set(twt88u_rows: list[dict], today: date | None = None) -> set[str]:
"""
從 TWT88U 回傳的資料列建立「今日仍在無漲跌幅窗口」的股票代號集合。
窗口條件: 1stTradingDate <= today <= 5thTradingDate
"""
if today is None:
today = date.today()
no_limit_codes = set()
seen = set()
for row in twt88u_rows:
code = row["SecurCode"]
if code in seen:
# 同一股票多筆 (逐筆成交明細) 只需判斷一次
if code in no_limit_codes:
continue
seen.add(code)
continue
seen.add(code)
first_day = parse_roc_date(row["1stTradingDate"])
fifth_day = parse_roc_date(row["5thTradingDate"])
if first_day <= today <= fifth_day:
no_limit_codes.add(code)
return no_limit_codes
# 使用範例 (對齊 TWSE TWT88U 端點實際回傳結構)
import json, urllib.request
url = "https://openapi.twse.com.tw/v1/exchangeReport/TWT88U"
with urllib.request.urlopen(url) as resp:
rows = json.load(resp)
no_limit_set = build_no_limit_set(rows)
# 後續邏輯: 對每支個股判斷是否適用 ±10%
for stock_code in all_stock_codes:
if stock_code in no_limit_set:
# 跳過 ±10% 漲跌停偵測,或以「無限制」模式處理
pass
else:
# 正常套用 ±10% 漲停 / 跌停邏輯
pass
幾個實作細節說明:
- ROC 日期採字串切割(
roc_str[:3]/roc_str[3:5]/roc_str[5:7]),不依賴strptime的格式解析,避免 Python%y與三位民國年的歧義。 TWT88U同一股票對應多筆逐筆成交明細(同一承銷商可有多筆不同價量成交,各佔一行),build_no_limit_set以seen集合去重,避免重複計算。- 端點回傳的是最近一批新掛牌首五日成交明細,呼叫端不可假設「出現在回傳結果=今日仍在窗口」——必須以
1stTradingDate <= today <= 5thTradingDate自行判斷(上方範例已如此處理)。實測發現端點會繼續回傳5thTradingDate已過的個股,印證它並非「今日仍在窗口」的即時篩選。空陣列的意義(是否代表當日無股票在窗口)官方並未定義,程式應容忍空陣列、不視為錯誤,但也不宜據此斷言其確切意義。
⑥ 其他適用無漲跌幅限制的類別
TWSE 交易制度說明同頁列出,除了新上市普通股前 5 日之外,下列類別也適用無漲跌幅限制:
- 中央登錄公債、外國債券:依官方升降幅度表,此二類不設漲跌幅上限。(注意公司債的升降幅度為 ±5%,並非無限制,不屬此清單。)
- 部分 ETF 及國外成分證券 ETF:依各商品掛牌條件個別決定;並非所有 ETF 均無限制,多數股票型 ETF 適用與個股相同的 ±10%。
- 其他依主管機關規定公告者:TWSE 可依市況或特殊情形另行公告例外。
本文主軸為初次上市普通股的前 5 日窗口。上述其他類別的判斷需參照各商品的個別掛牌文件,不能以 TWT88U 端點作為通用查詢入口(TWT88U 專用於普通股首五日)。
⑦ Edge case 已知
端點回傳空陣列:TWT88U 可能回傳空陣列([]),程式應容忍空陣列、不視為呼叫失敗。「空陣列=當日無股票在窗口」這層意義官方並未定義,故本文不對空陣列的確切意義作斷言(呼叫端的窗口判斷一律以 1stTradingDate <= today <= 5thTradingDate 自行重算為準)。
5thTradingDate 的計算基準:第 5 個交易日以實際交易日計,跳過假日與非交易日,不是上市日加 4 個日曆日。端點欄位本身已由 TWSE 計算完成,呼叫端直接讀取 5thTradingDate 即可,不需自行推算。
承銷價格與成交價的關係:PriceUnderwritten(承銷價)是新股掛牌定價參考,不是前 5 日的漲跌幅計算基準。前 5 日既然無漲跌幅限制,本欄位不用於任何漲停 / 跌停計算。
全形空格:Name(承銷商名稱)欄位含全形空格對齊,從端點取值後需 strip() 再用於比對或顯示,否則字串不等值。
⑧ See also
- 台股漲跌停 ±10% 計算機制與升降單位 — 一般個股漲停 / 跌停的完整計算邏輯,與本文的「前 5 日無限制」構成完整的例外架構
- TWSE OpenAPI 日期格式陷阱 — ROC 民國年 7 位與其他 TWSE 日期格式並存的完整分析
- TWSE 交易制度官方說明 — 前 5 日無漲跌幅制度原文依據(94 年 3 月 1 日起)
- TWSE OpenAPI Swagger — TWT88U 端點官方描述
修正紀錄
先前版本有以下更正:
- §①:撮合方式前後一致 → 第 6 日恢復的是 ±10% 漲跌幅與盤中瞬間價格穩定措施,並非「集合競價切換為逐筆」。
- 前言/§②/§⑦:TWT88U 不是「今日仍在窗口」的即時篩選 → 窗口須自行以
1stTradingDate <= today <= 5thTradingDate判斷。 - §②:樣本「不同券商買進」→ 同一承銷商(統一證券)的不同價量逐筆成交。
- §②/§③/§⑦:
Code/Name為「券商」→ 「承銷商」。 - §⑥:「政府公債」→ 「中央登錄公債、外國債券」。
想在自動化流程中整合 TWSE 公開資料(盤前行情、法人籌碼、新掛牌觀察),每個交易日自動推播到 Telegram?floviq 的台股盤前推播模板以 n8n 為基礎,純資料整理,不推薦個股,不帶單。詳見 portaly.cc/floviq。
※ 本文描述台股初次上市普通股前 5 個交易日無漲跌幅限制的制度機制、TWT88U 端點 schema,以及自動化 ±10% 邏輯的誤判邊界 · 不構成投資建議,投資請自行評估風險。
資料來源:TWSE 交易制度(初次上市普通股前 5 日無漲跌幅條文,94 年 3 月 1 日起實施);TWSE TWT88U 端點(實際回傳資料,每日滾動);TWSE OpenAPI Swagger(TWT88U 官方描述)
如果這篇對你有用: