市赚率(PR, Profit Ratio)估值技能
发明者: ericwarn丁宁 (雪球和公众号)
一个基于巴菲特"40美分买1美元"投资理念的简化估值指标。由市盈率(PE)与净资产收益率(ROE)的比值构成,衡量"市场价格"与"企业赚钱能力"是否匹配。
⚠️ 第一步:判断标的类型 + 分流(强制)
用户给出标的后,先判断是 指数 / A股个股 / H股个股,再按对应规则文档估值:
- 先判是不是指数:标的或其名称含"指数/ETF/联接基金",或代码是指数代码(如 000300 沪深300、932315 中证红利质量、HSI 恒生),或用户说"沪深300""中证红利""恒生指数"→ 按指数估值,读
references/ah-index.md(用公式三,只需 PE+PB) - 否则看个股代码格式:
- A股个股 = 沪深交易所,6位数字(如 600036 招行、000333 美的、300750 宁德)
- H股个股 = 港交所,4-5位数字(如 00700 腾讯、00883 中海油、02318 平安) - 两地上市(A+H)的标的(如美的、招行、平安、中海油均有AH股):必须让用户选择按哪个市场估值,因为两地的股息税、分界线、红筹判定完全不同。不要替用户默认。
- 按类型加载规则文档:
- 指数 → 读references/ah-index.md(公式三,PE+PB)
- A股个股 → 读references/a-stock.md
- H股个股 → 读references/h-stock.md(含红筹身份判断、税率档等 H股专属步骤)
判断完市场,下面的公式、修正系数、计算方法是 A/H 通用的。
⚠️ 核心易错点:ROE 单位
公式里的 ROE 必须以小数代入(如 31.8% 代入 0.318),而不是直接代入百分数(31.8)。
为了避免出错,本技能统一约定:对外输入 ROE 时用百分数数值(如输入 31.8 表示 31.8%),计算脚本内部会自动 ÷100 转换为小数后再套公式。禁止跳过脚本直接心算,因为漏除/多除100是这个指标最常见的计算错误。
三个公式
公式一:PE法(适用于ROE长期稳定的企业,如消费、白酒、电力等)
PR = PE ÷ ROE(小数) ÷ 100
验证案例:巴菲特1988年买入可口可乐,PE≈15,ROE≈31.8%,代入得 PR≈0.47,与历史记载的0.474PR吻合。
公式二:PB法(适用于ROE波动较大、不稳定的企业,如保险股)
推导依据:PE = PB ÷ ROE,代入公式一可得:
PR = PB ÷ ROE(小数) ÷ ROE(小数) ÷ 100
ROE取值建议:用多年ROE的中位数或平均值代入,可以得到"模糊正确"的估值,避免单年ROE波动失真。周期股(A股约7年一个周期)优先用近7年截尾均值——去掉一个最高和一个最低再平均,比普通均值更能剔除周期极值失真(如中远海控2021年ROE 67%、H股IFRS口径高达101%),取数:cheese_fetch.py --code 601919.SH --years 7,输出中的"截尾均值"字段。上市不足7年的周期股不截尾,直接用普通均值(样本不足时极值也是周期的一部分,截尾反而失真)。
公式三:PE-PB简化法(专用于指数基金 / 查不到ROE的场景)
推导依据:ROE = PB ÷ PE,代入公式一,ROE被约掉:
PR = PE × PE ÷ PB ÷ 100
适用场景:指数基金通常只能查到PE、PB两项数据,查不到ROE(指数没有统一的净资产收益率口径),此时只能用公式三估值。该公式不涉及ROE百分数/小数换算问题,因为推导过程中ROE已被完全约掉,直接代入PE、PB原始数值即可。
验证:用公式三反推可口可乐案例(PE=15,PB=4.77),结果同样是PR≈0.47,与公式一完全一致。
修正系数 N(针对"赚假钱"——利润不分红的企业)
以50%的多年平均股利支付率为标杆:
| 多年平均股利支付率 | 修正系数 N | 计算方式 |
|---|---|---|
| ≥ 50% | 1.0 | 50% ÷ 50% |
| 25% ~ 50% 之间 | 50÷支付率 | 例:支付率40% → N=50÷40=1.25 |
| ≤ 25% | 2.0 | 50% ÷ 25% |
修正系数 N 同时适用于公式一(PE法)和公式二(PB法),原作者公式为:
公式一 + N:PR = N × PE ÷ ROE(小数) ÷ 100
公式二 + N:PR = N × PB ÷ ROE(小数) ÷ ROE(小数) ÷ 100
何时需要加 N:企业利润含金量存疑(应收账款高、经营现金流与净利润长期背离、利润长期不分红),需按低股利支付率上调 PR。若企业分红正常(支付率≥50%)或用回购替代分红(账面股利支付率偏低但实质把利润返还股东),N=1.0,无需修正。详见下文「回购替代分红」一节。
回购替代分红 → 无需修正系数 N
部分企业长期用股份回购替代现金分红,账面股利支付率偏低,但实质是把利润返还给了股东(缩股提升每股价值)。这类企业不要套用低股利支付率去上调 N,按 N=1.0 处理即可,否则会重复惩罚、高估 PR。
判断信号:公司近三年回购金额 ≈ 或 > 现金分红金额,且利润/现金流健康。典型如港股科技股(腾讯),详见 references/h-stock.md。
估值分级标准(总览)
| 市场 | 长期持有股息税 | 高估分界线 |
|---|---|---|
| A股 | 0% | 1.0 PR |
| H股(非红筹) | 20% | 0.8 PR |
| H股(红筹) | 28% | 0.72 PR |
> H股分界线 = 1 − 股息税。红筹股一律按28%保守档(先扣10%出境税,剩余90%再扣20%个税)——不再逐只查港交所股息公告的代扣状态,换取实操便利。注:少数红筹(如腾讯)实际因已预缴出境税为20%,本口径统一28%会略保守;需精确到单只的,自行查公告后用 --tax-rate 20 覆盖。完整红筹判断流程(查本地清单)见 references/h-stock.md。
计算方法
始终调用 scripts/calc_pr.py 进行计算,不要手算,以避免ROE单位换算出错。
# PE法(ROE稳定的企业)
python3 scripts/calc_pr.py --method pe --pe 15 --roe 31.8 --market A
# PB法(ROE不稳定的企业,如保险股,用多年ROE均值/中位数)
python3 scripts/calc_pr.py --method pb --pb 9 --roe 30 --market A
# + 修正系数N(针对低分红企业,传入多年平均股利支付率)
python3 scripts/calc_pr.py --method pe --pe 12 --roe 20 --payout 35 --market A
# 指数基金(只有PE/PB,用公式三)
python3 scripts/calc_pr.py --method index --pe 15 --pb 4.77 --market A --asset-type index
# H股估值(红筹=固定28%,详见 references/h-stock.md)
python3 scripts/calc_pr.py --method pe --pe 8 --roe 15 --market H --red-chip yes
# 反推折扣买点价(传入与PE/PB同日同源的现价/指数点位)
python3 scripts/calc_pr.py --method pe --pe 15 --roe 31.8 --market A --price 68.5
参数说明:
- --method:pe(公式一) / pb(公式二) / index(公式三,仅需PE+PB)
- --roe:以百分数数值传入(如 15.5 表示 15.5%),PB法建议传入多年中位数/均值;index法不需要此参数
- --payout:多年平均股利支付率,以百分数数值传入(如 40 表示40%),不传则N默认1.0
- --market:A 或 H,决定高估分界线(A股1PR;H股非红筹0.8PR / 红筹0.72PR)
- --asset-type:stock(个股,默认,折扣档位4折/5折/6折) 或 index(指数基金定投,折扣档位放宽至7折/8折)
- --red-chip / --red-chip-source:仅H股,yes=红筹(28%/0.72PR),no=非红筹(20%/0.8PR),详见 references/h-stock.md
- --price:当前股价(个股)或指数点位(指数基金),必须与PE/PB同日同源、且为前复权口径(芝士取 dayKV2 的前复权收盘价最理想;basePrice 是后复权价勿用)。传入后反推各折扣档位目标价,见下节
反推折扣买点价
三个公式中 PE、PB 均与股价成正比(EPS、净资产不变),所以 PR 也与股价成正比(公式三同理:点位变动k倍时PE、PB同比例缩放,PR变动k倍)。据此可从当前PR反推各档位对应的目标价:
目标价 = 当前股价 × 目标折扣 ÷ 当前PR
传入 --price 后 calc_pr.py 自动输出(个股:4折/5折/6折+分界线价;指数:7折/8折+分界线点位,各档同时给出较现价的涨跌幅)。
注意事项:
- 反推价是静态假设下的参考价——假设EPS/ROE/净资产不变。若基本面变化(业绩增长或下滑),同一折扣对应的合理价格也会变,不能把今天算的目标价当长期固定锚点
- 股价与PE/PB必须同日同源,否则"实时价配昨日PE"会算出失真的PR和目标价
- 除权除息、股本变动(增发/回购)会破坏"PR∝股价"的比例关系,需重取数据重算
输出格式规范(估值卡片)
向用户呈现最终估值结论时,统一使用下面的估值卡片模板(数据取自 calc_pr.py 输出,来源/日期取自取数脚本),不要自行发明格式:
## 📊 {名称} {代码} · 市赚率估值
**¥{现价}**(前复权 · {现价日期})|{A股/H股}|高估分界线 {threshold}PR
### PR = {PR值} {状态emoji} {估值结论}
| 关键指标 | 数值 |
|---|---|
| {按所用公式列出 PE / PB / ROE / 支付率} | {数值} |
| 计算公式 | {计算公式(与calc_pr.py输出一致)} |
### 🎯 买点价反推(假设基本面不变)
| 档位 | 目标价 | 距现价 |
|---|---:|---:|
| 4折 · 深度低估 | ¥{目标价} | {涨跌幅}% |
| 5折 · 理想买点 | ¥{目标价} | {涨跌幅}% |
| 6折 · 可考虑买点 | ¥{目标价} | {涨跌幅}% |
| 分界线 · 合理估值 | ¥{目标价} | {涨跌幅}% |
📅 数据:{实际数据来源},截至 {日期}
⚠️ 市赚率为简化估值参考,不构成投资建议
渲染示例(美的集团 000333.SZ,2026-08-21 真实数据):
> ## 📊 美的集团 000333.SZ · 市赚率估值
>
> ¥84.30(前复权 · 2026-08-21)|A股|高估分界线 1.0PR
>
> ### PR = 0.715 🟢 轻度低估
>
> | 关键指标 | 数值 |
> |---|---|
> | PE-TTM | 14.55 |
> | ROE(近5年均值) | 20.35% |
> | 计算公式 | PR = PE ÷ ROE ÷ 100 |
>
> ### 🎯 买点价反推(假设基本面不变)
>
> | 档位 | 目标价 | 距现价 |
> |---|---:|---:|
> | 4折 · 深度低估 | ¥47.16 | -44.1% |
> | 5折 · 理想买点 | ¥58.95 | -30.1% |
> | 6折 · 可考虑买点 | ¥70.74 | -16.1% |
> | 分界线 · 合理估值 | ¥117.90 | +39.9% |
>
> 📅 数据:芝士财富,截至 2026-08-21
> ⚠️ 市赚率为简化估值参考,不构成投资建议
变体规则:
- 状态emoji映射(对应
classify()结论):低估(4折/5折/6折/轻度)→ 🟢;合理估值 → 🟡;高估 → 🔴 - 指数基金:标题尾缀"(定投参考)";档位表换成 7折 · 理想定投点位 / 8折 · 可定投点位 + 分界线;"目标价"列改为"目标点位",¥ 改为点位数值;现价行改为"{点位}({指数名} · {日期})"
- H股:首行市场标注补充税率身份,如"H股 · 红筹(28%股息税)"或"H股 · 非红筹(20%股息税)",分界线随之 0.72PR / 0.8PR;货币符号用 HK$(A股用 ¥)
- 含修正系数N:关键指标表加一行"多年股利支付率",计算公式行体现 N,如"PR = N(1.25) × PE ÷ ROE ÷ 100(支付率40%)"
- 未取到前复权现价(--price 缺失):删除整个 🎯 买点价反推 区块,脚注前加一行"💡 未取到与PE/PB同源的前复权现价,跳过买点价反推"
- 多标的对比:每个标的一张完整卡片依次排列,不要合并成宽表;多源数据有差异时在脚注区补充说明(保留"标注来源与截止日期"的强制要求)
- 周期股(ROE 剧烈波动、用PB法+近7年截尾均值:
--years 7取数后用"截尾均值",即去掉一个最高一个最低再平均;上市不足7年不截尾,直接用普通均值):关键指标表必须三口径并列,不得只呈现其一——
-PB法 × 截尾均值ROE(主口径,反推买点价用一个)
-PB法 × 中位数ROE(保守对照,中位数天然抗极值)
-PE法(参考,反映按当前盈利的视角)
若主口径反推目标价距现价涨幅异常(>+100%),必须在该标的脚注加醒目提示——"目标价基于ROE回归历史均值的假设,市场实际定价隐含盈利回落周期,市赚率对周期股适用性有限,谨慎参考"
买点折扣档位(个股 vs 指数基金,A/H通用)
指数基金已分散个股风险,不需要像个股一样追求极致折扣,可放宽标准:
| PR 区间 | 个股(追求极致折扣) | 指数基金定投(可放宽标准) |
|---|---|---|
| ≤ 0.4 | 4折,巴菲特级别深度低估 | — |
| ≤ 0.5 | 5折,理想买点 | — |
| ≤ 0.6 | 6折,可考虑买点 | — |
| ≤ 0.7 | 轻度低估 | 7折,理想定投点位 |
| ≤ 0.8 | 轻度低估 | 8折,可定投点位 |
| < 分界线(A股1.0 / H股0.8或0.72) | 轻度低估 | 轻度低估,可继续定投 |
| = 分界线 | 合理估值 | 合理估值,建议观察 |
| > 分界线 | 高估 | 高估,不建议继续定投 |
数据来源参考(三级降级)
scripts/calc_pr.py 只负责计算、不取数。取数按三级降级链执行——上一级失败(脚本报错/返回空)才用下一级,每级都要标注实际数据源:
① 芝士财富 cheese_fetch.py
│ 失败/不可用
▼
② AkShare akshare_fetch.py ──┐
│ 失败/不可用 │ 部分字段缺失
▼ │(如港股PE/PB、指数PB)
③ 网站 乐咕/etf.run/富途等 ◄──┘
① 首选:芝士财富 scripts/cheese_fetch.py(A股、H股通用)
一次取全 前复权现价(dayKV2)、PE-TTM、PB、ROE-TTM、多年ROE、股利支付率,A/H股都覆盖(港股 PE/PB 仅芝士可取)。⚠️ 芝士 stockBaseInfo 的 basePrice 是后复权价(=前复权价×复权因子,与行情软件对不上),反推买点价必须用 dayKV2 日K最后一根的前复权收盘价(脚本用 basePrice÷现价≈复权因子 自检口径)。
python3 scripts/cheese_fetch.py --code 0700.HK [--years 5] # 个股(A/H股)
python3 scripts/cheese_fetch.py --code 000300.SH --action index # 指数(PE/PB/分位)
- 个股:PE-TTM/PB/ROE-TTM/多年ROE/股利支付率
- 指数:PE/PB/估值分位(
pepb.newest,所有指数都有,A股港股通用) - 依赖
pycryptodome(接口需 AES 签名,算法见docs/cheesefortune-zstokv1.md) - 失败情形:未装 pycryptodome、签名接口改版、
code:500/-002、网络错误
② 次选:AkShare scripts/akshare_fetch.py(芝士不可用时降级)
python3 scripts/akshare_fetch.py astock --symbol 600036 # A股:PE/PB/同日收盘价/ROE/股利支付率
python3 scripts/akshare_fetch.py hstock --symbol 00700 # H股:ROE+最近收盘价(PE/PB仍需手动补)
python3 scripts/akshare_fetch.py index --symbol 000300 # 指数:宽基PE-TTM+PB+指数点位;其他指数仅PE+股息率
- 数据短板:港股 PE/PB 无稳定接口(
hstock只给 ROE+最近收盘价);指数仅宽基有 PB(沪深300/中证500/上证50),策略/行业指数无 PB(芝士有,故指数首选芝士) - akshare 失败时可降级为原始接口(见
references/a-stock.md),字段名在 akshare 1.18.81 验证
③ 末选:网站取数(前两级都不可用,或补它们的短板字段)
| 场景 | 网站数据源 |
|---|---|
| A股个股 PE/PB/ROE | 同花顺、东方财富网(个股-财务指标)、雪球 |
| A股指数 PE/PB(含估值百分位) | etf.run、乐咕乐股网、中证指数官网 factsheet |
| H股个股 PE/PB(akshare 取不到时) | 富途牛牛、老虎证券、AAStocks |
| H股指数(恒生系列)PE/PB | 恒生指数公司官网、乐咕乐股网 |
| H股科技股 Non-IFRS 净利润 | 公司业绩公告 PDF、港交所披露易(需自行算) |
> 各市场取数细节、字段边界、akshare 失败备选接口详见 references/a-stock.md / references/ah-index.md / references/h-stock.md。
>
> ⚠️ 三级都可能因目标网站改版失效。脚本失败时如实报错(不编造数据),降级到下一级;最终仍要标注实际来源与截止日期。AkShare/网站数据仅供研究参考,不能替代官方公告/财报核实关键数字。
⚠️ 引用数据时的强制要求(避免误导):
- 必须标注数据来源和截止日期,例如"PE=16.68(来源:乐咕乐股网,截至2025-11-26)",不能只给数字
- 不同数据源口径可能不同(如TTM口径 vs 静态PE、加权ROE vs 摊薄ROE、是否扣非等),同一标的从不同来源查到的PE/PB可能略有差异,属正常现象,呈现结果时如果手头有多个来源数据有明显差异,应一并说明,而不是隐藏差异只取一个数字
- PE/PB是动态变化的,估值结论只对"查询当时那个时间点"有效,呈现最终估值结论时必须把数据截止日期带上(如"截至2025-11-26的估值结论:可定投点位"),不能让用户误以为是长期固定结论
- 如果同一指标能查到多个来源,优先使用官方/权威源(如中证指数公司官网、交易所、上市公司财报),其次用聚合数据网站,最后才用第三方估算
重要提示(向用户说明的免责声明)
市赚率是一个经验性的简化估值指标,存在以下局限,回答时如涉及具体买卖建议应提及:
- 对ROE质量依赖较高,若ROE受高杠杆等因素虚高,PR会失真
- 未直接考虑企业未来成长性
- 不适用于银行股(需专门修正),周期股需用多年平均ROE而非单年值
- 指数基金用公式三(仅PE/PB)估值时,本质是把整个指数当作一个"虚拟企业"来近似,精度低于个股的公式一/二,更适合作粗略的定投参考,而非精确买卖时点判断
- 这是估值参考工具,不构成投资建议,最终决策需结合企业基本面、行业格局等综合判断