台股資料有缺漏怎麼判讀?

先分清楚兩種缺:市場沒開,和資料沒到。前者用回應裡的 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 列,是不是漏了?
先算那段期間有幾個交易日。一個月扣掉週末與假日,二十幾個交易日是正常的;跨兩個月四十幾列也合理。用回應 meta 裡的 market_status 比對哪幾天是 open,才知道是真的少了還是本來就沒開。
2data_gaps 是空陣列,代表資料完美嗎?
代表那一列沒有已知的缺口標記,不等於整份資料沒有任何問題。它是逐列的訊號,仍要搭配交易日比對與 price_confidence 一起看。
3為什麼不乾脆幫我把缺的補上?
因為補過的序列事後看不出來。被悄悄填平的洞會讓波動度偏低、回撤變淺,而你不會知道那是資料還是市場。寧可讓你看到一個洞,判讀權留給你。
4價格端點為什麼沒有 data_gaps?
它用的是另一組訊號:meta.market_status 告訴你哪天有開盤,count 與 data_as_of 告訴你這次回了多少、資料到哪天,每列的 price_method 與 price_confidence 告訴你這個數字怎麼來的。判讀能力是一樣的,欄位不同而已。

想自己查這些資料?免費註冊

相關文章