红利股息率大全 · 望京博格版
> 作者:望京博格 | 数据来源:Wind(需在 AI 平台配置 Wind MCP)
一次跑出两张榜单图:
| 图 | 内容 | 列 |
|---|---|---|
| 图1 | A股红利指数股息率 TOP15 | 指数名称 / 最新股息率 / 跟踪ETF(费率最低) |
| 图2 | 港股红利指数股息率 TOP15 | 指数名称 / 名义股息率 / 税后股息率 / 跟踪ETF(费率最低) |
两张图顶部都有一张摘要卡:榜单平均股息率 / 10年期国债 / 差值(pp)。
硬规则:没有 ETF 跟踪的指数一律剔除。 剔除后不够 15 只,就按实际数量出图,标题写 TOP N,绝不拿无 ETF 的指数硬凑。
第 0 步:前置检查(不可跳过)
Wind MCP
本 Skill 的数据全部来自 Wind,必须在 AI 平台的 MCP 配置里接好下面三个服务(缺一个就跑不通):
| MCP 服务 | 用途 | 本 Skill 用到的工具 |
|---|---|---|
wind-index-data |
指数股息率、指数档案、被跟踪基金 | get_index_fundamentals、get_index_basicinfo |
wind-fund-data |
ETF 明细:跟踪指数、管理费率、托管费率、规模 | search_funds、get_fund_info |
wind-economic-data |
10 年期国债收益率 | query_economic_indicator_data |
配置入口:AI 平台的「连接器 / MCP」页添加服务并完成授权。工具不在可用列表里就先 ToolSearch 载入 schema,别凭记忆拼参数。
先确认日期
date +"%Y-%m-%d %A"
取最近一个已收盘交易日(周末回退到上周五),后面所有数据都以这个日期为准,图注写同一天。
第 1 步:取 10 年期国债收益率
query_economic_indicator_data(question="中国国债10年期到期收益率", observation=3)
用返回里最后一个交易日的值,单位 %,保留 4 位小数。
> 坑:中债国债到期收益率:10年 (S0059749) 很多账号无权限,报「受限指标已剔除」。
> 这时改用 M1001654 中国:国债到期收益率:10年(中证指数公司口径),能取到就用它。
> 两个都取不到再找用户确认,不要自己编一个数。
第 2 步:取 ETF 明细(两次调用,并行发)
股息率榜的"跟踪ETF"和"费率"都从这一步来。A股和港股要分两次查,分类字段不一样。
# A股
search_funds(question="筛选名称包含红利或股息的股票型ETF,返回Wind代码、证券简称、跟踪指数名称、管理费率、托管费率、最新资产净值")
# 港股
search_funds(question="筛选名称包含红利、高股息、股息的港股通或QDII股票型ETF,返回Wind代码、证券简称、跟踪指数名称、管理费率、托管费率、最新资产净值")
两次都原样存盘:etf_a.json / etf_hk.json。不要手工抄数。
港股那一次如果只回来 20 来行,再补一发放宽版,把漏掉的补上:
search_funds(question="筛选名称包含高股息、股息、分红、央企红利、国企红利、价值、低波的港股及跨境股票型ETF,返回Wind代码、证券简称、跟踪指数名称、管理费率、托管费率、最新资产净值")
筛选规则(脚本自动做,知道就行):
- 只留场内 ETF,01xxxx.OF 的联接基金一律剔除(联接基金不是跟踪标的 ETF)
- 综合费率 = 管理费率 + 托管费率,取最低;费率打平时取规模最大的那只
- 同一个指数的不同币种版本(如 港股通高股息(HKD) 与 港股通高股息CNY)算同一个指数,跨版本取最低费率
第 3 步:取指数股息率(按池子查,不靠"筛选")
不要用「筛选红利指数按股息率排序」这类写法——Wind 会把全收益/净收益/人民币/美元各种版本全吐出来,还混进港股通指数,没法直接用。
正确做法:从 references/index-pool.json 的候选池出发,按指数名批量取数。
get_index_fundamentals(question="查询以下指数的Wind代码、证券简称和股息率TTM:中证红利、上证红利、深证红利、红利低波、红利低波100、沪深300红利、300红利低波、800红利低波、A500红利低波、中证央企红利、中证国企红利、上证国企红利、诚通央企红利、中证红利质量、中证红利价值、中证智选高股息策略、标普中国A股大盘红利低波50、标普中国A股红利机会")
get_index_fundamentals(question="查询中证港股通高股息投资指数、标普港股通低波红利指数、恒生港股通红利低波动指数、恒生港股通红利指数、恒生港股通中国央企红利指数、国新港股通央企红利指数、港股通央企红利指数、恒生港股通中国内地企业红利指数、国证港股通红利低波指数、中证港股通高股息精选指数的Wind代码、证券简称、股息率TTM")
一次 15-20 个名字比较合适,太多会糊。结果存 yield_a.json / yield_hk.json。
指标优先取 股息率TTM,缺失才退回 最新股息率。取到 null 的指数直接跳过并在日志里列出来,不要拿别的口径顶替。
补 ETF 跟踪关系(可选,池子里没有的新指数才需要)
get_index_basicinfo(question="查询XXX指数的Wind代码、证券简称、成份数量、被跟踪的基金列表与数量")
返回里有「跟踪该指数的基金数量」和基金清单,能确认到底有没有 ETF、是哪几只。
第 4 步:组装两张榜的数据
# A股
python scripts/build_raw.py --market A \
--yield yield_a.json --etf etf_a.json \
--bond 1.6474 --top 15 --out raw_a.json
# 港股(税后口径)
python scripts/build_raw.py --market HK \
--yield yield_hk.json --etf etf_hk.json \
--bond 1.6474 --tax-rate 0.20 --top 15 --out raw_hk.json
脚本会打印「候选 N 只 / 取前 M 名 / 平均股息率 / 国债 / 差值」,以及被跳过的指数。
--etf不传就用index-pool.json里的快照费率(能跑,但费率可能过期,正式出图一定传当天的)- 港股少于 15 只时会打 ⚠,这时标题改成 TOP N,别硬撑
- 差值 = 平均股息率 − 国债,单位 pp(百分点),带正负号
第 5 步:出图
# 图1
python scripts/draw_ranking.py --input raw_a.json --out 图1_A股红利指数股息率.png \
--title "A股红利指数:谁给的钱最多" \
--subtitle "15只红利指数平均股息率4.56%,比十年期国债高出2.91个百分点" \
--insight "智选高股息5.92%排第一,但跟踪它的ETF只有26亿。" \
--min-height 1440
# 图2
python scripts/draw_ranking.py --input raw_hk.json --out 图2_港股红利指数股息率.png \
--title "港股红利:扣完税还剩多少" \
--subtitle "名义5.57%,税后4.46%,仍比十年期国债高2.81个百分点" \
--insight "能买到ETF的港股红利指数只有10只,名义股息率全在5.3%以上。"
| 参数 | 作用 |
|---|---|
--min-height 1440 |
行数少时补到小红书 3:4;不传就按内容自适应 |
--top N |
只画前 N 名(不重新取数) |
--title / --subtitle / --insight |
覆盖标题、副标题、看点 |
--brand |
右下角署名,默认 @望京博格 |
副标题和看点里的数字必须来自脚本打印的真实值,现算现写,不许凭印象。
第 6 步:交付前自检(逐条打勾)
- 排序:按股息率降序,第 1 名和脚本打印的第一行对得上
- ETF 必存在:每个上榜指数都能在
etf_*.json里找到对应跟踪 ETF,找不到的已剔除 - 费率是最低:抽查 2-3 行,确认是同指数里管理费+托管费最便宜的那只(不是规模最大的)
- 港股税后:税后 = 名义 × (1 − 20%),抽查一行手算对得上
- 差值:平均股息率 − 国债,和摘要卡上的数字一致;注意是 pp 不是 %
- 数量:港股不足 15 只时标题写 TOP N,正文说明原因
- 日期一致:股息率、国债、ETF 规模、图注,四处用的都是同一个交易日
- 脚注:保留口径说明 + 「数据来源:Wind」+ 不构成投资建议
数据口径(固定,不许改写)
最新股息率 = Wind 股息率TTM(成分股加权),单位 %
税后股息率(港) = 名义股息率 × (1 − 20%) 20% = 内地个人投资者港股通红利税率
ETF 综合费率 = 管理费率 + 托管费率
差值(pp) = 榜单平均股息率 − 10年期国债到期收益率
为什么税后是直接乘 0.8,而不是逐个成分股算:指数股息率本身就是成分股股息率的加权平均。在统一税率下,Σ(股息率ᵢ × 权重ᵢ × 0.8) = 0.8 × Σ(股息率ᵢ × 权重ᵢ),两者数学上完全等价。只有税率不一致时(H股 20%、红筹 20%+、部分注册地另有税负)才会出现差异,差异通常在 0.1pp 以内。图注要写清这句话,别让人以为是拍脑袋抹掉两成。
常见坑
- 别用「筛选」直接查红利指数:返回里 全收益/净收益/人民币/美元/CPR 版本会刷屏,同一个指数能出现 6-8 个代码,直接排序必然错
- 别把
h开头的全收益代码当价格指数:h00922.CSI是中证红利全收益,000922.CSI才是指数本体 - 联接基金不是 ETF:
01xxxx.OF的 ETF 联接、02xxxx.OF的场外指数基金全部剔除,它们费率和场内 ETF 不同 - 港股红利指数有 ETF 的就那么几只:A股能凑到 15 只以上,港股实际只有 10 只左右,这是市场事实,不是数据缺失
- 别拿 A股 ETF 当港股标的:港股红利 ETF 属「跨境ETF」,在
ETP一级投资范围分类里和 A股「股票型ETF」不是一类,要分开查 - 国债别用错口径:
S0059749无权限时换M1001654,两个都是中债/中证口径的 10 年期,不是 1 年期或 30 年期 - 股息率不能跨期混用:今天取的股息率和上周取的国债放在一起算差值,是被抓包的错
复用规则(避免重复取数)
| 用户新要求 | 该做什么 |
|---|---|
| 只改 N(TOP15 → TOP20) | 不取数,build_raw.py --top 20 重跑一次再画 |
| 只改标题/看点/配色 | 不取数,直接 draw_ranking.py 重画 |
| 只看 A股或只看港股 | 只跑对应那一侧,另一侧不动 |
| 换一个交易日 | 股息率、国债、ETF 规模全部重取 |
| 同一天再问一次 | raw_*.json 还在就直接重画 |
参考
references/index-pool.json:候选指数池(A股 18 只 + 港股 10 只),含 Wind 代码、ETF 跟踪名、最低费率 ETF 快照;新增指数只改这里references/wind-data-guide.md:字段细节、查询话术、权限坑、回归校验基准scripts/build_raw.py:ETF 明细 + 股息率 + 国债 → raw.json(含最低费率 ETF 自动挑选)scripts/draw_ranking.py:raw.json → 榜单 PNGsample/:2026-10-30 的 Wind 原始返回(yield_*.json/etf_*.json),改脚本后先拿它回归
运行环境
- Python 需装 Pillow。本机
python不在 PATH 时用
C:\Users\99388\.workbuddy\binaries\python\versions\3.13.12\python.exe - 中文字体默认走
C:/Windows/Fonts/msyhbd.ttc,缺失就在draw_ranking.py的FONT_CANDIDATES补路径 - 中间文件(
raw_*.json、etf_*.json)放当前工作区,不要写进 Skills 目录
已知边界
- 港股符合"有 ETF 跟踪"的红利指数约 10 只,做不到 TOP15,图上按实际数量呈现并在副标题/看点里说明
- 指数股息率取 Wind 的
股息率TTM,是滚动 12 个月口径,不是预测股息率;和部分平台按"最近一次分红×年化"的算法会有 0.1-0.3pp 差异 - ETF 规模、费率是静态字段,盘中不会变,但月末/季末规模更新后需要重取
- 税后按 20% 单一税率折算;若用户专门问红筹股、REITs 或有跨境双重征税的品种,需要按持仓明细单独算,不能套这个系数