High Dividend Value Stocks
Consecutive dividends · Elevated yield · Quality screening
Strategy Logic
Consecutive dividends ≥ 5 years, 5-year dividend growth ≥ 0% (excludes tickers with cut dividends)
Current yield ≥ 2%, payout ratio ≤ 100% (supported by FCF or GAAP earnings)
AI quality score ≥ 70 (combining ROE, debt ratio, FCF stability, industry competitiveness)
Daily buy signal monitoring: current yield ≥ 4% or at 5-year historical percentile ≥ 90%
US stocks: evaluate Sell Put strategy for enhanced yield (combined annualized = option yield + dividend yield)
Pool refreshed weekly. Buy signals scanned daily — triggered by low price (high yield). Only tickers with active buy signals are shown, not the full pool.
Normal Filter System · Design Logic
Price Calculation System · Forward Dividend as Anchor
All prices are anchored to <strong style="color:var(--text-2);">Forward Dividend</strong> (current estimated annualized dividend), reverse-calculated using historical yield. When a company cuts its dividend, the floor price automatically moves lower (more conservative); when raised, it moves higher (reflecting the new dividend level).
Historical Peak YieldTrailing 12-month yield at month-end over 5 years, peak of all months (<em>including crash months, unfiltered</em>). Reflects the most extreme yield level historically observed.
Extreme Floor Price= Forward Dividend ÷ Historical Peak Yield. Price at this level means yield has hit the historical extreme. Anchored to Forward Dividend, reflecting "if the worst scenario repeats, the implied price for current dividends".
Golden Buy Price (p90)= Forward Dividend ÷ p90 yield (crash months excluded). Price when yield is at the 90th percentile of normal market distribution — an ideal entry point.
Normal Yield PercentilePosition of current yield in the past 5 years' <em>normal months</em> (crash months excluded) distribution. Percentile ≥ 90 means current price is in the historical low zone, triggering a buy signal.
Two-Layer Filtering Logic
Extreme
<strong>Unfiltered</strong> — Historical peak yield + extreme floor price use all months (including crashes). Purpose: capture true historical extremes so floor price is closer to the actual lowest point observed.
Normal
<strong>Crash months excluded</strong> (price ≤ p10) — Normal percentile, normal range (p10-p90), and golden buy price use filtered data. Purpose: remove black swan noise for more accurate "normal market" statistics.
Filter Mechanism · Three Steps
Price
Uses unadjusted raw prices as the yield denominator. Adjusted prices are reduced by cumulative dividends over the years (5 years of dividends at 3-5% = historical prices appear 15-25% lower), inflating historical yields.
Dividend
Special dividends (single payout > median × 3) and multi-year rollup records (> annualized dividend × 1.5) are excluded to prevent one-time special payouts or data vendor rollup errors from inflating calculations.
Crash Mo.
Calculate the 10th percentile of all monthly prices (price floor), exclude months below that threshold. COVID-style V-shaped crashes typically last 2-4 months, about 3-7% of 5-year history, within the 10th pct cutoff and completely removed.
What if there's no crash? Will it mis-filter?
10th pct filtering always removes the cheapest 6 months (5 years = 60 months). If there is no crash, these 6 months are just the normal low-price range; after removal:
Stable volatility stock ($80-$120)
p90 yield (golden price basis): <span style="font-family:'DM Mono',monospace;color:var(--text);">3.00%</span> vs actual <span style="font-family:'DM Mono',monospace;color:var(--text-3);">3.13%</span><br>Golden buy price ~<span style="font-family:'DM Mono',monospace;color:var(--green);">+4%</span> higher (more conservative)
Bias Direction
Floor estimate biases <strong style="color:var(--green);">higher</strong> (conservative), buy threshold slightly stricter.<br>Will not produce false buy signals from "misfiltering normal months" — only misses marginal extra gains at extreme lows.
For long-term uptrend stocks (e.g. from $50 to $100), the earliest 6 months get filtered. Their high yields reflect historical low prices, not currently achievable levels — filtering actually produces more accurate results.
Filtering Effect by Crash Type
| Crash Type | Duration (months) | % of 5 Years | Filter Effect |
|---|---|---|---|
| V-shaped crash (COVID-style) | 2–3 | ~4% | Fully removed |
| Short bear market | 6 | 10% | Mostly removed |
| Long bear market (2008-style) | 12–18 | 20–30% | Lowest 6 months removed |
| No crash (normal volatility) | — | — | Conservative bias ~4% |
In a long bear market (2008 crisis, ~18 months), the 10th-pct filter only removes the most extreme 6 months. Remaining low-price months stay in the distribution — they reflect real market conditions, not anomalous noise.
5-year lookback window rolls forward. The 2020 COVID crash has slid out of the window after March 2025 and no longer affects current calculations.<br>Extreme layer (historical peak yield, extreme floor) uses full data; normal layer (percentile, p10-p90 range, golden buy price) uses crash-filtered data. The two layers are independent and do not interfere.
Buy Strategy Recommendation
When a ticker triggers a buy signal, the system recommends one of two entry strategies based on option availability and yield comparison.
1
<strong>Price ≤ Golden Buy Price</strong> → recommend <strong style="color:var(--green)">Spot</strong>. Price is already at or below the ideal entry — buy shares directly to lock in the high yield.
2
<strong>No option market</strong> (HK stocks, small-caps) → recommend <strong style="color:var(--green)">Spot</strong>. Options are not available for this ticker.
3
<strong>Option illiquid</strong> (bid-ask spread > 30%) → recommend <strong style="color:var(--green)">Spot</strong>. Wide spreads make option execution unreliable.
4
<strong>Sell Put blended APY > threshold × dividend yield</strong> → recommend <strong style="color:var(--amber)">Sell Put</strong>. Blended APY = option premium annualized + SGOV yield on idle cash. The threshold scales with DTE: <span style="font-family:'DM Mono',monospace">1.5×</span> at 60 days, rising to <span style="font-family:'DM Mono',monospace">2.0×</span> at 365 days (longer exposure → stricter bar). If below threshold, Spot is preferred.
Strategy Comparison
| Strategy | When Recommended | Income Source |
|---|---|---|
| Spot (Buy & Hold) | Default — price near golden, no options, or APY gap < 1.5× | Dividend yield only |
| Sell Put | Option liquid + blended APY ≥ 1.5× dividend yield | Option premium + SGOV yield + potential dividend if assigned |
The base 1.5× threshold is configurable and scales with DTE (1.5× at 60d → 2.0× at 365d). Sell Put strike is set at the Golden Buy Price — if assigned, you own the stock at the price you wanted anyway. The idle cash (strike × 100 per contract) earns SGOV yield while waiting.
Signal States on the Pool Page
Every stock in the active pool is labelled with one of three states on the /data/dividend-pool page. The label is a function of golden-price distance plus an absolute yield floor — it does not filter stocks out, it classifies them.
OPPORTUNITY
distance ≤ 0 (price at or below golden) AND (dividend yield ≥ 4% OR historical yield percentile ≥ P90). In other words: cheap enough AND either absolutely attractive yield or a historical-high yield level. Ready to buy.
NEAR
0 < distance ≤ 5% (price 0–5% above golden). Not yet a trigger; set a limit order at the golden price and wait for a pullback.
WATCHING
Everything else — distance > 5%, or no price data, or the yield floor isn't met. Keep the name on the radar, no action.
Two-layer funnel (universe → active pool → daily signals)
L1
L1 · Raw universe (~80 tickers, hand-curated in config.yaml): US blue-chip dividend payers, HK utilities/banks, A-share state-owned yield stocks.
L2
L2 · Weekly screening (runs every 7 days): requires ≥5 consecutive dividend years, non-negative 5y growth, yield ≥ 2%, quality score ≥ 70/100. Typically ~15–25 stocks survive.
L3
L3 · Daily signal classification (on every page load): each active pool member gets tagged Opportunity / Near / Watching based on current price vs. golden price + yield.
Live Price & Refresh Mechanism
The current price shown on the pool page is fetched on demand, not every time you open the page. This keeps signals trading-meaningful without burning API quota.
5-min cache · Opening the page reads the live_prices cache only — no API call. The header badge shows 'Live price HH:MM (N min ago)'.
Full-pool refresh · Clicking Refresh fetches all pool tickers in a single time-slice so distance/sorting/signals stay internally consistent. Per-ticker refresh is intentionally not offered (it would desync the ranking).
Multi-source voting · yfinance 1-min bar is the primary source; IBKR last-trade is added when the gateway is connected. With ≥2 sources, elect_value() takes the majority-cluster median; disagreement > 2% is logged.
Snapshot fallback · If no source responds (e.g. weekends, market closed, network), the page falls back to the weekly-scan snapshot and tags the price with a 'snapshot' badge. Signals are still computed but should be treated as stale.
Why no auto-refresh: dividend investing is long-horizon, not intraday. A 5-min manual TTL gives the accuracy needed to place a limit order without turning the page into a quote ticker.
Current Buy Signal Pool(14 tickers)
| Ticker | Current Yield | Latest Price | Quality Score | Payout Ratio | Type |
|---|---|---|---|---|---|
| PG | 2.9% | 148.18 | 91 | 62% | GAAP |
| CL | 2.5% | 84.65 | 85 | 54% | LLM |
| 2388.HK | 5.2% | 44.22 | 84 | 60% | GAAP |
| 600036.SS | 5.1% | 39.38 | 83 | 35% | GAAP |
| ABT | 2.8% | 91.13 | 82 | 67% | GAAP |
| MO | 6.3% | 66.88 | 82 | 76% | LLM |
| 0006.HK | 4.3% | 65.05 | 81 | 96% | GAAP |
| 0762.HK | 6.1% | 7.26 | 80 | 65% | GAAP |
| 1398.HK | 4.2% | 7.26 | 78 | 31% | GAAP |
| VZ | 6.1% | 46.38 | 78 | 50% | GAAP |
| 0002.HK | 4.2% | 75.40 | 78 | 276% | FCF |
| 0939.HK | 4.4% | 8.95 | 77 | 30% | GAAP |
| 0941.HK | 5.7% | 83.90 | 76 | 76% | GAAP |
| 0003.HK | 4.8% | 7.26 | 75 | 116% | GAAP |
PG
2.9%
Latest Price
148.18
Quality Score
91
Payout Ratio
62%
CL
2.5%
Latest Price
84.65
Quality Score
85
Payout Ratio
54%
2388.HK
5.2%
Latest Price
44.22
Quality Score
84
Payout Ratio
60%
600036.SS
5.1%
Latest Price
39.38
Quality Score
83
Payout Ratio
35%
ABT
2.8%
Latest Price
91.13
Quality Score
82
Payout Ratio
67%
MO
6.3%
Latest Price
66.88
Quality Score
82
Payout Ratio
76%
0006.HK
4.3%
Latest Price
65.05
Quality Score
81
Payout Ratio
96%
0762.HK
6.1%
Latest Price
7.26
Quality Score
80
Payout Ratio
65%
1398.HK
4.2%
Latest Price
7.26
Quality Score
78
Payout Ratio
31%
VZ
6.1%
Latest Price
46.38
Quality Score
78
Payout Ratio
50%
0002.HK
4.2%
Latest Price
75.40
Quality Score
78
Payout Ratio
276%
0939.HK
4.4%
Latest Price
8.95
Quality Score
77
Payout Ratio
30%
0941.HK
5.7%
Latest Price
83.90
Quality Score
76
Payout Ratio
76%
0003.HK
4.8%
Latest Price
7.26
Quality Score
75
Payout Ratio
116%