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-11-01, from Highest Dividend Yield US Stocks in 2026.
| yield_floor | companies | median_payout_ratio | pct_no_positive_eps |
|---|---|---|---|
| 2% and up | 501 | 61 | 9 |
| 3% and up | 292 | 84 | 11.3 |
| 4% and up | 184 | 100 | 15.8 |
| 5% and up | 111 | 111 | 16.2 |
| 6% and up | 67 | 119 | 17.9 |
| 8% and up | 32 | 165 | 15.6 |
| 10% and up | 17 | 195 | 17.6 |
| 15% and up | 7 | 720 | 42.9 |
- 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 | 7 to 501 | |
median_payout_ratio |
number | 61 to 720 | ratio or rate |
pct_no_positive_eps |
number | 9 to 42.9 | 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.