← Taiwan Stock Snapshot Database
Home / Indicator library / Cross-source screener
Screening

Two thousand tickers, two conditions, one honest count

A cross-source filter that asks for foreign institutional net buying and a cheap valuation percentile on the same day, and then tells you how many tickers it was actually able to look at. The second half of that sentence is the unusual part: most screeners return an empty table without mentioning that half the market was never in the search.

Try it

Set the minimum consecutive sessions of foreign net buying and the price-to-earnings percentile ceiling, then run it. The free tier runs one fixed demo screen and says so in the response; custom thresholds are a paid tier. The counts above the table are the scanned universe, not the whole market.

GET /v1/screener

Running the screen…
What we publish is data and tooling — not investment advice, not stock picks, and no promise of returns. Every figure is either an official public source reproduced as published, or a derivation we document well enough for you to recompute it. What you trade on it is your call. A screen result is a shortlist to research, not a position to take, and this particular combination showed no measurable edge when we tested it.

How it is built

Four steps. The second one is the reason this page exists in the form it does.

01

Intersect two panels rather than one ranked list

The screen asks for two things at once: the ticker has been bought net by foreign institutions for at least N consecutive sessions, and its price-to-earnings ratio sits in the cheapest X percent of the market cross-section on the latest frozen valuation panel. Both conditions have to hold on the same day. An AND filter across two independent sources is a much narrower thing than the union of two top-twenty lists, which is why the result counts are small.

02

Say how many tickers were actually scanned

The valuation panel and the institutional flow panel do not cover the same universe — the second is far smaller. Only the intersection can ever be screened, and the response reports all three counts on every call. An empty result means nothing matched inside the scanned set, and the page says so in those words. Reporting it as if the whole market had been searched would be the more comfortable wording and the false one.

03

Return the numbers that caused each hit

Every row carries the streak length and the price-to-earnings percentile that put it there, so the filter can be checked rather than trusted. A screen that returns only tickers is asking you to believe it.

04

Label it as a filter, not a signal

Our own backtest of this exact combination came out statistically indistinguishable from noise — the placebo test sat at p = 0.44. The endpoint is shipped anyway because narrowing two thousand tickers to a readable list is genuinely useful work, and the disclaimer travels in the response body rather than sitting in a footer somewhere.

Terms

Four terms carry the page:

ScreenerCross-source filter
In short: a set of conditions applied to the whole scanned universe at once, returning the tickers that satisfy all of them. It narrows where you look. It does not rank what is good.
Net buying streakConsecutive sessions
In short: the number of trading days in a row that foreign institutions have been net buyers of a ticker, counted back from the most recent session. Three days is a mild signal of accumulation; it is also three days, which is not very long.
Percentile cutCross-sectional rank
In short: a relative threshold instead of an absolute one. Below the thirtieth percentile means cheaper on price-to-earnings than seventy percent of the market on that day, which travels across market regimes better than a fixed multiple.
Scanned universeCoverage intersection
In short: the tickers that appear in both underlying panels. Anything outside it cannot be returned regardless of its numbers, which is why the count is printed above the table on every run.

Where the line is

The strong half: both inputs are official public data reproduced without adjustment, the percentile is a documented cross-sectional rank you could recompute from the same panel, and every returned row carries the two numbers that caused it to be returned. The scanned universe is reported on every call, so an empty table is a measurable statement rather than an ambiguous one.

The weak half, stated plainly: this particular combination does not work as a trading rule. We ran it as a factor internally and the placebo test came out at p = 0.44 with an information coefficient around zero, which means the historical returns of the selected names were indistinguishable from a random pick of similar stocks. It is published as a filter because narrowing a universe is a legitimate use of clean data, and because deleting a negative result is how a data tool quietly becomes a marketing instrument. If you want a screen with an edge, build it yourself from the endpoints and test it — that is what the API is for.

The coverage limit is the other honest constraint. The institutional flow panel is materially smaller than the valuation panel, so a large share of listed tickers cannot appear in any result no matter how well they score. That is a property of the dataset rather than of the companies, and it is printed above the table rather than buried here.

FAQ

Why does the screen often return nothing?

Because it is an AND filter across two panels of very different sizes. The valuation panel covers most listed tickers; the institutional flow panel covers far fewer, and only the intersection of the two can be screened at all. Requiring a multi-day foreign buying streak and a cheap valuation percentile on the same day, inside that intersection, is a genuinely rare event. The exact counts appear above the table on every run, so an empty result reads as what it is rather than as a claim about the market.

Is a hit a buy recommendation?

No. We backtested this combination internally and it produced no statistically significant excess return — the placebo test came out at p = 0.44, which is another way of saying the result is indistinguishable from chance. The tool is published as a way to narrow a research list, and the response carries that disclaimer in the body of every call rather than in small print.

What can I change on the free tier?

The free tier runs one fixed demo screen: a foreign net buying streak of at least one session, a price-to-earnings percentile below fifty, and up to ten rows. Custom thresholds and larger result sets are a paid tier. The response marks the demo run explicitly, so a script never mistakes the fixed parameters for the ones it sent.

How current are the numbers?

The valuation percentiles come from the latest frozen official valuation panel, and the institutional flows from the latest available trading session. Both follow official publication timing, which for Taiwan means the previous trading day in normal conditions. Nothing here is intraday.

Can I call this from code?

Yes. The endpoint is /v1/screener and it takes min_foreign_streak, max_per_pctile and limit as query parameters, so sweeping a grid of thresholds is a loop rather than a series of clicks. The response includes the scanned universe counts, which is what you want to log alongside an empty result.

Run it yourself

The free tier needs no signup — call this feature's API straight away with the demo key. Unlock as-of history and full ticker coverage on a paid tier.