F-O剩余收益模型实战:从DDM到会计视角的估值建模
2026/9/18 4:16:10 网站建设 项目流程

简介:金融估值建模的价值评估发展梳理,是一份面向金融分析师、投资研究初学者及会计金融专业学生的23页PDF讲义。内容以公司价值评估为切入点,系统回溯了从股利贴现模型(DDM)、自由现金流模型(FCF)到现金流贴现模型(DCF)的演进逻辑,并以F-O模型(剩余收益模型)作为核心展开,详细呈现净剩余关系、动态线性信息模型及其在排除会计方法影响、提高估值准确性方面的优势;同时补充EVA、调整账面价值法、相对估价法与期权定价模型等实务工具,对比各模型适用场景与局限。文件仅1个PDF,大小83KB,轻量便携,适合作为估值建模入门或复习的参考笔记。目前已有124人学习。借助其中的公式推导与模型对比,读者能快速建立估值方法谱系,理解为什么不同模型会给出不同价值判断,从而在实际分析中更从容地选择合适工具。

1. 从 DDM 到剩余收益:估值建模的一次“记账视角”切换

股票定价这件事,金融学里讲了几十年,最朴素的想法是把未来股息贴现加总。可一旦真拿 DDM(股利贴现模型)去给一家不派息或者账面净资产很大的公司估值,结果往往离谱。那种感觉就像只盯着银行流水,却忽略资产负债表上已有的一批资产。F-O 模型(Feltham-Ohlson)在这条线上做了一次关键修正:把账面净资产写进定价公式,再叠加未来超常收益的折现。做量化的人把这看成从“现金流视角”切到“会计视角”,用净剩余关系把利润表与资产负债表缝合起来。这篇短文不打算做理论综述,而是把金融估值建模里的模型演进、参数估计和会计数据校准连起来。适合正在写建模代码的量化开发、风控策略和投研工程师。

2. 估值建模的演进:DDM、FCFF 与 DCF 的适用边界

在触及 F-O 之前,先看清楚传统现金流折现类模型的钱到底流在哪儿。DCF 最早源头可以追溯到 Irving Fisher 的《利息理论》:资产当前价值等于全部未来现金流量贴现之和。公司价值评估模型沿这条线分化:Williams 把现金流定义为股利得到 DDM;后来自由现金流 FCFF 接管了现金流方向;DCF 则是一个更上位的统称。做估值建模时,第一步不是调 WACC 或增长率的输入,而是选对现金流的口径。口径选错,后续所有敏感性分析都是在制造精确的错误。

2.1 三个模型的公式结构与输入差异

DDM 的基本形式为:

V = Σ d_t / (1+r)^t

其中 d_t 是 t 期股利。零增长、Gordon 固定增长、有限增长期 DDM 三种变体的区别,只在 d_t 的趋势假设上。Gordon 模型写成 V = d / (r - g),看起来简洁,但对 r 与 g 的敏感性极高。自由现金流模型 FCFF 则把 d_t 替换为 FCFF_t,分母利率从 r 换成 WACC:

V = Σ FCFF_t / (1+WACC)^t

实务里 FCFF 需要从 EBITDA 出发扣税、扣营运资本、扣资本开支。多数数据库会直接给 FCFF 字段,但要注意计算口径是否包含少数股东权益和重组费用。而 RIV/F-O 则把账面净资产 b_t 作为估值起点:

V_t = b_t + Σ E[x^a_{t+τ}] / (1+r)^τ,其中 x^a_t = x_t - r × b_{t-1}

所有模型最终都在回答同一个问题:未来某段现金流序列怎么折现。差异只在于用哪种可观测变量去预测它。我一般会先跑一组快速测试:同一家公司的数据,用 Gordon、两阶段 DDM 和 FCFF 分别估值,看结果差距有多大。下面用 Python 对比 Gordon 模型和简单 RIV 的差异。

def gordon_value(d0, g, r): """Gordon 模型:稳定增长下的股价估算""" if r <= g: return float('nan') return d0 * (1 + g) / (r - g) def riv_simple(b0, roe_steady, r, g): """ 简单 RIV:假设剩余收益按固定增长率 g 永续增长 xa = (roe - r) * b0 是当期超常收益 """ if r <= g: return float('nan') xa = (roe_steady - r) * b0 return b0 + xa / (r - g) # 参数:账面净资产 100,股利 4,ROE 0.12,折现率 0.10,增长率 0.03 b0, d0, roe, r, g = 100.0, 4.0, 0.12, 0.10, 0.03 print("Gordon 估值:", round(gordon_value(d0, g, r), 2)) print("RIV 估值:", round(riv_simple(b0, roe, r, g), 2))

参数说明:b0 表示当期每股账面净资产,d0 表示当期每股股利,roe 表示稳态 ROE,r 是权益资本成本,g 是剩余收益或股利的永续增长率。Gordon 模型把价值全部压在股利上;RIV 即使不派息,只要 ROE 高于 r,净资产仍然会通过剩余收益项产生价值。这是“记账视角”与“现金流视角”的分水岭,也是为什么后来 RIV 被大量用于银行、保险和周期股估值。

2.2 DDM 与 FCFF 的盲区:净资产去哪了

DDM 推导过程中,股利 d_t 被定义为公司分配给股东的全部现金流。这里隐含一个前提:公司无法利用账面净资产创造超过资本成本的价值,或者说净资产的市场价值永远等于其账面价值。真实世界里,净资产本身有盈利能力,比如银行股账面净资产极高,分红却不稳定——DDM 会把这类股票估得异常保守。FCFF 同样只看“未来经营现金流的折现”,没有显式地把当前净资产加进估值起点。以周期股为例,如果企业正处于行业低谷,未来 FCFF 预测容易偏悲观,但当下账面现金和固定资产却具备重置价值,这类信息在 F-O 模型里正好进入估值公式。

以下几点在建模文档里常被忽略:

  • FCFF 若只取年报数据,会漏掉季度营运资本波动,低估真实现金流波动。
  • DDM 在 A 股适用性天然受限,很多成长公司长期不分红,Gordon 模型参数 a 根本无法估计。
  • RIV 的初始账面净资产需要调整未实现损益,否则 CSR 残差会偏大。
模型分子现金流折现率是否显式包含账面价值对低股利公司适用性
DDM股利 d_tr_e
FCFF自由现金流 FCFF_tWACC尚可
RIV/F-O超常收益 x^a_tr_e

从表格可以看出,F-O 本质上是在 DDM 的基础上,通过净剩余关系将股利交换成账面价值加超常收益,使得不分红但资本回报高的公司也能被正确定价。

下面做一个“股利遮罩”测试:把派息率调成 0,DDM 估价直接归零,但 RIV 依然能给出有意义的结果。这个测试用来向交易台解释为什么模型不能只看现金流。

for payout in [0.3, 0.0]: d = roe * b0 * payout gordon_res = gordon_value(d, g, r) riv_res = riv_simple(b0, roe, g, r) print(f"payout={payout}: Gordon={gordon_res:.2f}, RIV={riv_res:.2f}")

代码把d在 payout 为零时变成 0,Gordon 返回 0,而 RIV 不受影响。这是 F-O 对传统模型最直接的一个修正:它的起点不是未来现金流,而是当下已经被会计记录下来的净资产。

3. F-O 模型的三层假设与 Python 可复现的参数估计

F-O 模型的完整形态由 Ohlson 在 1995 年前后定型,国内教材通常把它归入剩余收益模型(RIV)。它有三个支柱:DDM 成立、净剩余关系 CSR 成立、动态线性信息模型 LIM 成立。这三个支柱决定了我们能够从 DDM 出发,把股利替换为账面价值和剩余收益,然后对超常收益做自回归预测。

3.1 净剩余关系 CSR 如何把股利变成会计恒等式

净剩余关系写成如下等式:

b_t = b_{t-1} + x_t - d_t

其中 b 是账面净资产,x 是综合收益,d 是股利。它强调账面价值的变动只可能来自三处:净收益、净资本投入、股利分配。将 DDM 中的 d_t 替换成 b_{t-1} + x_t - b_t,再代入折现求和,可以推导出:

V_t = b_t + Σ E[x^a_{t+τ}] / (1+r)^τ

定义 x^a_t = x_t - r × b_{t-1},即企业净收益在扣除股东必要回报后的剩余。实际数据处理中,要使用综合收益而非净利润。A 股报表中综合收益包含其他综合收益(OCI),例如可供出售金融资产公允价值变动、外币报表折算差额,这些项不改净利润,却影响净资产。因此写建模脚本时,要从利润表和综合收益表里分别取数,否则 CSR 会不吻合。

3.2 动态线性信息模型 LIM 与参数 α 的解析

剩余收益的自回归部分,Ohlson 引入如下 LIM:

x^a_{t+1} = ω × x^a_t + v_t + ε1
v_{t+1} = γ × v_t + ε2

其中 v_t 代表剩余收益之外的其他信息变量,如分析师预测修正、订单储备或未纳入会计的商誉变量。代入 RIV 后得到:

V_t = b_t + α1 × x^a_t + α2 × v_t

其中 α1 = ω/(1+r-ω),α2 = (1+r) × γ / [(1+r-ω)(1+r-γ)]。

在应用层面,v_t 多数时候找不到干净的代理变量。我常见到的做法是直接把它省略,退化为仅含一阶自回归的 LIM。这时模型估计只需要回归 x^a_{t+1} ~ x^a_t,取斜率估计 ω。下面用 Python 模拟 LIM 过程并反推 α:

import numpy as np import statsmodels.api as sm np.random.seed(42) n = 1000 r, omega, gamma = 0.10, 0.7, 0.4 true_xa = np.zeros(n) true_v = np.zeros(n) for t in range(1, n): true_v[t] = gamma * true_v[t-1] + np.random.normal(0, 0.02) true_xa[t] = omega * true_xa[t-1] + true_v[t-1] + np.random.normal(0, 0.05) # 估计:忽略 v_t,仅回归一阶自回归过程 X = true_xa[:-1] y = true_xa[1:] X_const = sm.add_constant(X) model = sm.OLS(y, X_const).fit() print(model.summary().tables[1]) omega_hat = model.params[1] alpha1_hat = omega_hat / (1 + r - omega_hat) print(f"估计 omega={omega_hat:.3f}, alpha1={alpha1_hat:.3f}")

逻辑说明:模拟的 v 作为不可观测的“其他信息”进入 xa,回归中省略它,导致 omega_hat 与真实值 0.7 出现偏离。实际做 F-O 时,如果 LIM 中遗落了重要变量,超常收益的持续性系数会被高估,α1 随之偏大,估值溢价虚高。参数说明:r 是折现率,omega 是剩余收益自回归系数,gamma 是其他信息的自回归系数。

回归结果可用下表记录,便于报告输出:

参数符号估计值标准误含义
截距α0-0.00120.0009剩余收益的长期均值偏移
超常收益滞后项ω0.6820.031超常收益持续性
-0.214-一阶自回归解释力

这里的 R² 不需要太高,因为 LIM 的目的是捕捉持续性,而不是预测精确值。持续性系数只要显著且稳定在 0 到 1 之间,模型就可以用于排序和相对价值比较。

3.3 一个可抄的估值表计算器

对多期横截面数据,可以使用滚动 OLS 估计每一年的 LIM 参数,进而构造面板级 F-O 估值。先定义一个函数,输入面板数据中的公司 id、年度、账面净资产 b、综合收益 x 和折现率 r,输出估计的 V:

def estimate_riv_panel(df, r): df = df.sort_values(['firm_id', 'year']).copy() df['b_lag'] = df.groupby('firm_id')['b'].shift(1) df['xa'] = df['x'] - r * df['b_lag'] df['xa_lag'] = df.groupby('firm_id')['xa'].shift(1) reg_df = df.dropna(subset=['xa', 'xa_lag']) X = sm.add_constant(reg_df['xa_lag']) y = reg_df['xa'] res = sm.OLS(y, X).fit() omega = res.params['xa_lag'] last = df.dropna(subset=['xa']).groupby('firm_id').tail(1).copy() last['V'] = last['b'] + omega / (1 + r - omega) * last['xa'] return last[['firm_id', 'year', 'V']]

说明:b_lag 用来计算 t-1 期的净资产,xa 是剩余收益,omega 由回归得到。这样写可以一次处理多只股票、多年的数据,是搭建基本面量化选股因子库时常见的用法。注意这里使用的是会计年度数据,因此需要先对齐披露日期,避免未来函数。

4. F-O 模型的扩展路径:Feltham-Ohlson、税收与 LIM 的改进

F-O 是一个开放框架,后续研究基本围绕三条线:LIM 的信息扩展、CSR 的偏差修正、税收因素引入。三个方向对实际建模分别有直接影响:信息扩展影响输入的因子选择,CSR 修正影响收益与账面指标的勾稽方式,税收则影响折现率与超常收益的计算口径。

4.1 LIM 信息扩展的典型方案

Ohlson 在 1995 年只放入一个抽象的 v_t,1996 年 Feltham 和 Ohlson 把资产分为经营资产和金融资产,将投资额、存货、订单储备等变量显式加入 LIM。Myers(1998)进一步把订货储备作为前导信息变量代入。反映到量化团队的操作层面,就是寻找一组能够预测未来超常收益的基本面指标,例如营运资本变动、在建工程增速、管理层指引修正。与其堆叠特征,不如先检验每项指标与未来 xa 的偏相关性,再决定放入哪一层 LIM。

4.2 Feltham-Ohlson(1996)回归方程式拆解

Feltham-Ohlson(1996)模型把超常收益的动态写成如下形式:

xa_{t+1} = ω11 × xa_t + ω12 × b_t + ε1
b_{t+1} = ω21 × xa_t + ω22 × b_t + ε2

在实证中,通常使用联立方程估计。作为快速验证,分别跑两个 OLS 是常见做法。下面代码演示在面板数据上估计 ω11 与 ω12:

def estimate_feltham_ols(df, r): df = df.sort_values(['firm_id', 'year']).copy() df['b_lag'] = df.groupby('firm_id')['b'].shift(1) df['xa'] = df['x'] - r * df['b_lag'] df['xa_lag'] = df.groupby('firm_id')['xa'].shift(1) df['b_lag2'] = df.groupby('firm_id')['b'].shift(2) reg_df = df.dropna(subset=['xa', 'xa_lag', 'b_lag2']) X1 = sm.add_constant(reg_df[['xa_lag', 'b_lag2']]) y1 = reg_df['xa'] res1 = sm.OLS(y1, X1).fit() return res1.params

参数说明:b_lag2 是滞后两期的账面净资产,用它近似上一期期初净资产,用于捕捉稳健主义对账面价值的影响。输出结果中,xa_lag 的系数衡量超常收益的持续性,b_lag2 的系数衡量净资产对后续超常收益的边际贡献。注意,该回归没有显式包含 v_t,残差项会被放大,因此做显著性检验时要用异方差稳健标准误。

4.3 引入税收的 F-O 修正

Tao Zeng(2001)将公司所得税纳入剩余收益模型,关键是把税后收益中的资本成本扣减从税前利息调整为税后实际成本。落到代码层面,主要体现在 x 选取时使用税后净营业利润,r 相应使用权益成本,避免与 WACC 混淆。另一分支,Michelle Hanlon 等(2003)研究股利税收对模型的影响,其结论是个人所得税近乎不影响公司价值估计。这在 A 股做 F-O 时不必刻意对个人所得税做二次修正,但须保证公司税率假设与现金流口径一致。

扩展方向需要修改的输入影响输出
Feltham-Ohlson将净资产拆分为经营/金融估值起点 b 替换
引入公司所得税使用税后收益 x_after_tax剩余收益变小
股利税收折现率 r 使用税后投资者回报影响有限
LIM 增加 v加入分析师预期、订单数据α2 项变大

针对 A 股的实操,我会在计算 xa 前统一把综合收益调整到税后口径,再扣减 r×b。这样可以避免“税盾”在分子和分母中重复计算。

4.4 用残差检验 CSR 是否被破坏

CSR 未必总是成立:股票回购会减少净资产,却不影响综合收益。此时直接用 b_t - b_{t-1} - x_t + d_t,残差会显著不为 0。写一个验证函数对数据做清洗是必要的:

def check_csr(df): df = df.copy() df['csr_error'] = df['b'] - df.groupby('firm_id')['b'].shift(1) \ - df['x'] + df['d'] return df.groupby('firm_id')['csr_error'].std()

注意:d 在财务报表中应取实际支付的现金分红,而不是宣告分红。很多数据库给出的 dividend 是宣告值,在 CSR 检验中会造成系统性误差,需要先切换到现金支付口径再计算。这里也是会计数据校准最容易出错的地方。

5. 实操中容易踩中的四个参数坑

估值建模线上部署时,模型选型之后,真正决定结果可靠性的是参数口径。以下四个坑是把 F-O 模型真正用在投研和量化策略前必须处理的。

第一个坑是账面净资产 b0 的时点。F-O 要求使用最新一期报告期末净资产,但公告日期与报告期之间有数月时滞。常见做法是维护一张announcement_lag映射表,用 T-1 或 T-2 期已披露的 b 作为估值起点,避免未来函数回测。第二个坑是折现率 r。虽然理论上 r 等于股权资本成本,但同一家公司用 CAPM、APT 与历史收益率均值计算出来的 r 可能相差超过 2 个百分点。r 对 α1 影响很大,因为 α1=ω/(1+r-ω),r 微小变化会传导到估值溢价。我一般用三档 r(悲观、中性、乐观)做敏感性区间,而不是只给单值。

第三个坑在超常收益的持续性系数 ω。很多团队直接使用全样本 OLS 估计出一个固定 ω,忽略了行业与周期差异。稳妥的办法是按行业和年份滚动估计,并检查 ω 是否在 0 到 1 之间。如果 ω 大于 1,说明模型设定有误,或数据中包含未消除的会计准则变更影响。此时先做平稳性检验,再去趋势化,最后再拟合一阶自回归。第四个坑是 v 变量的代理选择。若在 LIM 中加入订货储备、分析师盈利修正或信用利差等变量,要注意它们与 xa 之间是否存在同期相关。一旦同期相关,OLS 估计会恶化。使用一阶滞后变量可以降低内生性,代价是信息量下降,需要在偏差与方差之间取舍。

最后给出一个可直接复制的预测函数,把上述修正合并进去:

def fo_val_last_row(row, omega, r): b_latest = row['b_adj'] xa_latest = row['xa'] - r * row['b_adj'] return b_latest + omega / (1 + r - omega) * xa_latest

这里的 b_adj 是剔除其他综合收益后、与 CSR 匹配的账面净资产。将 omega 用分行业滚动估计值传入,就能生成一版相对稳健的 F-O 估值序列。该公式假设未来超常收益按照固定 ω 衰减,不包含额外信息 v 的贡献,属于偏保守估计。若要更精细,可在 b_adj 基础上增加分析师预期因子,扩展为完整 LIM 版本。

本文还有配套的精品资源,点击获取

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

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

立即咨询