台股資料有缺漏怎麼判讀?
先分清楚兩種缺:市場沒開,和資料沒到。前者用回應裡的 market_status 判斷,後者要自己比對交易日與收到的列數。部分資料集(例如融資融券)另有每列的 data_gaps 欄位;價格端點沒有這個欄位,改用 price_method 與 price_confidence 判斷這個數字是怎麼來的。
缺漏有兩種,處理方式完全不同
- 市場沒開:週末、國定假日、颱風假。這不是缺漏,你的序列本來就不該有那天。
- 資料沒到:那天有開盤,但你手上沒有那一列。這才是缺漏,而且不處理會讓計算悄悄出錯。
- 把兩者混為一談,最常見的後果是「用前一日填平」——序列看起來完整了,但你已經在用一個不存在的價格算報酬。
價格端點:用 meta.market_status 分辨休市與缺漏
價格回應的 meta 裡有 last_trading_day 與 market_status,後者是一組 {date, status},status 會是 open 或 unknown。open 代表那天有開盤,unknown 代表尚未確定(例如還沒到的日期)。拿它跟你收到的列比對,就能分辨「那天沒開」與「那天有開但我沒拿到」。
import requests
r = requests.get(
"https://api.twmarketdata.com/v2/datasets/twse-daily-price",
headers={"X-API-Key": "sk_live_你的金鑰"},
params={"symbol": "2330", "start_date": "2026-06-01", "end_date": "2026-07-31"},
timeout=20,
)
r.raise_for_status()
payload = r.json()
print("回傳列數", payload["count"], "資料截止", payload["data_as_of"])
print("最後交易日", payload["meta"]["last_trading_day"])
have = {row["date"] for row in payload["rows"]}
for entry in payload["meta"]["market_status"]:
if entry["status"] == "open" and entry["date"] not in have:
print("這天有開盤但沒有資料:", entry["date"])每一列都說明自己是怎麼來的
價格的每一列帶 price_method 與 price_confidence。遇到異常值或你不確定的區間,先看這兩個欄位,再決定要不要採用——它們比收盤價本身更能告訴你這筆能不能信。
for row in payload["rows"][:5]: print(row["date"], row["close"], "方法", row["price_method"], "可信度", row["price_confidence"])部分資料集有 data_gaps 欄位,而且是每一列各自帶
融資融券這類資料集,每一列都有自己的 data_gaps。實際打回來多半是空陣列,代表這列沒有已知缺口;非空的時候,裡面就是這一列的缺口標記。要注意它是逐列的,不是整份回應一個總表。
m = requests.get( "https://api.twmarketdata.com/v2/datasets/margin-short", headers={"X-API-Key": "sk_live_你的金鑰"}, params={"symbol": "2330", "limit": 20}, timeout=20,).json() for row in m["rows"]: if row["data_gaps"]: print(row["trade_date"], "缺口標記:", row["data_gaps"])有些資料集的缺口是整份的,不是某一天的
還有一種 data_gaps 描述的是這份資料本身的涵蓋限制,內容是具名的標籤而不是日期,例如「只涵蓋上市、不含上櫃」這類。它不是告訴你某天缺了,而是告訴你這份資料從一開始就沒有涵蓋哪個範圍——做跨市場分析前應該先看它。
沒有一個全站統一的缺漏欄位
這件事值得直說:data_gaps 不是每支端點都有。價格端點就沒有,它給你的是 market_status、count、data_as_of 與逐列的 price_method / price_confidence。所以正確的做法不是「找 data_gaps」,而是先看你打的那支端點提供哪一種訊號。
無論哪一種,都不要自己把洞補起來
- 不要用前一日的值填平。那會製造一段沒有發生過的平盤,波動度被低估、回撤被藏住。
- 不要補 0。0 在價格與買賣超裡都是有意義的數字,補進去之後你分不出「是 0」還是「沒有」。
- 缺就讓它缺,並在計算時明確跳過。序列被補得漂亮,回測就會騙你——這跟前視偏誤是同一類問題。
我們沒有的東西,先說清楚
- 沒有一個統一的 data_gaps 欄位涵蓋所有資料集,如上。
- 沒有即時報價,所以「今天盤中缺一筆」不在這頁討論範圍——盤後才有當天資料。
- market_status 的 unknown 代表尚未確定,不代表休市;不要把 unknown 當成沒開盤來處理。
常見問題
1我抓一個月只拿到 43 列,是不是漏了?
2data_gaps 是空陣列,代表資料完美嗎?
3為什麼不乾脆幫我把缺的補上?
4價格端點為什麼沒有 data_gaps?
想自己查這些資料?免費註冊。