floviq logo floviq
← 筆記 · 2026-06-08 · mechanics

台股升降單位六級非線性規則 — 自動掛價退單陷阱與 ETF 兩級制完整解析

台股集中市場的委託價格不能任意填寫——每一筆掛單都必須符合「最小跳動單位(升降單位)」的要求,不符合的委託將被交易系統直接退單。升降單位並非固定數字,而是依當下委託價格所在的區間決定,共分為六個級距。低價股的最小跳動單位為 0.01 元,高價股則達 5 元,兩端相差 500 倍

ETF 另設獨立的兩級制規則,與普通股計算方式不同。

若在自動化工作流程中以固定值掛價(例如統一用 0.01 或 0.1 元做步進),在股票跨越級距邊界時將觸發退單(order rejection),且通常不產生明顯錯誤訊息,屬於典型的靜默失敗(silent failure)。

本文規則來源為 TWSE 營業細則第 62 條,與 台股漲跌停 ±10% 計算規則 互為配套——漲跌停計算需先知道 tick 是多少,才能正確取整至合法委託價格。


① 六個升降單位級距(TWSE 第 62 條)

TWSE 依委託當下的股票當市價格,對應以下六個跳動單位區間:

股價範圍最小跳動單位(元)
未滿 10 元(含未滿 5 元)0.01
10 元至未滿 50 元0.05
50 元至未滿 100 元0.10
100 元至未滿 500 元0.50
500 元至未滿 1,000 元1.00
1,000 元以上5.00

來源:TWSE 官方升降單位現況表(依 TWSE 營業細則第 62 條 · live curl 2026-06-08)。TWSE 官方表格中股票欄在 0.01 元至未滿 5 元、5 元至未滿 10 元兩列經 rowspan 均對應 0.01 元跳動單位,實務上可視為同一區間,合計為「未滿 10 元 = 0.01 元」六級(讀官方表時注意:5 元至未滿 10 元那列顯示的 0.05 屬權證欄而非股票欄,勿誤讀為股票 tick)。

六級的非線性結構

六個級距的 tick 大小並不是線性等比——從 0.01 到 0.05 放大 5 倍,從 0.05 到 0.10 放大 2 倍,從 0.10 到 0.50 放大 5 倍,從 0.50 到 1.00 放大 2 倍,從 1.00 到 5.00 再放大 5 倍。這種跳躍式放大意味著,程式若以固定比例縮放 tick,在不同價格區間的行為會完全不同。


② ETF 兩級制(與普通股不同)

ETF(包含國內成分股 ETF、國外成分股 ETF、槓桿反向 ETF、境外 ETF、ETN 及 REITs)適用 TWSE 升降單位表中的獨立欄位,與普通股共用同一級距:

ETF 受益憑證市價最小跳動單位(元)
未滿 50 元0.01
50 元以上0.05

ETF 的升降單位僅有兩個級距,以 50 元為分界,全部低於普通股在同一價格區間的對應 tick(例如普通股 10-50 元 tick 為 0.05 元,ETF 在同一價格區間 tick 為 0.01 元)。

這意味著同一個掛價數字對普通股可能是合法的,對 ETF 卻不一定,反之亦然。整合普通股與 ETF 的自動化掛價工具,需在取得 tick 前先判斷證券類型。

來源:TWSE 官方升降單位現況表,ETF 欄位 rowspan 對應 0.01 元至未滿 50 元 = 0.01 元、50 元以上 = 0.05 元(live curl 驗証 2026-06-08)。


③ 為何固定 tick 掛價會退單(silent failure 解析)

自動化掛價程式最常見的錯誤模式是「用一個固定 tick 計算所有股票的委託價格」。退單的根本原因有三:

原因 A:單一 tick 值跨區間失效

假設程式統一使用 0.10 元步進計算委託價格,對某低價股(未滿 10 元,tick 應為 0.01 元)而言,掛出的 0.10 元整數倍雖然恰好也是 0.01 元的整數倍,表面上不會退單——但一旦掛出 0.07、0.13 等非 0.10 整數倍的「精確」價格,該筆委託即不符合 0.01 元的 tick,被系統拒絕。

更常見的情形:使用 0.05 元步進的程式,在高價股(100 元以上,tick 應為 0.50 元或更大)試圖掛 123.05 元,被退單。

原因 B:跨越級距邊界未重算

股票從 49.5 元上漲到 50.5 元後,tick 從 0.05 元切換為 0.10 元。若程式在更新掛價時仍沿用前一個 tick,掛出 50.55 元(0.05 元的合法整數倍),在新 tick 下為非法委託(50.55 不是 0.10 的整數倍),觸發退單。

原因 C:ETF 與普通股邏輯混用

同一個工作流整合了普通股與 ETF 的報價時,若共用同一套 getTickSize() 函式(按普通股六級計算),ETF 在 50 元以上對應的 tick 會被錯算為 0.10 元(普通股 50-100 元區間),而 ETF 正確 tick 應為 0.05 元。掛出 0.05 元倍數的 ETF 委託不會退單,但若程式進一步計算至 0.07、0.08 等非 0.05 整數倍,則退單。

三種原因的共同點:交易系統退單時通常回傳的是「委託失敗」或「委託價格不符規定」,不說明是哪個 tick 規則出了問題,屬靜默失敗型態。


④ 切換邊界的完整名單

切換邊界普通股 tick 變化ETF tick 變化
10 元0.01 → 0.05(無切換,兩端均 0.01)
50 元0.05 → 0.100.01 → 0.05
100 元0.10 → 0.50(無切換,兩端均 0.05)
500 元0.50 → 1.00(無切換,兩端均 0.05)
1,000 元1.00 → 5.00(無切換,兩端均 0.05)

ETF 只有一個切換邊界(50 元),普通股有五個切換邊界(10 / 50 / 100 / 500 / 1,000 元)。

整合型系統若要統一判斷,需按證券類型分流:先判斷是普通股還是 ETF 類商品,再套用對應的 tick 查表邏輯。


⑤ 正確取整的程式範例

以下為依 TWSE 第 62 條實作的 tick 查表函式,普通股版與 ETF 版分開:

// 普通股升降單位(TWSE 第 62 條 · 六級)
function getStockTickSize(price) {
  if (price < 10)   return 0.01;
  if (price < 50)   return 0.05;
  if (price < 100)  return 0.10;
  if (price < 500)  return 0.50;
  if (price < 1000) return 1.00;
  return 5.00;
}

// ETF / REITs / ETN 升降單位(TWSE 第 62 條 · 兩級)
function getEtfTickSize(price) {
  if (price < 50) return 0.01;
  return 0.05;
}

// 向下取整至合法 tick(掛漲停買入、計算漲停價)
function floorToTick(price, tick) {
  if (tick < 1) {
    // tick 小於 1:放大到整數空間,對「tick 個數」取整
    const inv = Math.round(1 / tick);        // 0.10 → 10、0.01 → 100
    const count = Math.floor(price * inv + 1e-9); // +1e-9 容忍浮點向下飄移
    return count / inv;
  }
  // tick ≥ 1(1.00 / 5.00):直接以 tick 個數取整
  const count = Math.floor(price / tick + 1e-9);
  return count * tick;
}

// 向上取整至合法 tick(計算跌停價)
function ceilToTick(price, tick) {
  if (tick < 1) {
    const inv = Math.round(1 / tick);
    const count = Math.ceil(price * inv - 1e-9);
    return count / inv;
  }
  const count = Math.ceil(price / tick - 1e-9);
  return count * tick;
}

浮點誤差處理是必要步驟49.80 * 1.1 在 JavaScript 原生浮點運算中會回傳帶尾差的值(如 54.78000000000001),直接 Math.floor 取整可能偏移一個 tick。做法是把價格放大到 tick 個數的整數空間(price * inv),加上微小容忍值 1e-9 抵銷向下飄移,再以 Math.floor 對「tick 個數」取整。注意 tick ≥ 1(1.00 / 5.00)時不可用 Math.round(1 / tick)——Math.round(1 / 5) 會得到 0 並造成除以零,因此 tick ≥ 1 須走 price / tick 分支。


⑥ 跨邊界計算範例

範例一:普通股跨越 50 元邊界

某低價股前日收盤 48 元(tick = 0.05 元)。隔日漲停計算:

漲停(未取整)= 48.00 × 1.1 = 52.80
→ 52.80 落在 50-100 元區間,tick 切換為 0.10 元
→ 向下取整至 0.10 的整數倍 → 合法漲停 = 52.80 元
(52.80 恰好是 0.10 的整數倍,無需調整)

若基準價為 49.80 元:

漲停(未取整)= 49.80 × 1.1 = 54.78
→ 54.78 落在 50-100 元區間,tick = 0.10 元
→ 向下取整至 0.10 的整數倍 → 合法漲停 = 54.70 元
(54.78 → 54.70,偏差 0.08 元)

程式取整時應使用漲停後價格所在區間的 tick,而非計算基準所在區間。

範例二:ETF 跨越 50 元邊界

某 ETF 受益憑證市價 47.50 元(tick = 0.01 元)。若掛進 52.75 元:

52.75 落在 50 元以上 ETF 區間,tick = 0.05 元
52.75 不是 0.05 的整數倍(52.75 / 0.05 = 1055.0 → OK,52.75 合法)

若掛進 52.73 元:

52.73 / 0.05 = 1054.6 → 非整數倍 → 退單

⑦ 自動掛價退單的防禦做法

做法說明
每次掛單前重查 tick不快取 tick,每次依當下委託價格重新調用查表函式
區分普通股與 ETF掛單前判斷證券類型,選用對應的 getStockTickSizegetEtfTickSize
掛單前執行 floorToTick計算完目標價格後,一律通過取整函式對齊合法 tick,再送出委託
浮點精度對齊把價格放大到 tick 個數的整數空間再取整,並加 1e-9 容忍值,消除浮點尾差導致取整偏移一個 tick
退單後記錄 context退單時 log 當下價格與使用的 tick,方便後續 debug 確認是哪個邊界出問題

台股自動化盤前預算與掛價工具,若需整合上市普通股與 ETF 的委託計算,可參考 floviq 盤前工具 的處理架構,該工具針對跨邊界的 tick 切換與浮點對齊設計了獨立驗證層。


⑧ Edge case 已知

處置股(disposal stock):在處置期間,鉅額交易的升降單位為 0.01 元(TWSE 另行規定)。普通股的六級 tick 僅適用於一般交易,不適用於全額交割股的特定申報情境。

盤後定價交易:依 TWSE 規定,盤後定價交易的升降單位與一般交易相同,不另設規則。但盤後以收盤價為唯一成交基準,實務上掛價不具選擇空間,tick 驗算主要在確認收盤價本身是否符合 tick(由 TWSE 計算,理論上已對齊)。

零股交易:升降單位與一般交易相同。但零股每 5 秒撮合,盤中市價可能與整張市場有價差,取 tick 時以零股委託當下市價為準。

鉅額逐筆交易(block trade):申報買賣價格升降單位均為 0.01 元,無論股票價格區間。與一般交易的六級差異在設計上有明確切割,整合鉅額申報的工具需特別注意。


⑨ See also

  • 台股漲跌停 ±10% 計算規則 — 漲停 / 跌停價格的 ×1.1 / ×0.9 計算邏輯,tick 取整方向,以及六個升降單位級距的完整說明(本文的前置知識)
  • TWSE MIS 預算好的漲跌停欄位 — MIS getStockInfo u/w 欄位直接提供預算完的漲停/跌停價,可省去自行計算 tick 取整的步驟;但無漲跌幅限制的特殊股票(新上市首 5 日、ETF 例外)該欄位的可信度需獨立驗証
  • TWSE 交易制度 — 官方升降單位現況表(含股票、ETF、公司債等各類有價證券欄位)
  • floviq 台股盤前自動化工具 — 整合 tick 驗算與委託價格對齊的實作工具參考

※ 本文描述台股集中市場升降單位規則(TWSE 第 62 條)及 ETF 兩級制 tick 計算架構,不構成投資建議,投資請自行評估風險。

資料來源:TWSE 交易制度官方頁面(升降單位現況表 · live curl 2026-06-08);TWSE 營業細則第 62 條