☰
剩余收益分析(REA)实战:从公式拆解到Python自动化估值
2026/10/14 13:01:51 网站建设 项目流程

我电脑里的分析项目,绝大多数名字都是一长串日期加英文缩写,唯独有一个文件夹特别显眼,就叫rea。全称是 Residual Earnings Analysis,翻译过来是剩余收益分析。别小看这三个字母,它是我这几年用下来最顺手的价值评估工具之一。很多人看我打开这个脚本会以为是什么行业黑话,其实它背后的逻辑特别朴素:账面利润高不代表真的赚钱,一家公司只有创造了超出股东机会成本的收益,才算得上真正的价值创造。这个项目解决的就是这个问题——把净利润里“本来就应该赚到的那部分”扣掉,只看剩下的增量。

当时做这个分析主要服务于两类场景:一类是做投研或者财务分析的朋友,需要判断一家公司到底是价值创造型还是价值毁灭型;另一类是给管理层做内部评估,用来审视某个业务单元是不是真的在帮股东赚钱。无论你用的是专业的数据平台还是自己整理的Excel手工底稿,这套思路都能直接落地。文章里我会把公式拆开讲清楚,把我的数据口径、参数取值逻辑、踩过的坑和自动化脚本一起放出来,你拿过去基本可以照着用。

1. 这个代号rea的项目,到底想解决什么问题

1.1 为什么我看ROE和净利润增长的次数越多,越觉得不够用

先聊一个很常见的场景。某家公司账面净利润同比增长20%,管理层在简报里讲得也很兴奋,但股价就是不涨。这时候你去问一位老研究员,他大概率会甩给你一句“利润增长质量不高”。这个“质量不高”的背后,很多时候就是剩余收益在提醒你:增长是靠压低股东必要回报换来的,或者换句话说,这家公司赚到的钱还没有达到股东资金本来该有的回报水平。

ROE确实好看,但ROE本身没有参照系。20%的ROE看起来很高,可是如果这家公司的业务风险极高,股东要求的必要回报率是25%,那它实际上在持续毁灭价值。这就是剩余收益和传统比率的本质区别:它把“收益”和“资金占用的成本”放在同一个天平上称。剩余收益为负,意味着每一块钱账面利润的背后,是股东们在用机会成本默默补贴公司。

这也是为什么我不太喜欢只用市盈率或者市净率去看公司。市盈率反映的是市场预期,市净率反映的是资产溢价,它们都依赖于市场参照物。剩余收益则完全从财务数据本身出发,你不需要等别人报价,自己就能计算出这家公司到底有没有跨越资金成本线。

1.2 剩余收益和EVA有什么恩怨

如果你学过公司财务,一定会想到经济增加值EVA。EVA和剩余收益本质上说的是同一件事,但在实际落地时差异很大。EVA的官方版本做了很多复杂调整,比如研发费用资本化、商誉摊销加回、递延税调整,这些调整的目的是让利润更接近“经济利润”,但代价是计算逻辑不透明,不同的人做同一家公司可能算出完全不同的数字。

我做rea这个项目时选择的是更朴素的剩余收益口径,也就是会计口径直接计算。原因和我当时的工作场景有关:我需要一个能批量跑、能自动更新、还能向别人解释清楚每一个数字来源的模型。EVA的调整项越多,越难在团队之间复制。经典的剩余收益口径只依赖三大报表里的几个字段,净利润、账面权益、期初权益,干净利落。

当然,这个简化是有代价的。它假设数据质量可信,假设会计准则下的账面权益变动基本反映经济实质。对于制造业、消费、医药这类业务结构不复杂的行业,这个假设问题不大。但对于金融、地产这类经常有表外或者项目制结构的行业,就需要做额外的口径修正,这个我放到文章后面专门讲。

2. 剩余收益的计算口径:公式拆解与资本成本怎么拍

2.1 公式只有四行,但每一行都不能含糊

剩余收益的基本公式特别简洁,一家公司第t期的剩余收益可以写成:

RI_t = NI_t - r × B_{t-1}

其中NI_t是第t期净利润,B_{t-1}是第t-1期末、也就是第t期期初的账面权益,r是股东要求的权益资本成本率。

如果你想做估值,把未来若干期的剩余收益折现,再加上当前的账面权益,就能得到理论价值:

V0 = B0 + Σ RI_t / (1+r)^t

这个公式我第一次看的时候觉得平平无奇,但真的用自己的数据去跑才发现门道非常多。核心就在乘号r × B_{t-1}上,它要表达的是:股东这笔钱如果不放在这家公司,放在其他同等风险的地方,能拿到的回报。这部分回报对企业来说是成本,哪怕它不出现在任何利润表科目里。

很多人在这一步会犯的第一个错误,就是用期末权益来计算资金占用成本。这里一定要用期初权益。原因也很简单:期初权益代表期初就已经占用的一笔资金,企业用这笔资金赚了一整年的利润,资金成本应当按照年初“占用的存量”来算。如果把当期新增利润也算进权益再乘资本成本,相当于把利润本身又征收了一次成本,会严重低估剩余收益。

2.2 权益资本成本怎么拍,是我花了最多时间的地方

资本成本率r是整个模型里最敏感、也最有争议的参数。我身边不少朋友做这步时喜欢直接取8%或者10%,看得我直皱眉。拍脑袋取数会让模型结果失真到没法信。我在项目里用的是主流做法:CAPM,公式是:

r = 无风险利率 + β × 股权风险溢价

无风险利率一般用10年期国债到期收益率做锚,我平时会取过去一段时间的均值而不是单日值,避免某一天市场波动把整个模型带偏。β值我用的是过去60个月的公司月收益率相对市场指数月收益率的回归斜率,金融终端或者财经数据接口都能直接拉,没有现成的就自己用Excel跑一遍回归,不复杂。

股权风险溢价这个参数是最大的分歧点。我看过不少研究报告取4%到7%之间,具体取多少取决于你对市场整体风险的判断。我的习惯是取5.5%到6%之间作为基准区间,然后针对不同行业在这个区间里浮动。银行、公用事业这类波动小的,我会往下压一点;科技、生物医药这类波动大的,往上升一点。这个区间设定不是精确的科学,但是相比直接给一个固定数,能让自己清楚结果依赖于哪个假设。

实际算的时候还有一个容易忽略的细节:如果公司同时有负债,账面上的β是股权β,已经通过杠杆放大了风险,不需要再额外处理。但如果你的财务数据里包含了优先股或者其他混合融资工具,就要单独拆分,别一股脑塞进普通股权益里。

2.3 数据来源和字段映射

rea模型跑的数据主体来自公司年报和季报,手工整理的时候我建议至少准备以下字段:

  • 报告期
  • 归母净利润
  • 期末归母权益(用来算下一期的期初)
  • 少数股东损益,用来核对合并口径
  • 非经常性损益,用来做稳健性检验

有朋友问为什么用归母而不用合并数据,我的建议是模型口径保持一致就行。我自己偏好归母口径,因为剩余收益最终衡量的是普通股股东的价值增量,归母净利润和归母权益才是一一对应的。如果分子用合并净利润、分母用归母权益,结果会虚高,尤其是合作开发项目多、少数股东占比大的行业,这个虚高会被放得很厉害。具体案例我在下一部分细讲。

3. 跑数据踩过的三个坑:口径、合并与偶然项

3.1 期初权益还是期末权益:第一个让我翻车的地方

这个坑我印象太深了。第一次写批量脚本时,我从数据库里直接选了期末归母权益字段当分母,还觉得自己很聪明,想着“反正每年的期末就是下年的期初,差别不大”。结果跑出来某家制造业公司连续三年剩余收益都是正数,而且数值一年比一年漂亮,我都准备写报告了,结果复核时发现第一年期末权益里包含了当年利润,用它乘资本成本,等于把当年利润产生的“账面价值增加”又收了一次成本费。

修正方法特别简单:对报告期排序之后,把期末权益列做一列shift(1),取上一期期末作为本期期初,然后删掉第一期没有期初数据的行。这个操作顺序也有讲究,必须先按报告期排序再shift,不然错位会导致后续所有结果不可信。现在我每次跑数据都会先打印任意连续三期的期初权益,肉眼确认一下相邻期之间的衔接关系,确保没有把会计年度和自然年度搞混。

3.2 少数股东损益:一个让我低估风险的口径盲区

第二个坑是在看一家合作开发项目特别多的地产公司时踩到的。那家公司合并净利润里面有将近三成来自少数股东,而我只用了归母净利润做分子,分母用的却是合并报表的总权益,于是算出来的剩余收益明显偏乐观。表面上看公司赚钱了,但其实相当一部分利润是分给合作方的,真正归属普通股股东的增量没有那么多。

处理方法不是简单的加减法,而是要追到每一期的少数股东权益占比。正确做法是分子分母口径严格对齐:分子用归母净利润,分母就只放归母权益;如果你想用合并口径做全局分析,那就分子分母都换,再把少数股东视为一种类似优先股的资本来源单独说明。我在脚本里加了一个核查步骤,专门计算“少数股东损益/合并净利润”这个比值,超过20%就自动在输出文件里打一个警告标记,提醒自己去看明细。

3.3 非经常性损益:它能扭曲你对趋势的全部判断

第三类坑就是一次性项目。政府补助、资产减值损失、公允价值变动,这些东西会让某一年的剩余收益突然变正或者突然变成一个大负数,如果不做处理,你会得出完全错误的趋势判断。我之前分析某家电子制造公司时,剔除政府补助前后,剩余收益从“稳定为正”直接变成“连续为负”,结论完全反过来。

所以我在模型里会再计算一列“经常性剩余收益”:用扣除非经常性损益后的归母净利润,减去资本成本乘以期初权益。这个口径不一定总是最准确的,因为有些非经常性项目其实是周期性业务的一部分,但它至少能给你一个“保守版”的参照系。每次出完数据我都会同时看两个版本的剩余收益,如果两者方向一致,说明结论比较稳;如果出现背离,就该去翻报表附注,看看特殊项背后到底是什么。

4. 从Excel到脚本:把季度更新变成一件十分钟的小事

4.1 为什么后来决定写成Python脚本

最开始这个分析完全是用Excel手动拉的。每季报表出来之后,我要打开一个工作簿,把三个sheet的数据复制进去,再拖动公式往下拉,然后手工画趋势图。一次操作大概四十分钟,虽然能做完,但每季度都要重复一遍,而且中间很容易因为粘贴错行或者公式下拉范围没更新而出错。

更难受的是,同一套逻辑换了另一种参数想重算一遍,比如想把风险溢价从6%调整到5%,整个工作簿都要联动检查一遍。后来我就把这块逻辑抽出来写成了一个脚本,用pandas读入整理好的基础数据表,自动完成排序、shift、扣减、汇总输出,更新一次数据到出结果大概只要几分钟。

4.2 核心代码:一个极简但能用的rea计算流程

下面这套代码我只保留了最核心的处理逻辑,去掉了我自己机器上的路径和设备依赖。你只需要准备一张至少包含这些列的基础表:

  • 报告期:字符串,形如2023-12-31
  • 归母净利润
  • 期末归母权益
  • 无风险利率
  • 贝塔
  • 股权风险溢价
import pandas as pd # 读取基础财务数据 df = pd.read_excel("财务输入.xlsx", sheet_name="核心数据") # 1. 按报告期排序,并重置索引 df = df.sort_values("报告期").reset_index(drop=True) # 2. 用上一期期末归母权益作为本期期初权益 df["期初权益"] = df["期末归母权益"].shift(1) # 3. 删除第一行没有期初权益的数据 df = df.dropna(subset=["期初权益"]).copy() # 4. 计算权益资本成本 r = 无风险利率 + 贝塔 * 股权风险溢价 df["权益资本成本"] = ( df["无风险利率"] + df["贝塔"] * df["股权风险溢价"] ) # 5. 计算剩余收益 RI = 归母净利润 - r * 期初权益 df["剩余收益"] = ( df["归母净利润"] - df["权益资本成本"] * df["期初权益"] ) # 6. 输出计算过程到结果表 output_cols = [ "报告期", "期初权益", "归母净利润", "权益资本成本", "剩余收益", ] df[output_cols].to_excel("rea_results.xlsx", index=False) print(df[["报告期", "剩余收益"]].to_string(index=False))

这段代码每一步都有明确目的。排序和reset_index是为了让shift(1)拿到的是真正的上一期期末数据,否则行序一乱整个结果就废了。dropna是去掉计算不了的第一期。资本成本的拆分计算是为了输出明细,方便哪天 params 变了可以直接重算。to_excel输出的结果表里每一列都能在原始报表里找到对应字段,这对我来说很重要,因为后续无论是自己复核还是给别人看,每列都要说得清楚。

4.3 脚本之外的流程纪律

写脚本容易,维护数据的纪律反而更难。我现在固定把原始财务报表放在财务输入.xlsx里,文件名不动,内容整体覆盖。这样脚本永远不需要改路径。每个报告期跑完,我会手动检查几个地方:最新一期净利润的正负和绝对值是否与公告一致、期初权益是否跟上一期末完全相等、剩余收益的符号和上一轮比有没有突兀的反转。

有一个小小的自动检查值得专门提一下。我在脚本里加了一行判断,如果期初权益出现负数,就直接弹出提示。账面权益为负的公司,比如长期亏损导致资不抵债的,剩余收益公式会退化成一个失去经济含义的数字。这时不能用这个模型硬套,需要回到财务基本面去做专项分析。

5. 一次完整案例:剩余收益为正和为负,该怎么往下读

5.1 一家账面赚钱但剩余收益为负的制造业公司

用一个虚构案例来说明。假设某机械设备制造企业,期初归母权益120亿元,归母净利润10亿元。它的β为1.2,无风险利率取2.8%,股权风险溢价取6%,那么权益资本成本就是:

r = 2.8% + 1.2 × 6% = 10%

资金占用成本为120亿 × 10% = 12亿元。剩余收益是10亿减去12亿,等于负2亿元。换句话说,公司账面上赚了10个亿,但股东这笔钱如果放在同风险级别的其他投资上,理论上应该赚到12个亿,这里面存在约2亿元的股东价值损耗。

不要小看这个负2亿。它意味着这家公司的ROE(10亿/120亿约等于8.3%)低于股东的10%必要回报率。市场给它的估值如果不是低到显著低于账面权益,理论上是没有安全边际的。用剩余收益估值模型来看,V0 = B0 + 未来剩余收益折现之和,如果未来RI持续为负,V0应该低于B0。这也是为什么有些公司净资产很高,但股价长期徘徊在净资产附近甚至破净,本质上它没有跨越资金成本线。

5.2 另一个非典型样本:剩余收益由负转正意味着什么

再来一个消费品公司的例子。期初权益80亿元,归母净利润9.6亿元,β取0.9,无风险利率2.8%,股权风险溢价5.5%,那么资本成本是2.8% + 0.9 × 5.5% ≈ 7.75%。资金占用成本约6.2亿元,剩余收益是9.6亿减6.2亿等于3.4亿元。这是一家真正在创造股东价值的公司,ROE约12%,高于必要回报率,账面利润的增长会给内在价值带来正贡献。

我跟踪过这类公司连续五个报告期,剩余收益每一期都在扩大,伴随的是净资产的利用效率在变高。结合估值模型,把未来五年的预期RI折现加回现在的权益账面,可以倒推市场给的估值隐含了多少增长预期。如果当前市值远高于这个理论价值,要么市场在预期长期高增长,要么就是泡沫,需要结合其他估值工具交叉验证。

5.3 读结果的习惯:先看方向,再看绝对值,最后看趋势

我自己的读数习惯有三个层级。第一层看剩余收益的正负号,这决定了一家公司的经济性质。第二层看绝对值占期初权益的比例,这个比例可以理解为“超额资本回报率”,比单独一个数字更能跨公司比较。第三层看连续多期的趋势,判断这个公司是在修复还是在恶化。

有一个注意点需要提一下:剩余收益模型对账面权益的初始值非常敏感。如果一家公司的净资产本身就因为会计政策的原因被低估,比如大量研发支出被费用化、多年品牌投入无法体现在账面,那么算出来的RI天然会偏高,因为分子利润没有承担这些投入的资本化成本,分母权益也偏小。在这种情况下,模型结论需要打折看。我一般会再做一个调整口径,把累计研发费用化金额加回到权益里,看看结论会不会改变方向。

6. 换行业之后,这个模型需要动哪些参数

6.1 金融、地产、制造业各有各的敏感点

这个模型看似通用,但换到不同行业,敏感点完全不一样。我用下面这个对比表总结过我自己的处理经验。

行业类型核心敏感点建议处理方式
银行/非银金融杠杆率高,权益资本成本微小变化会被放大重点关注β估计的稳定性,对风险溢价做敏感性测试
房地产/建筑项目周期长,存货占用大量资本,少数股东结构复杂坚持归母口径,关注资产减值对期初权益的冲击
制造业周期性明显,资产减值与政府补助干扰大同时看经常性剩余收益,剔除一次性项
消费/医药品牌、研发等无形资产大量费用化单独做调整口径,把可辨别的费用化投入加回权益

银行业的杠杆通常十倍以上,账面权益占资产的比例很低,资本成本的小数点变化会直接让剩余收益从正翻到负。所以我给银行做分析时,会把风险溢价按0.5%间隔做一个三档敏感性测试,而不是只给一个数。地产公司的问题集中在资产重估和减值节奏上,有时候某一年计提几十亿减值,这一期RI变成巨亏,但它可能是在修复前几年虚高的账面,需要结合项目周期解释。

6.2 与其追求精确,不如把假设透明化

这套模型跑到现在,我的体感是:它最大的价值不是给你一个精确到小数点的内在价值数字,而是逼着你把对一家公司的所有核心假设放在同一个框架里对质。净利润多少、资本成本多高、期初权益多少,这三个数一摆出来,公司的问题就藏不住了。

如果你也想搭一套自己的分析流程,我的建议是不要一上来就追求自动化,先用Excel把一家公司过去五年数据手工算一遍。等你能解释清楚每一个负数的来源,再谈批量。数据口径的敏感,是这种小项目最有价值的地方。现在这个脚本已经跟着我跑了好几个季度,每次出数之前我都会手动检查一遍那些容易隐藏特殊项的字段。模型本身不难,难的是你想清楚每一格数字到底代表什么口径,这也是它真正值钱的地方。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询