How many US companies clear each yield floor, with payout ratio and loss-makers
Answered against 22 years of US equities and 12 years of US options data and published with the query that produced it. This result is stored as of 2026-10-04, from Highest Dividend Yield US Stocks in 2026.
| yield_floor | companies | median_payout_ratio | pct_no_positive_eps |
|---|---|---|---|
| 2% and up | 514 | 59 | 7.6 |
| 3% and up | 321 | 75 | 9 |
| 4% and up | 198 | 92 | 11.1 |
| 5% and up | 118 | 102 | 15.3 |
| 6% and up | 74 | 110 | 13.5 |
| 8% and up | 32 | 112 | 9.4 |
| 10% and up | 18 | 139 | 11.1 |
| 15% and up | 6 | 714 | 16.7 |
- Rows × columns
- 8 × 4
- Computed
- Completeness
- No missing values
- Source
- US exchange, SIP and OPRA market data
- Licence
- Strasmore terms · free, no signup
What each column holds
| Column | Type | Range | Notes |
|---|---|---|---|
yield_floor |
text | 8 distinct values (10% and up, 15% and up, 2% and up…) | |
companies |
number | 6 to 514 | |
median_payout_ratio |
number | 59 to 714 | ratio or rate |
pct_no_positive_eps |
number | 7.6 to 16.7 | percent |
Computed from Strasmore's warehouse of US exchange, SIP and OPRA market data. Equity prices are delayed; options greeks and implied volatility are end-of-day. This result is stored, not recomputed on load — it is exactly the numbers that were returned on , and the query below is what returned them.
Run it yourself
This is the exact query behind the result above. Change a ticker, a date or a column and run it against the warehouse — no account, no key. The no-signup tier is smaller than the one this page was computed on; a query that reaches past it comes back saying which plan runs it.
WITH snapshot AS (
SELECT ticker,
toFloat64(dividend_yield) * 100 AS yield_pct,
toFloat64(dividend_yield) * toFloat64(price) AS annual_dividend,
toFloat64(earnings_per_share) AS eps
FROM global_markets.stocks_ratios
WHERE date = (SELECT max(date) FROM global_markets.stocks_ratios)
AND price >= 5
AND market_cap >= 2000000000
AND dividend_yield > 0
AND earnings_per_share IS NOT NULL
),
rungs AS (
SELECT arrayJoin([2, 3, 4, 5, 6, 8, 10, 15]) AS min_yield_pct
)
SELECT concat(toString(r.min_yield_pct), '% and up') AS yield_floor,
count() AS companies,
round(quantileDeterministicIf(0.5)(s.annual_dividend / s.eps * 100,
cityHash64(s.ticker), s.eps > 0), 0) AS median_payout_ratio,
round(100 * countIf(s.eps <= 0) / count(), 1) AS pct_no_positive_eps
FROM rungs AS r, snapshot AS s
WHERE s.yield_pct >= r.min_yield_pct
GROUP BY r.min_yield_pct
HAVING countIf(s.eps > 0) > 0
ORDER BY r.min_yield_pct
Work with this data in your AI assistant
Opens ready to query, with this page's data. Free, no account.