本文是一次「用 Agent 从零搭建跨市场量化筛选管道」的完整实践复盘:覆盖数据源选型、指标口径设计、可视化对齐的数学推导,以及 44 只标的的筛选结果。
互动版报告(含 44 张双轴图表 + 阈值调节器):点击打开完整 HTML 报告
⚠️ 全文数据与判断仅为方法论演示,不构成任何证券买卖建议。
00 建设目标
要解决的问题
「找出股价处于历史低位、且分红持续稳定、股息率超过 5% 的股票」——这是一个看似简单、实际难以用现成工具完成的需求,卡点有三个:
- 跨市场:A 股、港股、美股三地,主流看盘软件的选股器互不相通,口径也不一致。
- 「持续稳定」无法用单一字段表达:所有平台给的都是当期股息率(TTM),但一个公司去年砍了一半分红、今年因为股价腰斩反而算出 8% 的股息率,这类标的会被排在最前面。
- 「历史低位」不等于便宜:低位往往是基本面恶化的结果,需要把价格位置与分红趋势放在一起判断,而不是分开看两个数字。
预期效果
| 目标 | 可验证的交付标准 |
|---|---|
| 覆盖面 | 三地市场各扫描 100+ 只候选,各产出十几只待选 |
| 可甄别陷阱 | 能自动区分「股价跌但分红涨」与「股价分红同步跌」 |
| 估值可比 | 每只标的给出 PE / PS / PB / 分红率,并标注失真情形 |
| 判断可视化 | 一张图内同时读出价格趋势、分红趋势、当时股息率水位 |
01 技术选型
业界方案
获取跨市场行情与分红数据,主流有四类路径,成本与可控性呈明显梯度:
| 类别 | 代表 | 覆盖市场 | 历史分红明细 | 成本 |
|---|---|---|---|---|
| 商业金融终端 | Wind / Bloomberg / Choice | 全球 | 完整 | 年费数万起 |
| 付费 API | Tushare Pro / AlphaVantage / Polygon | 单市场为主 | 较完整 | 按调用量计费 |
| 免费公开接口 | Yahoo Finance / AkShare / baostock | Yahoo 覆盖三地 | 有除息事件流 | 0 |
| 页面抓取 | 东方财富 / 雪球 / 同花顺 | 按站点 | 需解析 | 0,但易失效 |
自建方案
最终选择 Yahoo Finance 公开接口 + 本地 Python 计算,理由是它是唯一能用同一套代码同时覆盖三地市场的零成本方案(A 股 .SS/.SZ、港股 .HK、美股裸代码),且返回逐笔除息事件而非聚合后的股息率——这是判断「分红是否稳定」的前提。
| 维度 | 优点 | 缺点 |
|---|---|---|
| 覆盖 | 一套代码通吃三地,代码后缀即可切换 | A 股部分小盘股财务字段缺失 |
| 数据粒度 | 10 年月线 + 逐笔除息金额与日期 | 基本面只回溯 4 个财年 |
| 成本 | 零成本、无需注册 | 无 SLA,接口随时可能变更 |
| 可控性 | 指标口径完全自定义,可针对行业特例处理 | 需自行承担口径正确性 |
方案对比
| 方案 | 优点 | 缺点 | 本次是否采用 |
|---|---|---|---|
| 商业终端 | 数据权威、口径统一、有客服兜底 | 成本高;导出受限,难以脚本化批量处理 | 否 |
| 付费 API | 有 SLA,文档规范 | 多为单市场,跨三地需拼接多家、口径需二次对齐 | 否 |
| Yahoo 公开接口 | 零成本、跨市场、有除息事件流 | 接口不稳定(本次实测多个端点已被封禁),需自行兜底 | 是 |
| 页面抓取 | 可拿到平台加工后的成品指标 | 反爬、DOM 易变、维护成本最高 | 否 |
02 技术方案
整体拆成四层,每层只解决一件事:取数 → 算指标 → 视觉对齐 → 口径兜底。
2.1 取数层:可用接口的实测结论
Yahoo 的接口在近年经历多轮收紧,本次实测有效结论如下(对做类似工具的人应该最有参考价值):
| 端点 | 状态 | 说明 |
|---|---|---|
v7/finance/quote | ❌ Unauthorized | 已封禁 |
v10/finance/quoteSummary | ❌ Invalid Crumb | 需 cookie+crumb 握手 |
v8/finance/chart | ✅ 可用 | 行情 + 除息事件的主力来源 |
ws/fundamentals-timeseries | ✅ 可用 | 财务数据,无需 crumb |
行情与分红一次取全:
GET /v8/finance/chart/{symbol}?interval=1mo&range=10y&events=div|split
→ meta.regularMarketPrice 现价
→ events.dividends 逐笔除息金额 + 时间戳
→ indicators.quote[0].close 10 年月线收盘序列
财务数据用 timeseries,注意两个坑:只返回最近 4 个财年;返回数组顺序不固定,必须靠 meta.type[0] 判断类型而非下标。
GET /ws/fundamentals-timeseries/v1/finance/timeseries/{symbol}
?symbol={symbol}&type=annualTotalRevenue,annualDilutedEPS,
annualBasicAverageShares,annualStockholdersEquity&merge=false
→ result[i][type][j].reportedValue.raw
另外 quarterlyPeRatio / quarterlyPsRatio 这类现成估值字段返回空(只有 meta 无数据),PE/PS 必须自己算。
2.2 指标层:把「持续稳定」翻译成可计算的量
核心设计是不用单一股息率,而是把除息流按年聚合后,抽出四个正交指标:
| 指标 | 算法 | 作用 |
|---|---|---|
| 10 年区间分位 | (现价 − 10年最低) / (10年最高 − 10年最低) | 量化「历史低位」 |
| TTM 股息率 | 近 365 天除息金额之和 ÷ 现价 | 当期收益水平 |
| 削减次数 | 2020–2025 中「每股分红同比降幅 > 15%」的年份数 | 识别高股息陷阱的关键 |
| 派息 CAGR | 首尾年每股分红的复合增长率 | 分红趋势方向 |
其中「削减次数」是整个方案里最有价值的一个字段。只看股息率排序时,欧派家居、方大特钢、海螺水泥都会排在很前面;加上这个字段后立刻暴露——方大特钢每股分红从 1.1 元砍到 0.03 元,属于典型的分子萎缩型伪高息。
估值指标全部用「现价 ÷ 最新年报每股指标」的静态口径自行计算:
PE = 现价 ÷ annualDilutedEPS
PS = 现价 ÷ (annualTotalRevenue ÷ annualBasicAverageShares)
PB = 现价 ÷ (annualStockholdersEquity ÷ annualBasicAverageShares)
分红率 = 最近年度每股分红 ÷ EPS
2.3 视觉层:让两条线的交点自带语义
这是本次方案最值得单独说的一部分。需求是「股价折线 + 每股分红放在同一张图」,双 Y 轴的常规做法是各自 auto-scale,但那样两条线的相对位置没有任何含义——纯粹取决于两轴的缩放比例。
改进思路:让两轴保持同一线性映射,交点就自带语义。设阈值为 th(默认 6%),约束为:
y1.min = y.min × th
y1.max = y.max × th
此时对任意时点,分红点的相对高度为 (dv − lo·th) / (th·(hi − lo)),股价点为 (px − lo) / (hi − lo),两者相等当且仅当 dv / px = th。
结论:两条线的交叉点恰好等于阈值股息率,无需再画额外参考线。黄线在蓝线上方即「当时股息率 > 6%」,下方即「< 6%」。顶部滑块调整 th 时,44 张图同步重算。
推导过程中有两点容易想错:
- 不必强制 0 起点。第一版让两轴都从 0 起,虽然满足比例关系,但把高价股的价格波动压成了一条平线。实际上 0 起点只是充分条件,必要条件仅仅是上式的线性映射,起点可任意。改为「股价区间 ∪ 分红区间÷th」后,44 张图里 38 张变成非 0 起点,形态清晰得多。
- 阈值调低会导致分红线出框。若固定左轴上界,右轴上界
= max × th会随阈值变小而收缩,分红线被裁掉。实测阈值降到 3% 时有 69 张图出框。修法是存原始四个端点而非合成后的最大值,每次调阈值时用Math.max(pxHi, dvHi / th)现算上界。
2.4 兜底层:三类必须特殊处理的口径失真
指标算出来只是第一步,直接展示会误导。本次识别出三类必须显式标注的失真:
| 失真类型 | 成因 | 处理方式 | 命中标的 |
|---|---|---|---|
| PE 无意义 | 最新财年因大额减值转亏 | 回退到最近盈利年度并标注「参考」 | 领展、GIS、KHC、ARE |
| 分红率虚高至 130%–470% | REIT 的 EPS 含大额折旧摊销,本应看 FFO | 卡片加黄色警示条,说明口径不适用 | CCI、UHT、BFS、HIW、STWD 等 |
| 股息率 / 分红率虚高 | 当年含一次性特殊分红 | 展示逐年分红序列供交叉核对 | 五粮液 360%、和记电讯香港 6241% |
03 实施效果
3.1 量化交付
| 指标 | 结果 |
|---|---|
| 候选池扫描量 | A 股 187 只 + 港股 113 只 + 美股 265 只 = 565 只 |
| 最终入选 | A 股 15 + 港股 14 + 美股 15 = 44 只 |
| 入选者中 6 年零削减 | A 股 13/15、港股 9/14、美股 11/15,合计 33/44(75%) |
| 平均 TTM 股息率 | A 股 6.1%、港股 6.7%、美股 7.2% |
| 识别出的口径失真 | 11 处,全部显式标注 |
| 图表数量 | 44 张双轴联动图,1%–15% 阈值区间内比例误差 0、出框 0 |
3.2 筛选条件
- 低位:10 年月线区间分位 ≤ 50%(多数入选者 ≤ 20%)
- 高股息:TTM 股息率 ≥ 5%(A 股放宽至 4.5%,因整体水平偏低)
- 持续稳定:连续派息 ≥ 3 年,削减次数 0 者优先
3.3 各市场入选名单
A 股(15 只,按 10 年分位升序)
| 代码 | 名称 | 行业 | 股息率 | 10年分位 | PE | PB | 削减 | 评级 |
|---|---|---|---|---|---|---|---|---|
| 603833 | 欧派家居 | 家居 | 7.63% | 1.7% | 10.1 | 1.05 | 0 | 低 |
| 601186 | 中国铁建 | 基建 | 4.86% | 3.0% | 5.2 | 0.28 | 0 | 中 |
| 601668 | 中国建筑 | 基建 | 5.99% | 5.7% | 4.8 | 0.38 | 0 | 中高 |
| 600741 | 华域汽车 | 汽车零部件 | 6.26% | 7.5% | 7.0 | 0.75 | 0 | 中 |
| 000895 | 双汇发展 | 食品 | 5.81% | 9.6% | 16.9 | 4.05 | 1 | 高 |
| 000858 | 五粮液 | 白酒 | 6.77% | 15.2% | 33.0 | 2.47 | 0 | 中 |
| 002867 | 周大生 | 黄金珠宝 | 6.96% | 16.5% | 12.7 | 2.16 | 1 | 中 |
| 601818 | 光大银行 | 银行 | 5.74% | 16.9% | 5.3 | 0.34 | 0 | 中高 |
| 601098 | 中南传媒 | 出版 | 5.24% | 21.9% | 11.8 | 1.16 | 1 | 中高 |
| 601169 | 北京银行 | 银行 | 5.53% | 22.5% | 6.4 | 0.34 | 0 | 高 |
| 600970 | 中材国际 | 建材工程 | 6.08% | 28.6% | 7.2 | 0.90 | 1 | 中高 |
| 601318 | 中国平安 | 保险 | 5.06% | 34.3% | 7.2 | 0.94 | 0 | 中高 |
| 600887 | 伊利股份 | 食品 | 5.26% | 35.9% | 14.3 | 3.04 | 0 | 中高 |
| 601166 | 兴业银行 | 银行 | 5.81% | 38.3% | 5.7 | 0.46 | 0 | 中高 |
| 000651 | 格力电器 | 家电 | 7.38% | 41.5% | 7.8 | 1.55 | 1 | 中高 |
港股(14 只)
| 代码 | 名称 | 行业 | 股息率 | 10年分位 | PE | PB | 削减 | 评级 |
|---|---|---|---|---|---|---|---|---|
| 0384 | 中国燃气 | 城燃/公用 | 8.80% | 1.8% | 11.4 | 0.54 | 0 | 高 |
| 1193 | 华润燃气 | 城燃/公用 | 5.96% | 3.8% | 10.3 | 0.83 | 2 | 高 |
| 0874 | 白云山 | 医药 | 6.12% | 5.3% | 8.5 | 0.67 | 1 | 中 |
| 0390 | 中国中铁 | 基建 | 5.30% | 5.7% | 4.2 | 0.26 | 0 | 中 |
| 0215 | 和记电讯香港 | 电信 | 6.40% | 10.7% | 失真 | 0.62 | 1 | 中 |
| 1186 | 中国铁建 | 基建 | 7.49% | 11.2% | 3.9 | 0.21 | 0 | 中 |
| 2688 | 新奥能源 | 城燃/LNG | 6.39% | 11.5% | 8.8 | 1.10 | 0 | 中高 |
| 1052 | 越秀交通基建 | 高速公路 | 7.01% | 11.9% | 11.2 | 0.50 | 1 | 中高 |
| 0003 | 香港中华煤气 | 公用 | 5.13% | 14.0% | 22.6 | 2.14 | 0 | 高 |
| 0823 | 领展房产基金 | REIT | 6.47% | 14.1% | 5.7* | 0.68 | 1 | 中 |
| 0762 | 中国联通 | 电信 | 7.30% | 36.2% | 9.4 | 0.53 | 0 | 中高 |
| 0576 | 浙江沪杭甬 | 高速公路 | 7.11% | 36.5% | 7.1 | 0.75 | 0 | 高 |
| 2318 | 中国平安 | 保险 | 5.38% | 39.7% | 7.6 | 1.00 | 0 | 中高 |
| 3311 | 中国建筑国际 | 基建 | 7.44% | 41.1% | 4.8 | 0.55 | 0 | 中高 |
美股(15 只)
| 代码 | 名称 | 行业 | 股息率 | 10年分位 | PE | PB | 削减 | 评级 |
|---|---|---|---|---|---|---|---|---|
| CCI | Crown Castle | 通信 REIT | 5.63% | 0.0% | 74.8 | — | 1 | 中 |
| TU | Telus | 电信 | 12.34% | 0.8% | 18.8 | 1.31 | 0 | 中高 |
| KHC | Kraft Heinz | 食品 | 6.32% | 4.1% | 11.2* | 0.72 | 0 | 中 |
| CMCSA | Comcast | 媒体/宽带 | 5.12% | 4.3% | 4.7 | 0.94 | 0 | 高 |
| ARE | Alexandria RE | 生命科学 REIT | 7.00% | 5.1% | 27.6* | 0.55 | 0 | 中高 |
| CPB | Campbell's | 食品 | 6.77% | 5.5% | 11.5 | 1.76 | 0 | 中 |
| GIS | General Mills | 食品 | 6.61% | 5.6% | 9.0* | 2.69 | 0 | 中高 |
| UHT | Universal Health Realty | 医疗 REIT | 6.98% | 7.7% | 33.6 | 3.87 | 0 | 高 |
| PFE | Pfizer | 医药 | 6.43% | 9.7% | 19.7 | 1.76 | 0 | 中高 |
| UPS | UPS | 物流 | 6.28% | 16.0% | 15.9 | 5.47 | 0 | 中 |
| KRC | Kilroy Realty | 办公 REIT | 5.69% | 19.1% | 16.4 | 0.83 | 0 | 中 |
| BFS | Saul Centers | 零售 REIT | 6.94% | 22.1% | 31.2 | 2.67 | 0 | 中高 |
| SNY | Sanofi | 医药 | 5.57% | 27.7% | 13.6 | 1.49 | 0 | 高 |
| STWD | Starwood Property | 抵押 REIT | 11.67% | 38.9% | 14.3 | 0.85 | 0 | 中 |
| HIW | Highwoods | 办公 REIT | 6.36% | 39.2% | 21.7 | 1.43 | 0 | 中高 |
标 * 者为最新财年亏损、PE 取最近盈利年度参考值。
3.4 结构性发现
把 44 只标的横向对照,有几个不看数据不会注意到的现象:
- 高股息集中在三个板块,且成因完全不同。港股是城燃 / 基建 / 高速(接驳费下滑但顺价修复中);A 股是银行 / 基建 / 食品饮料(估值压缩);美股是包装食品(GLP-1 减肥药冲击)+ 办公与生命科学 REIT(空置率上升)。同样 6% 的股息率背后是三套完全不同的风险。
- 本轮高股息主要由「股价下跌」而非「分红增长」推动。把阈值调到 5% 可以看到,绝大多数标的的分红线是在近两年才刚刚越过股价线的。以中国建筑为例:2017-02 股价 6.57 元、股息率仅 2.34%;2026-08 股价 4.54 元、股息率 5.99%——分红从 0.15 涨到 0.27(分子在涨),但股息率翻倍主要来自分母腰斩。
- 分红率已进危险区的有 5 只:双汇发展 95%、伊利股份 92.9%、中国燃气 100%、香港中华煤气 116%、UPS 100%。盈利再降一档就必须砍分红。
- 分红安全垫最厚的是 Comcast:PE 4.7、PS 0.74,分红率仅 22.6%,自由现金流覆盖分红 3 倍以上。它同时处在 10 年区间 4.3% 分位。
- 估值最便宜的一批集中在中资基建:港股中国铁建 PE 3.9 / PB 0.21、中国中铁 PE 4.2 / PB 0.26,A 股中国建筑 PE 4.8 / PB 0.38。核心变量都是化债推进后的应收账款回款。
- BDC / mREIT 的两位数股息率不可与实业横比。这类标的分红来自利息收入,NAV 会随信用周期缩水,本质是不同的风险收益结构,报告中已单独标注行业。
3.5 验证方式
图表的正确性没有靠肉眼确认,而是用几何断言:取两条线的真实像素坐标,与算出的股息率做交叉校验。
const yPx = ch.scales.y.getPixelForValue(px); // 像素 y 越小越靠上
const yDv = ch.scales.y1.getPixelForValue(dv);
(yDv < yPx) === (dv / px * 100 > threshold) // 必须恒为 true
在 1% / 3% / 6% / 12% 四档阈值下遍历全部 44 张图,比例误差 0、几何断言错 0、出框 0。
这里踩过一个断言本身的坑:初版在 6% 档报了 2 处错,追查发现是中国铁建 2025-08 与越秀交通 2021-05 的股息率恰好等于 6.000000%,两条线像素完全重合——这正是「交点」的定义,是断言用了 >= 未处理边界,实现本身无误。
04 演进方向
| 方向 | 具体做法 | 解决什么 |
|---|---|---|
| 用 FFO 替代 EPS 处理 REIT | 接入 annualDepreciationAndAmortization,算 FFO = 净利润 + 折旧摊销 − 资产处置收益 | 本次 8 只 REIT 的分红率只能标注「不适用」,无法真正评估其安全性 |
| 剔除特殊分红 | 识别单笔金额显著偏离历史中位数的除息事件,拆分为「常规 + 特殊」两条序列 | 五粮液、江铃汽车、白云山的股息率目前会虚高 |
| 补充自由现金流覆盖率 | FCF ÷ 分红总额,替代 EPS 口径的分红率 | 分红的真实来源是现金而非会计利润,UPS 这类高资本开支公司差异明显 |
| 接入股息率历史分位 | 逐月计算股息率序列,给出「当前股息率处于近 10 年 X% 分位」 | 比价格分位更直接地衡量「便宜程度」 |
| 定时重跑 + 变更告警 | 用定时任务周跑,对「削减次数增加」「分红率突破 90%」触发提醒 | 目前是一次性快照,无法感知分红政策变化 |
| 数据源冗余 | Yahoo 为主,AkShare(A 股)+ 港交所披露易做交叉校验 | 本次已实测 2 个端点被封禁,单一数据源有断供风险 |
附录
互动版报告
全球高股息 · 历史低位股筛选(完整 HTML,含 44 张双轴图表与阈值调节器)
报告内每只标的包含:PE / PS / PB / 分红率、10 年区间分位、距 10 年高点跌幅、削减次数、派息 CAGR、逐年分红序列、双轴联动图,以及低位证据与发展预期的定性分析。顶部滑块可调整股息率阈值,全部图表同步响应;鼠标悬停任意时点可读出该时点的收盘价、每股分红绝对值与当时股息率。
数据来源
- 行情与除息事件:Yahoo Finance
v8/finance/chart - 财务数据:Yahoo Finance
ws/fundamentals-timeseries - 数据截止:2026-08-10
- 图表库:Chart.js 4.4.1
免责声明
本文所有数据取自公开接口,定性判断基于公开资料整理,可能存在滞后或错误。文中提及的所有标的仅为方法论演示样本,不构成任何证券买卖建议。「历史低位」仅为价格统计位置,不代表估值便宜——低位往往对应基本面恶化。投资决策及风险请自行判断与承担。
