Taiwan's Three Institutional Investors (三大法人) Explained for Quant Developers
Taiwan's three institutional investors — foreign investors (外資), investment trusts (投信) and dealers (自營商), collectively the 三大法人 — are the institutional buy/sell aggregates the Taiwan Stock Exchange publishes after every trading day in its T86 report. For each listed stock you get the net shares each group bought or sold that day. It is a clean, official daily signal — but it is aggregate net flow, not order-level data.
Who the three are
- Foreign investors (外資) — offshore institutions trading Taiwan equities (the largest and most watched group). Their net buying/selling is treated as a directional signal by most desks.
- Investment trusts (投信) — domestic Taiwanese fund houses (mutual funds). Often used as a 'local smart money' read, especially near quarter-end window-dressing.
- Dealers (自營商) — the proprietary and hedging books of brokerage firms. The smallest of the three and the noisiest, since a chunk is hedging rather than a directional view.
When and how the data is published
The Taiwan Stock Exchange publishes the T86 report after market close on each trading day (typically the same evening). It is one row per stock per trading day — end-of-day, not intraday. There is no live/streaming version of institutional flow; you get the settled daily figure once, after the session. For point-in-time correctness this matters: a signal computed 'as of' a given trading day should only use T86 rows whose publication time is on or before that day, otherwise you are peeking at flow that was not public when your model would have traded. Treat the flow for date D as knowable only after D's close.
How to read it — a real example
Query the institutional-flow dataset by symbol and date range. This is a real request and a real response row for TSMC (2330) on 2026-07-17:
curl "https://api.twmarketdata.com/v2/datasets/institutional-flow?symbol=2330&start_date=2026-06-01&end_date=2026-07-15" \
-H "X-API-Key: sk_live_..."
# One real response row (2330, 2026-07-17):
# {
# "symbol": "2330",
# "date": "2026-07-17",
# "foreign_net_buy_sell": -44183964.0,
# "investment_trust_net_buy_sell": 1488520.0,
# "dealer_net_buy_sell": 2759348.0,
# "total_institutional_net_buy_sell": -39936096.0,
# "source_role": "official_twse_t86"
# }The fields you actually use
- foreign_net_buy_sell — foreign investors' net shares (buy minus sell). Negative means net selling; on 2026-07-17 it was -44,183,964 for 2330.
- investment_trust_net_buy_sell / dealer_net_buy_sell — the same net-share figure for trusts (+1,488,520) and dealers (+2,759,348).
- total_institutional_net_buy_sell — the three summed (-39,936,096). source_role traces every row to the official TWSE T86 report.
- Common use: count consecutive days of foreign net buying, or rank stocks by trust net flow near quarter-end.
Build a signal: a foreign-buying streak
A simple, widely-used read is the foreign net-buying streak — how many consecutive trading days foreign investors have been net buyers of a stock. Sort the rows by date and count the run of positive foreign_net_buy_sell values; a break resets it. Because the flow for each day is only public after that day's close, the streak as of today uses data through the prior session, which keeps it point-in-time safe.
import requests
rows = requests.get(
"https://api.twmarketdata.com/v2/datasets/institutional-flow",
params={"symbol": "2330", "start_date": "2026-06-01", "end_date": "2026-07-15"},
headers={"X-API-Key": "sk_live_..."},
).json()["rows"]
streak = 0
for r in sorted(rows, key=lambda x: x["date"]):
streak = streak + 1 if r["foreign_net_buy_sell"] > 0 else 0
print("current foreign net-buying streak:", streak, "days")How the three are used in practice
The three groups are read differently. Foreign flow is the headline directional signal because foreigns hold the largest share of the free float in the large-cap names; a sustained foreign net-buy run in a stock like 2330 is watched closely. Investment-trust flow is read as domestic conviction and gets extra attention near quarter- and year-end, when funds are widely believed to shade positions for reporting (window dressing). Dealer flow is the noisiest of the three: a meaningful part is hedging against warrants and other book positions rather than a directional bet, so it is usually used as a secondary confirmation, not a standalone signal.
What this data does NOT tell you
The T86 figures are aggregate daily net flow, and it is worth being explicit about the gaps rather than letting a model assume them (these permanent limits are declared in /meta/boundaries):
- No order flow — you see one net number per group per day, not individual orders, order sizes, or intraday timing. Don't reconstruct microstructure from it.
- No foreign cost basis — the figure is net shares, not the price foreign investors paid or their average holding cost. You cannot infer their P&L or entry price from this dataset.
- It is net, not gross: a small net number can hide large offsetting buys and sells.
Common questions
1What are the 三大法人?
2When is the institutional flow data available each day?
3Is this order flow or tick data?
4Can I get foreign investors' average cost or entry price?
Want to query this data yourself? Create a free account.