How to Use Institutional Net Buy/Sell

What each of the three institution types actually does, how big is big, and three misreadings that measured data takes apart.

Last updated 2026-09
Key Takeaways
  • Institutional net buy/sell = the day's buys minus sells for foreign and mainland investors, investment trusts, and dealers. TWSE publishes it the same afternoon after the close: the market-wide report (BFI82U) in TWD, the per-stock report (T86) in shares.
  • Close to eight tenths of the dealer column is hedging: over the last 60 trading days (2026-06-24 to 2026-09-16), hedging was 78.0% of dealer turnover, and the median hedging share of absolute dealer net was 76.6%.
  • Foreign net buy/sell moves with the same day's index change (r=+0.773) and has almost nothing to do with the next day (r=+0.097, n=230) — the same-day correlation is mechanical, not predictive.
  • The three institution types often disagree: over 2025-09-17 to 2026-09-16, foreign investors and investment trusts pointed the same way on only 47.5% of trading days, and all three agreed on only 32.6% (n=242).
  • How big is big? Over 2025-09-17 to 2026-09-16 the median absolute daily foreign net was 262 and it took more than 757 to reach the top 10% (unit: 100M TWD, n=242).

The index rose on a day foreign investors bought, so you think you found a signal. But their buying is itself part of that day's turnover — the move and the net buying are the same event counted twice. This article covers the official definition of institutional net buy/sell, its real range, and the three places it is most often misread, all with measured numbers.

What is institutional net buy/sell?

Institutional net buy/sell is a set of numbers the Taiwan Stock Exchange publishes every trading day: the amount (or share count) bought minus the amount (or share count) sold that day by three types of institution — foreign and mainland investors, investment trusts, and dealers. A positive value means that type was a net buyer; a negative value means a net seller.

TWSE defines the three types by who they are, not by what they do (report footnotes, verbatim, retrieved 2026-09-17):

InstitutionTWSE definition (verbatim)
Dealers"Dealers means securities dealers' proprietary accounts."
Investment trusts"Investment trusts means domestic securities investment trust funds."
Foreign and mainland investors"Foreign and mainland investors means investors registered under the Regulations Governing Investment in Securities by Overseas Chinese and Foreign Nationals and the Regulations Governing Investment in Securities and Futures Trading in Taiwan by Mainland Area Investors."

Two reports, two units

The market-wide institutional trading value report (BFI82U) returns 6 rows and is denominated in TWD; the per-stock daily institutional report (T86) discloses every listed stock and is denominated in shares (a live call on 2026-09-15 returned 15,840 stocks). One of BFI82U's 6 rows is foreign dealers on its own; in Blave's data series that row has been 0 every day since 2024-08-16.

Note: BFI82U and T86 both cover the listed (TWSE main board) market only. When the media says "foreign investors bought XXX today," that is usually this number; OTC institutional flows come from a separate TPEx report.

Does this number get revised after the fact?

No. TWSE spells it out in the report footnotes:

"This statistic covers regular, odd-lot, after-hours fixed-price and block trades, and excludes auctions and tenders."
"This information is compiled from the day's original trade records and is not restated for brokers' reported booking errors or account corrections."

In other words, institutional net buy/sell is a snapshot of original trades, and it is not revised afterwards for booking corrections. That is the exact opposite of margin balance — the lenders behind margin balance are still adjusting their books the next day, and TWSE explicitly says to use the "previous-day balance" (see How to Use Margin Balance). Both are flow-of-funds data, but the two have different data properties, so research should not treat them the same way.

Publication is the same afternoon after the close. TWSE's own pages do not commit to a fixed clock time, so this article does not quote one to the minute.

How big is big? The range over 2025-09-17 to 2026-09-16

Distribution of daily net amounts, in units of 100M TWD. Window 2025-09-17 to 2026-09-16, n=242, from Blave's institutional data series (listed market):

Institution p05p25 Median p75p95 Mean Net-buy days
Foreign−892.6−377.0−52.3+165.2+603.3−86.243.8%
Investment trusts−77.0−20.0+14.6+71.0+160.9+27.659.9%
Dealers−301.1−104.9−14.3+60.5+153.3−34.647.1%
Total−1,077.3−380.7−45.4+227.0+683.8−93.146.3%

To answer "is today's number big," the absolute-value brackets are more useful than the sign (same window, n=242):

Institution (100M TWD) Median absolute p80p90p99 Period max
Foreign2625457571,3401,883
Investment trusts4288135267383
Dealers75156206548822

A daily foreign net around 260 (100M TWD) is routine; it takes more than 757 to crack the top 10% of this window. Investment trusts run a bracket smaller, with a median of just 42 — measure all three institution types with the same yardstick and a big move by the trusts looks like nothing at all.

The key point: the dealer column is not "dealers turning bullish"

Most people reading institutional data treat the dealer net as a directional call by brokers' proprietary desks. But TWSE splits dealers into two separately disclosed columns, "proprietary" and "hedging," and the second is far larger than the first.

Measured over the last 60 trading days (TWSE BFI82U pulled day by day, 2026-06-24 to 2026-09-16, n=60):

ObservationValue
Hedging share of dealer turnover (buys + sells)78.0%
Hedging net as a share of absolute dealer net (daily median)76.6%
Average daily hedging turnover vs proprietary769 vs 218 (100M TWD)
Average net over the periodHedging −81.1/day, proprietary −8.3/day (100M TWD)
Days pointing the same way / daily correlation73.3% / r=0.716

Put differently, close to eight tenths of the "dealer net buying" you see comes from the hedging column. Read together, hedging dominates the number without fully determining it (r=0.716) — to read dealer direction at all, you have to look at the two columns separately.

Note: TWSE only discloses hedging and proprietary separately; it never defines in any report footnote what causes the hedging positions. The popular claim that "hedging = warrant market making" has no official wording we could find, so this article does not make it. What you can be sure of is the size ratio, not the motive behind it.

Do foreign + trusts + dealers add up to "Total"?

No. Add the foreign, investment_trust and dealer columns together and the result will not match the "institutional total" in the news — and you did not do the arithmetic wrong.

TWSE's official total is the sum of four items: foreign and mainland investors (excluding foreign dealers) + investment trusts + dealers (proprietary) + dealers (hedging); the foreign-dealer column is not counted in the official total. Blave's API, however, folds foreign dealers into its dealer column, so the three-column sum = the official total + that day's foreign-dealer net.

Take the whole market on 2019-06-03 (FinMind raw data, in TWD):

ItemNetIn official total
Foreign and mainland investors+4,256,940,836Yes
Investment trusts−470,794,770Yes
Dealers (proprietary)+234,212,750Yes
Dealers (hedging)−634,731,645Yes
Foreign dealers−1,635,530No
Official total+3,385,627,171Sum of the four above

The first four items sum to the official total exactly; what is left out is that −1,635,530 of foreign dealers — and that sits inside Blave's API dealer column. Across 2018–2024 there are 1,553 trading days where the three-column sum does not match the official total; since 2024-08-16 the column has been 0, so the recent gap is zero, but the gap over the historical range is real.

So to match the news or the official release, read the total column directly instead of summing the three yourselftotal is the official total, not a sum of the other columns. For recent data only, both methods agree; if your window reaches back before 2024, or you want foreign dealers broken out on their own, go back to the raw BFI82U report, where it is a row of its own and for which Blave's API has no matching column.

Note: this is a gap between Blave's definition and the official one, not a problem with the data source. FinMind discloses foreign dealers as a separate field and its total excludes that field too, in line with TWSE; folding it into dealer is Blave's own convention. When you use this data for research reaching back before 2024, account for the difference yourself.

Foreign investors bought — will it rise tomorrow?

High correlation the same day, close to a coin flip the next. This is the one thing to take away from this article.

Window 2025-09-17 to 2026-09-16, correlation of net buy/sell with TAIEX returns, n=230 (the correlation sample is 12 days shorter than the 242 in the range table because the index data is missing 12 trading days; do not mix the two sample sizes):

Seriesr vs same-day index returnr vs next-day index return
Foreign+0.773+0.097
Investment trusts+0.119+0.004
Dealers+0.716+0.003
Total+0.824+0.079

The same-day correlation is mechanical: institutional buying is itself part of that day's turnover, so a rising price and institutional net buying are two ways of recording one event. The question worth asking is about the next day, and there the correlation is down to +0.097.

Hit rate says the same thing: after a foreign net-buy day the index rose the next day 59.0% of the time (n=100), after a net-sell day 52.7% (n=129), against a full-sample base rate of 55.5%. The gap is real, but stretch the sample to 5 years (n=1,200) and it narrows to 56.4% vs 54.4% (base 55.3%). And the next-day average return is actually higher after net-sell days — +0.286% after selling versus +0.256% after buying. Slightly better hit rate, slightly worse average return: the two cancel out.

Read the three separately, or read the "Total"?

Separately. Over the same window (2025-09-17 to 2026-09-16, n=242) the three rarely point the same way:

ObservationValue
Days foreign investors and trusts pointed the same way47.5%
Days foreign investors and dealers pointed the same way75.2%
Days all three pointed the same way32.6%
Days "Total" points against foreign investors9.9%
Foreign share of absolute institutional net (median weight)67.4%
Foreign share of institutional turnover (buys + sells)83.7%

"The institutions are buying" is not one thing in the data — all three point the same way on only a third of days. And "Total" is essentially the shadow of foreign investors: they account for 83.7% of institutional turnover, and on only 9.9% of days does the total point against them. You think you are reading a consensus of three institutions; nine times out of ten you are reading one of them.

How to put it into a strategy

1. Fetching: market-wide and per-stock are two different layers

The market-wide layer is in currency, the per-stock layer is in shares, and the field names differ too — mixing them computes the wrong thing.

from lib.data import fetch_twmarket_institutional, fetch_twstock_institutional

# Market-wide: unit is TWD, fields foreign / investment_trust / dealer / total, from 2004-04-07
mkt = fetch_twmarket_institutional('2025-09-17', '2026-09-16', headers)

# Per-stock: unit is shares, buys and sells in separate columns; lib gives you foreign_net directly
df = fetch_twstock_institutional('2330', '2025-09-17', '2026-09-16', headers)
foreign_net = df['foreign_net']   # foreign shares bought − shares sold

The per-stock layer also gives you the split fields: dealer proprietary (dealer_self_*) and hedging (dealer_hedge_*) are separate, so the "strip the hedging out" judgement from the section above is available at the per-stock layer.

2. Use it as a condition, not as a signal

The practical use is to turn "are the institutions moving big today" into a testable condition that gates your own primary signal, rather than entering and exiting on it directly.

# brackets from absolute daily foreign net quantiles over 2025-09-17 to 2026-09-16: p50 262, p90 757 (100M TWD, n=242)
BIG = 75_700_000_000          # TWD; this is the data's bracket, not a backtested parameter

big_buy = mkt['foreign'] > BIG
signal = primary.copy()        # primary is your own main signal
signal[~big_buy] = 0.0         # no longs on days without big foreign buying

To be clear: this threshold is a distribution bracket, not a parameter validated by a backtest. It answers "where does today's number rank historically," not "will this make money" — only a backtest answers the second, and it has to avoid the trap of tuning parameters over and over on the same stretch of data (see How to Avoid Overfitting).

3. Parsing the official file yourself? Check the field order first

Note: T86's returned array has an ordering trap: 自營商買賣超股數 (the dealer total) comes before the three "proprietary" columns (index 11), while the proprietary group is buy → sell → net (index 12 / 13 / 14). Assuming the intuitive "proprietary first, then hedging, then total" shifts the whole group. Parse by field name, not by position.

Choosing the parameters and the timeframe

Institutional data is daily only, so there is no timeframe to tune; what you can choose is which layer to read and over how many days.

ApproachGood forWatch out
Market-wide daily netGauging the strength of index-level fund flowsListed market only; "Total" is 83.7% the shadow of foreign investors, so don't read it as consensus
Market-wide streaksDescribing states like "bought for N days running"Over 2025-09-17 to 2026-09-16: 49 net-buy streaks, 2.16 days average, 6 days longest; 50 net-sell streaks, 2.72 days average, 13 days longest (n=242) — a five-day buying streak is rarer than you think
Per-stock daily netPer-stock flow conditions and screening filtersUnit is shares; listed stocks come from T86, OTC from TPEx, and both are available
Per-stock split fieldsWhen you need hedging taken out of the dealer numberOnly the per-stock layer keeps the split fields

The examples here use the market-wide daily net for a simple reason: the range and correlation measurements were all made at that layer, so the thresholds line up. Move to the per-stock layer and the brackets have to be recomputed from that stock's own distribution.

An honest reminder: institutional net buy/sell is reference data, not a trading signal. Every number here is labelled with its window and sample size, and the samples talk: the correlation between foreign net buy/sell and the next day's index return is +0.097 (n=230), and over 5 years it is +0.053 (n=1,200) — close to zero. Any claim that translates "the institutions bought" straight into "it will rise tomorrow" does not stand up in this data. To build a strategy on it, use it as a condition, as a filter, and then backtest (for how to read a backtest report, see How to Read a Backtest).

Now that the definition is clear, the next step is turning it into a condition you can verify: ask Blave Agent to pull this data, write it into a filter, and backtest it for you — the data layer and the fields are already wired up, so you only have to say what you want tested. You can also see the market-wide and per-stock charts directly in Studio: market institutional flows, per-stock flows.