三个法人各自在做什么、多少算大,以及三个用实测数字就能拆掉的误读。
外资买超那天大盘涨,你以为抓到信号。但外资的买盘本身就是那天成交量的一部分——涨跌和买超其实是同一件事被算了两次。这篇把三大法人买卖超的官方口径、值域级距,以及三个最常被误读的地方,用实测数字一次讲完。
三大法人买卖超是台湾证券交易所每个交易日公布的一组数字,内容是外资及陆资、投信、自营商三类法人当天的买进金额(或股数)减去卖出金额(或股数)。正值代表这类法人今天净买进,负值代表净卖出。
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 看:大盘三大法人、个股筹码。