作 者:老余捞鱼
原创不易,转载请标明出处及原作者。

文中示例仅用于技术讨论,不构成任何操作建议。
量化策略开发应以学习和技术交流为目的。
本号不荐股、不卖课、不承诺收益。
市场有风险,请合法合规投资。
文约 2300 字 | 预计阅读 8 分钟,文末有完整脚本,建议先收藏。
想象你走进一家车行,看两台跑车。A 车能稳稳开上 120 迈。B 车现在只有 30 迈,但发动机转速狂飙,三秒钟内能破 100。
只看当前速度,A 车赢。但要赢下短距离竞速赛,答案显然是 B 车。
股市里每天有人犯这个错。把公司现在赚多少当成了公司赚钱引擎能转多快。这两个数根本不是一回事。
盈利收益率(Earnings Yield)是一张快照,告诉你股票现在站在哪。投入资本回报率(ROIC)调整的可持续增长率是一脚油门,告诉你它要去哪。两个一起看,才知道一只股票是真贵还是假贵。
我把这套模型在 A 股跑了一遍,茅台、宁德时代、中国建筑三家对照。数字都在下面,脚本在文末。
一、盈利收益率,一张快照
记住这个定义很简单:盈利收益率就是市盈率的倒数。
也许你看到后的第一反应是,这不就是市盈率倒过来吗,有什么好讲的。真跑起来才发现,坑都在后半段。
市盈率回答:我为每一块钱预期盈利付多少钱。茅台TTM市盈率20.34倍,中国建筑5.92倍。翻过来,茅台的盈利收益率4.92%,中建16.88%。
这个数最大的用处,是把估值翻译成年化收益率,能跟国债直接比。拿微软举个例子,股价529.05美元,预期每股盈利23.72美元,市盈率22.31倍,盈利收益率4.48%。
但它有个大盲区,静态。它只看未来12个月。第二年、第五年、第十年的事,一概不管。
二、增长率的那脚油门
盈利收益率管现在,增长率管将来。可持续增长率(Sustainable Growth Rate)算的是一家公司不靠外部融资、光靠内生能长多快。
公式一句话:可持续增长率 = 留存率 × 回报率。
留存率好懂,赚的钱不分红、留在账上继续投的比例。回报率是关键,用哪个回报率有个坑,下一节说。
先看结果。茅台分红率79.80%,留存率20.20%,ROIC 42.66%,乘出来SGR 8.62%。中建分红率35.46%,留存率64.54%,ROIC 4.09%,SGR 2.64%。
翻译成人话:茅台的盈利每8.4年翻一倍,中建要26.6年。
三、回报率为什么用 ROIC 不用 ROE
教科书默认用 ROE(净利润/净资产)。ROE 有三个毛病。
第一,债务扭曲。ROE 只看股东权益。公司加杠杆,权益相对盈利缩水,ROE 被抬高。中建是典型,有息负债9468亿,ROE 6.28%,换成 ROIC 只剩4.09%。
第二,现金淤积。账上趴着大量低收益现金,拉低经营效率。ROIC 公式里现金是减项。茅台账上535亿货币资金,ROE 32.41%,ROIC 反而42.66%。
我第一次算完盯着这两个数看了好几遍。ROIC 比 ROE 还高?后来才想明白,茅台的现金比有息负债多得多,减完现金,分母比净资产还小。
第三,口径。ROE 用净利润,含利息和非经营性损益。ROIC 用 NOPAT(税后营业利润),只看主业。
NOPAT = EBIT ×(1 – 税率)
投入资本 = 股东权益 + 总债务 – 总现金
ROIC = NOPAT / 投入资本
注意,ROIC 和 ROE 谁高谁低没有定论,全看资本结构。债务比现金多,ROIC 低于 ROE;现金比债务多,反过来。

ROE 与 ROIC 对比,资本结构决定调整方向
四、Widget Corp,我把算例验了一遍
先拿一个虚构公司 Widget Corp 的算例走一遍。照着公式重算,六个数字能全部对上。
| 步骤 | 计算过程 | 结果 |
|---|---|---|
| NOPAT | 1亿 ×(1 – 20%) | 8000万 |
| 投入资本 | 3亿 + 5000万 – 2000万 | 3.3亿 |
| ROIC | 8000万 / 3.3亿 | 24.24% |
| 分红率 | 2美元 / 5美元 | 40% |
| 留存率 | 1 – 40% | 60% |
| SGR | 60% × 24.24% | 14.55% |
营业利润1亿,税率20%,NOPAT 8000万。股东权益3亿,总债务5000万,总现金2000万,投入资本3.3亿。ROIC 等于8000万除以3.3亿,24.24%。预期每股盈利5美元,每股分红2美元,分红率40%,留存率60%。SGR 等于60%乘24.24%,14.55%。
算例不难,难的是记住每个数字的来路。这条链我在文末脚本里一步一步都写了注释。
五、A 股三家,我跑出来的数
光看算例没感觉,上真数据。我用 akshare 拉了三家。口径是利润表用 TTM(2025年报减2025中报加2026中报),资产负债表用2026年中报,股价用10月19日收盘价,股息用近12个月派息。
| 指标 | 贵州茅台 | 宁德时代 | 中国建筑 |
|---|---|---|---|
| 收盘价(元) | 1324.97 | 267.02 | 4.54 |
| TTM每股收益(元) | 65.14 | 18.37 | 0.77 |
| 市盈率(倍) | 20.34 | 14.53 | 5.92 |
| 盈利收益率 | 4.92% | 6.88% | 16.88% |
| ROIC | 42.66% | 59.72% | 4.09% |
| ROE | 32.41% | 22.41% | 6.28% |
| 分红率 | 79.80% | 19.54% | 35.46% |
| 留存率 | 20.20% | 80.46% | 64.54% |
| SGR | 8.62% | 48.05% | 2.64% |
| 盈利翻一倍(年) | 8.4 | 1.8 | 26.6 |

茅台在左上,贵但转得快。中建在右下,便宜但转得慢。宁德时代在更左上的位置,盈利收益率6.88%,模型算出来的SGR 48.05%。
我一开始以为是代码写错了,回头把口径对了一遍才发现,是模型本身的事。
48% 这个数先按住,下一节说它为什么不能全信。
六、模型在哪里会坏
先说宁德。SGR 48.05% 等于80.46%留存率乘59.72% ROIC。ROIC 59.72% 怎么来的?宁德账上趴着3720亿货币资金,投入资本被减到只剩1530亿,分母一小,ROIC 就爆表。
问题在于,这3720亿将来要投出去。投到哪、什么回报率,说不好。模型假设留存收益永远按59.72%投出去。规模越大,边际回报越低,这是常识。
不过有一说一,宁德2026年中报归母净利润同比涨了42%,和模型的48%方向一致。模型这次蒙对了方向,但我更倾向把48%当上限看,不当预期。
再说茅台。ROIC 42.66% 看着漂亮,但茅台2026年中报归母净利润同比-1.9%,盈利实际是平的。模型算的是资本再投资能力,不管有没有需求。茅台有钱有回报率,但投不出去,只能分红,分红率79.80%。
还有中建。SGR 2.64% 假设留存收益还能按4.09%投出去,但中建2026年中报归母净利润同比-24%。盈利在下滑,模型却假设它能增长。模型不会算负数,这是它的下限失效。
一句话,模型算的是供给端,不管需求端。

再看时间维度。假设估值倍数不变,茅台的盈利收益率15年后会爬到17.0%,现在是4.92%。中建会爬到25.0%,现在是16.88%。两条线约22年后才相交。
所以「低盈利收益率不等于贵」这句话要这么读,贵不贵,得折算成未来收益率再判断。它没承诺贵的会变便宜。茅台15年也没追上中建,但它的盈利收益率变成了原来的三倍半。这是油门的价值。
以上是普通读者的部分,看懂这两个指标就够用。往下是动手部分,脚本可以直接抄。
七、动手区,完整脚本
# 盈利收益率 + ROIC 可持续增长率,A 股版
# 数据:akshare(新浪财经接口),2026-10-19
import akshare as ak
import pandas as pd
def analyze(symbol):
# 利润表 TTM = 2025年报 - 2025中报 + 2026中报
p = ak.stock_financial_report_sina(stock=symbol, symbol="利润表").set_index("报告日")
ebit = p.loc["20251231", "营业利润"] - p.loc["20250630", "营业利润"] + p.loc["20260630", "营业利润"]
profit = p.loc["20251231", "利润总额"] - p.loc["20250630", "利润总额"] + p.loc["20260630", "利润总额"]
tax = p.loc["20251231", "所得税费用"] - p.loc["20250630", "所得税费用"] + p.loc["20260630", "所得税费用"]
net = p.loc["20251231", "归属于母公司所有者的净利润"] - p.loc["20250630", "归属于母公司所有者的净利润"] + p.loc["20260630", "归属于母公司所有者的净利润"]
eff_tax = tax / profit
# 资产负债表(2026中报)
b = ak.stock_financial_report_sina(stock=symbol, symbol="资产负债表").set_index("报告日").loc["20260630"]
equity = b["归属于母公司股东权益合计"]
cash = b["货币资金"]
debt = sum(b[c] for c in ["短期借款", "长期借款", "应付债券", "一年内到期的非流动负债"] if pd.notna(b.get(c)))
shares = b["实收资本(或股本)"]
# 股息(近12个月派息,单位元/10股)
div = ak.stock_history_dividend_detail(symbol=symbol, indicator="分红")
div["除权除息日"] = pd.to_datetime(div["除权除息日"])
dps = div[div["除权除息日"] >= "2025-10-19"]["派息"].sum() / 10
# 股价(前复权最新收盘)
prefix = "sh" if symbol.startswith("6") else "sz"
price = float(ak.stock_zh_a_daily(symbol=prefix + symbol, adjust="qfq")["close"].iloc[-1])
# 模型
nopat = ebit * (1 - eff_tax)
ic = equity + debt - cash
roic = nopat / ic
eps = net / shares
ey = eps / price
payout = dps / eps
sgr = (1 - payout) * roic
return dict(price=price, eps=eps, ey=ey, roic=roic, payout=payout, sgr=sgr)
for sym in ["600519", "300750", "601668"]:
r = analyze(sym)
print(f"{sym}: P/E {1/r['ey']:.2f}x 盈利收益率 {r['ey']:.2%} ROIC {r['roic']:.2%} 分红率 {r['payout']:.2%} SGR {r['sgr']:.2%}")口径说明。TTM 利润表,最新资产负债表,近12个月股息,前复权收盘价。有息负债等于短期借款加长期借款加应付债券加一年内到期非流动负债。现金只算货币资金,宁德的交易性金融资产没算,算进去 ROIC 还会变。
八、观点总结
跑完这一遍,我希望大家和我一样记住的就一条,单个指标都会骗人。盈利收益率骗一次,静态。增长率骗一次,假设回报率恒定。ROE 骗一次,资本结构幻觉。三个一起看,互相制衡。
你可以拿自己的持仓算一遍,脚本在文末,改个股票代码就能跑。
你的持仓里,盈利收益率和 SGR 差距最大的那只,差距有多少?敢在评论区报个数吗?
觉得有用的话,把这篇转给同样在搞量化的朋友。
#盈利收益率 #可持续增长率 #ROIC #估值模型 #量化选股 #贵州茅台 #中国建筑 #宁德时代 #akshare #Python量化 #价值投资 #财报分析
Be First to Comment