Stock screener

The stock screener under Research → Stock screener filters the fundamentals DB (mainly S&P-500) for candidates matching your wheel criteria. It applies no additional filter and makes no suggestion — the app only shows what fits the conditions you set.

Filters

  • Price min/max: NULL prices (missing in the DB) are filtered out.

Min=10 / Max=200 are the desktop defaults.

  • Dividend yield min/max: Min=0 means "no lower bound". NULL is

treated as "no dividend" and does not fall through the max bound.

  • P/E min/max: NULL tolerated (loss quarters). Min=0 = no lower

bound.

  • Min market cap: empty = no lower bound.
  • Exclude earnings (days): symbols with earnings within X days are

hidden (premium spike plus assignment risk).

  • Sectors: picking a single sector is enough as a filter. Empty =

all sectors.

  • Only symbols with upcoming dividend: exact existence check against

the dividend calendar.

  • Show all S&P-500: raises the hit limit to 500. The numeric bounds

keep applying.

Sort order

Default is PRS score descending (Put-Ready score, 0..100). The five components are:

  • Dividend max 25
  • Price sweet spot 30..150 USD max 20
  • Wheel bonus (beta + market cap) max 15
  • IV share max 40 — comes with the option-chain integration; until

then the slot stays empty and 60 points is the practical maximum.

Result row

Each row shows symbol, company name, sector, market cap, price, beta, P/E, dividend yield, next earnings and ex-div dates plus a watchlist star and a jump into the option chain.

Price freshness

Next to the price a small ⟳ button appears. Clicking it pulls the current price via your user gateway (yfinance snapshot) and updates the cell right away. Below the price the app prints the age of the value ("3h ago").

Data source note: the price comes from Fundamentals.price, i.e. the last yfinance refresh of the fundamentals DB. The company tab (Research → Companies → {symbol}) shows the same value in the header and adds a market-data card with market_metrics.last_close below it. Both stay identical until a manual refresh is triggered.

Capital binding + traffic light

The Capital binding column gives a rough estimate of the capital a single contract would tie up:

Capital binding = Price × 100
NLV share       = Capital binding ÷ Net-Liquidation-Value

The chip colour comes from your strategy fields. The chip uses a compact short form (↑ X % / Y %, ~ X % / Y %, ✓ X % / Y %) so the "Chain" column on the right stays visible. Hover any chip (or the header info badge) for the full-length explanation:

  • green (✓) – NLV share below half of per_symbol_cap_pct

("Within strategy cap").

  • yellow (~) – NLV share between half and full

per_symbol_cap_pct ("Near symbol cap").

  • red (↑) – NLV share ≥ per_symbol_cap_pct ("Capital exceeds

symbol cap").

  • red with extra line – additionally above

post_assignment_symbol_cap_pct ("+ post-assign Z %").

Additional sector-concentration line (phase 2, 02.08.2026):

The chip shows a second warning when the hypothetical capital binding would push the sector weight above your sector warn / hard limits. Basis: current sector share from your portfolio (getPositions -> shares x price + short PUTs x strike x 100) plus the percentage in the current row.

  • yellow – hypothetical sector concentration >= sector_warn_pct

(default 20 %).

  • red – hypothetical sector concentration >= sector_max_pct

(default 30 %).

Both values come from your strategy profile ("Strategy" panel in the cockpit).

If NLV is missing (no linked account, gateway offline), the cell only shows the absolute binding plus the note "NLV share unavailable" — without a red flag, so no false alarms.

The chip is purely informational: no filtering, no blocking. Rows with a red chip stay in the result list for further inspection.

Empty state

After the first click on Start screening, the backend returns hits from the fundamentals DB. If the result set is empty, the current filter combination is listed below the table with price, P/E, dividend and earnings limits — the most common cause is a too-narrow price range or a search that has not yet been expanded to the full S&P-500.