三個法人各自在做什麼、多少算大,以及三個用實測數字就能拆掉的誤讀。
外資買超那天大盤漲,你以為抓到訊號。但外資的買盤本身就是那天成交量的一部分——漲跌和買超其實是同一件事被算了兩次。這篇把三大法人買賣超的官方口徑、值域級距,以及三個最常被誤讀的地方,用實測數字一次講完。
三大法人買賣超是臺灣證券交易所每個交易日公布的一組數字,內容是外資及陸資、投信、自營商三類法人當天的買進金額(或股數)減去賣出金額(或股數)。正值代表這類法人今天淨買進,負值代表淨賣出。
TWSE 對三類法人的定義是身分別,不是行為別(報表註記原文,2026-09-17 抓取):
| 法人 | TWSE 定義原文 |
|---|---|
| 自營商 | 「自營商表示證券自營商專戶。」 |
| 投信 | 「投信表示本國投資信託基金。」 |
| 外資及陸資 | 「外資及陸資表示依『華僑及外國人投資證券管理辦法』及『大陸地區投資人來臺從事證券投資及期貨交易管理辦法』辦理登記等投資人。」 |
全市場的三大法人買賣金額統計表(BFI82U)回傳 6 列、單位是元;個股的三大法人買賣超日報(T86)逐檔揭露、單位是股(實測 2026-09-15 回傳 15,840 檔)。BFI82U 的 6 列裡,外資自營商是獨立的一列;在 Blave 的資料序列中,這一列自 2024-08-16 起每日皆為 0。
不會。TWSE 在報表註記講得很白:
也就是說,三大法人是一張原始成交的快照,公布之後不因錯帳更正而回頭調整。這一點跟融資餘額剛好相反——融資餘額的授信機構在次日還在調帳,TWSE 明講要以「前日餘額」為準(見〈融資餘額怎麼用〉)。同樣是籌碼面,兩個指標的資料性質不同,做研究時的處理方式也不該一樣。
公布時間是收盤後的當日下午。TWSE 官方頁面沒有明文寫死時間,所以本文不給一個精確到分鐘的說法。
單日買賣超淨額分布,單位億元。視窗 2025-09-17~2026-09-16,n=242,資料取自 Blave 的三大法人資料序列(上市市場):
| 法人 | p05 | p25 | 中位數 | p75 | p95 | 平均 | 買超日佔比 |
|---|---|---|---|---|---|---|---|
| 外資 | −892.6 | −377.0 | −52.3 | +165.2 | +603.3 | −86.2 | 43.8% |
| 投信 | −77.0 | −20.0 | +14.6 | +71.0 | +160.9 | +27.6 | 59.9% |
| 自營商 | −301.1 | −104.9 | −14.3 | +60.5 | +153.3 | −34.6 | 47.1% |
| 合計 | −1,077.3 | −380.7 | −45.4 | +227.0 | +683.8 | −93.1 | 46.3% |
要回答「今天這個數字算不算大」,看絕對值級距比看正負有用(同視窗,n=242):
| 法人(億) | 絕對值中位數 | p80 | p90 | p99 | 期間最大 |
|---|---|---|---|---|---|
| 外資 | 262 | 545 | 757 | 1,340 | 1,883 |
| 投信 | 42 | 88 | 135 | 267 | 383 |
| 自營商 | 75 | 156 | 206 | 548 | 822 |
外資單日買賣超 260 億元上下是家常便飯;要超過 757 億元才進得了這個視窗的前 10%。投信的量體小一個級距,中位數只有 42 億元——用同一把尺去看三個法人,會把投信的「大動作」看成沒事。
大多數人讀三大法人時,會把自營商的淨額當成券商自營部的方向判斷。但 TWSE 把自營商拆成「自行買賣」和「避險」兩欄分開揭露,而後者的量體遠大於前者。
近 60 個交易日的實測(TWSE BFI82U 逐日直取,2026-06-24~2026-09-16,n=60):
| 觀察 | 數值 |
|---|---|
| 避險佔自營商成交金額(買+賣) | 78.0% |
| 避險淨額佔自營商絕對淨額(逐日中位數) | 76.6% |
| 避險日均成交金額 vs 自行買賣日均 | 769 億元 vs 218 億元 |
| 期間平均淨額 | 避險 −81.1 億元/日、自行買賣 −8.3 億元/日 |
| 兩者同方向天數/逐日相關 | 73.3%/r=0.716 |
換句話說,你看到的「自營商買超」有將近八成的量體來自避險那一欄。合併看會被避險主導,但不是完全被決定(r=0.716)——要讀自營商的方向,至少得把兩欄分開看。
不會。你把 foreign、investment_trust、dealer 三欄相加,算出來的數字跟新聞上那個「三大法人合計」對不起來——不是你算錯。
TWSE 的官方合計是四項相加:外資及陸資(不含外資自營商)+投信+自營商(自行買賣)+自營商(避險);外資自營商那一欄不計入官方合計。但 Blave API 的 dealer 欄把外資自營商併了進去,所以三欄相加=官方合計+當日外資自營商淨額。
以 2019-06-03 全市場為例(FinMind 原始資料,單位元):
| 項目 | 淨額 | 計入官方合計 |
|---|---|---|
| 外資及陸資 | +4,256,940,836 | 是 |
| 投信 | −470,794,770 | 是 |
| 自營商(自行買賣) | +234,212,750 | 是 |
| 自營商(避險) | −634,731,645 | 是 |
| 外資自營商 | −1,635,530 | 否 |
| 官方合計 | +3,385,627,171 | 前四項相加 |
前四項相加與官方合計分毫不差,被排除在外的是外資自營商那 −1,635,530 元——而它在 Blave API 的 dealer 欄裡面。2018–2024 共有 1,553 個交易日,三欄相加對不上官方合計;2024-08-16 之後這一欄恆為 0,近期的差額是零,但歷史區間的落差是真的。
所以要對上新聞或官方公布的數字,直接讀 total 欄,不要自己把三欄相加——total 就是官方合計,不是各欄相加算出來的。只做近期資料的話兩種算法一樣;區間跨到 2024 年以前、又想把外資自營商單獨拆出來看,就回 BFI82U 原始報表,在那裡它是獨立的一列,Blave API 沒有對應欄位。
dealer 是 Blave 自己的慣例。用這份資料做跨 2024 年以前的研究時,要自己把這個差額算進去。同日高相關,隔日接近擲硬幣。這是本文最該帶走的一條。
視窗 2025-09-17~2026-09-16,買賣超對加權指數報酬的相關係數,n=230(相關性樣本比值域表的 242 少 12 天,是指數資料缺 12 個交易日所致,兩處的 n 請勿混用):
| 對象 | 與當日大盤報酬 r | 與隔日大盤報酬 r |
|---|---|---|
| 外資 | +0.773 | +0.097 |
| 投信 | +0.119 | +0.004 |
| 自營商 | +0.716 | +0.003 |
| 合計 | +0.824 | +0.079 |
當日的高相關是機械性的:法人的買盤本身就是當天成交量的一部分,價格漲與法人買超本來就是同一件事的兩種記法。真正有價值的問題是隔天,而隔天的相關係數只剩 +0.097。
勝率也是同一個結論:外資買超日的隔日上漲機率 59.0%(n=100)、賣超日 52.7%(n=129),全樣本基準 55.5%。差距存在,但把樣本拉到 5 年(n=1,200)就縮成 56.4% vs 54.4%(基準 55.3%)。而且隔日平均報酬反而是賣超日比較高——賣超日 +0.286%、買超日 +0.256%。勝率略高、平均報酬略低,兩邊互相抵銷。
分開看。同一個視窗(2025-09-17~2026-09-16,n=242)三者的方向根本不常一致:
| 觀察 | 數值 |
|---|---|
| 外資與投信同方向的交易日 | 47.5% |
| 外資與自營商同方向 | 75.2% |
| 三者同方向 | 32.6% |
| 「合計」與外資方向相反 | 9.9% |
| 外資佔三大法人絕對淨額(中位數比重) | 67.4% |
| 外資佔三大法人成交金額(買+賣) | 83.7% |
「法人買超」當成單一訊號,在資料上就不是一件事——三者同方向的日子只有三分之一。而且「合計」基本上是外資的影子:外資佔了成交金額的 83.7%,只有 9.9% 的日子合計會跟外資反向。你以為在看三個法人的共識,其實九成在看外資一個人。
全市場層是金額、個股層是股數,欄位名稱也不同,混用會算出錯的東西。
from lib.data import fetch_twmarket_institutional, fetch_twstock_institutional
# 全市場:單位是元,欄位 foreign/investment_trust/dealer/total,2004-04-07 起
mkt = fetch_twmarket_institutional('2025-09-17', '2026-09-16', headers)
# 個股:單位是股,買、賣分開兩欄;lib 直接給 foreign_net
df = fetch_twstock_institutional('2330', '2025-09-17', '2026-09-16', headers)
foreign_net = df['foreign_net'] # 外資買進股數 − 賣出股數
個股層還多給了拆分欄位:自營商的自行買賣(dealer_self_*)與避險(dealer_hedge_*)是分開的,要做上一節那個「把避險拆出來」的判斷,個股層抓得到。
比較務實的用法是把「今天法人動作大不大」變成一個可以測的條件,掛在你自己的主訊號前面,而不是直接拿它進出場。
# 級距取自 2025-09-17~2026-09-16 外資單日買賣超絕對值分位數:p50 262 億、p90 757 億(n=242) BIG = 75_700_000_000 # 元;這是資料的級距,不是回測出來的參數 big_buy = mkt['foreign'] > BIG signal = primary.copy() # primary 是你自己的主訊號 signal[~big_buy] = 0.0 # 外資沒有大買的日子不接受多單
說清楚:這個門檻是分布級距,不是回測驗證過的參數。它回答的是「今天這個數字在歷史上排第幾」,不回答「這樣做會不會賺」——後者只有回測能講,而且要避開拿同一段資料反覆調參數的坑(見〈避免過度擬合〉)。
自營商買賣超股數(合計)排在「自行買賣」三欄之前(索引 11),而自行買賣那組才是買進→賣出→買賣超(索引 12/13/14)。照直覺假設「先自行買賣、再避險、最後合計」會整組錯位。用欄位名稱解析,不要用位置解析。三大法人只有日頻,沒有時間框架可調;能調的是「看哪一層、看幾天」。
| 取法 | 適合 | 注意 |
|---|---|---|
| 全市場單日淨額 | 判斷大盤層級的資金流向強度 | 只有上市;「合計」83.7% 是外資的影子,別當共識讀 |
| 全市場連續段 | 想描述「連買幾天」這種狀態 | 2025-09-17~2026-09-16 買超段 49 段、平均 2.16 天、最長 6 天;賣超段 50 段、平均 2.72 天、最長 13 天(n=242)——「連買五天」比你以為的稀有 |
| 個股單日淨額 | 個股籌碼面條件、選股濾網 | 單位是股;上市走 T86、上櫃走 TPEx,兩邊都有 |
| 個股拆分欄位 | 要把避險從自營商裡拿掉時 | 只有個股層保留拆分欄位 |
本文的範例用全市場單日淨額,理由很簡單:值域與相關性的實測都做在這一層,門檻級距才對得上。換到個股層,級距要重新用個股自己的分布算。
三大法人的口徑搞懂了,下一步是把它變成一個你能驗證的條件:叫 Blave Agent 把這組資料抓下來、寫成濾網、回測給你看——資料層與欄位它都接好了,你只要講你想測什麼。全市場與個股的圖也可以直接在 Studio 看:大盤三大法人、個股籌碼。