TL;DR: The Multi-Factor Screener (/vip/screener) lets you compose conditions across 5 dimensions — financial health, relative valuation, momentum, volatility, market cap — and run to get a filtered stock list. Each factor expands to show its threshold and calculation. The tool for "compose your own filter recipe."
Concepts
Why Use a Screener?
If you already have a concrete idea — "I want PE < 15, ROE > 15%, low-vol mid caps" — manually checking 2,000 stocks is impossible. The screener automates that filtering.
Screener vs Leaderboard:
- Leaderboard: A fixed-sort list (e.g. "top 100 by foreign net buy")
- Screener: You set conditions, the system filters out the rest
The 5 Filter Dimensions
| Dimension | Measures | Common Factors |
|---|---|---|
| Financial Health | Is the company healthy? | Altman Z (bankruptcy), Piotroski F (composite), gross margin, ROE |
| Relative Valuation | Is the price reasonable? | P/E percentile, P/B percentile, EV/EBITDA, dividend yield |
| Momentum | Short-/mid-term trend strength | 60-day momentum, RS (relative strength), distance to 52-week high |
| Volatility | Risk level | Annualized vol, Beta, max drawdown |
| Market Cap | Size category | Absolute market cap, liquidity (20-day avg volume) |
Absolute Value vs Percentile?
Both available, situational:
- Absolute (e.g. "P/E < 15"): Intuitive but ignores sector differences — financials rarely above 15, tech rarely below 15. One threshold across sectors creates bias
- Percentile (e.g. "P/E below historical P30"): Auto-adjusts for sector and stock-specific history, fairer, but needs ≥5 years history to stabilize
Beginners should default to percentile; veterans mix.
Hands-on: Reading It on CTSstock
Open /vip/screener. Three areas:
- Left panel: 5 dimensions, each with selectable factors and conditions
- Center: Filtered stock list with key metrics
- Top-right Run button: Executes the filter (data is precomputed; near-instant)
4 Strategy Examples
Strategy 1: Value (cheap good companies)
Financial Health: Altman Z > 2.99 (safe zone)
Financial Health: Piotroski F >= 7 (high composite)
Relative Valuation: P/E historical P30 or below (cheap)
Relative Valuation: Dividend yield > 3% (cash return)
Expected: financials and traditional industries; few growth stocks. Suits long-term hold.
Strategy 2: Momentum Growth (riding strong uptrends)
Momentum: 60-day momentum > +20%
Momentum: RS > 80
Financial Health: Revenue YoY > 15%
Volatility: Annualized vol < 40% (avoid wild names)
Expected: small/mid-cap growth names that just broke out. Pair with strict stop-loss (use the alert system's "Sharpe < 0" as red flag).
Strategy 3: Low-Vol Defensive (avoid wild swings)
Volatility: Annualized vol < 25%
Volatility: Max drawdown > -20% (no >20% decline in past year)
Financial Health: ROE > 10%
Market Cap: > 50B NTD
Expected: large-cap blue chips, sector leaders. Suits conservative allocation.
Strategy 4: Oversold Bounce (short-term contrarian)
Momentum: 60-day momentum < -25% (sharp decline)
Financial Health: Altman Z > 2.99 (no bankruptcy risk)
Relative Valuation: P/B historical P20 or below (cheap on book)
Volatility: 20-day avg volume > 10M shares (liquid enough to exit)
Expected: fundamentally sound stocks oversold by mistake. Must verify the alert system shows few red flags.
Reviewing Filter Results
After running, don't take the list at face value. Recommended flow:
- Check the count. 100+ means conditions too loose; <5 means too strict
- Click into any stock's Insights tab to see overall 4-engine state
- Check alerts for excessive red flags
- Check institutional flows for recent buying/selling
- Only after passing all 4 should the stock enter your watchlist
FAQ
Q: More factors = better?
No. Too many factors drives the result count to zero (over-fitting). Use 4–6 factors per filter, spread across at least 3 dimensions.
Q: My results don't match my intuition. Why?
Common causes:
- Wrong dimension assignment — e.g. "ROE > 15%" set under valuation (it belongs to financial health)
- Percentile vs absolute confusion — "P/E < 15" and "P/E P30 or below" yield very different lists
- Insufficient history — stocks listed less than 1 year can't compute the 252-day percentile and get excluded
Q: Can I export results?
Not currently in the UI. For now, screenshot or manually copy. CSV export is on the roadmap.
Q: Why do some listed stocks never appear?
Two filters are on by default:
- Liquidity filter: 20-day avg volume < 100k shares = excluded (too illiquid to exit)
- New listing filter: Listed < 1 year = excluded (insufficient history for percentile-based factors)
Toggle them off in the panel to see the complete universe.