第 13 章/ 45
面向量化研究的估值(Valuation for Quants)
主线:先把财报现金流、普通股市值(common equity market capitalization)和各类资本索取权放在同一口径,再谈估值比率或折现结果。先修:第 4、11、12 章。完成后,你能计算企业价值(enterprise value, EV)与普通股股权价值(common equity value)之间的桥,解释常用估值比率,构造现金流与贴现率匹配的贴现现金流估值(discounted cash flow, DCF),并把它变成无前视的候选基本面信号。
1. 本章目标
完成本章后,你应能:
- 由同一估值日的普通股市值和已定义的现金(cash)、有息债务(interest-bearing debt)、优先股(preferred equity)、少数股东权益(noncontrolling interest, NCI)及非经营资产(nonoperating assets, NOA),复算企业价值(enterprise value, EV),再从 EV 桥回普通股股权价值。
- 写出市盈率(price-to-earnings, P/E)、市净率(price-to-book, P/B)、企业价值/息税折旧摊销前利润(enterprise value to earnings before interest, taxes, depreciation and amortization, EV/EBITDA)、企业价值/息税前利润(enterprise value to earnings before interest and taxes, EV/EBIT)、盈利收益率(earnings yield)和自由现金流收益率(free cash flow yield, FCF yield)的分子、分母、单位、期间、股东范围与可比较条件。
- 识别现金流索取权,并坚持企业自由现金流(free cash flow to firm, FCFF)配加权平均资本成本(weighted average cost of capital, WACC)与 EV;股权自由现金流(free cash flow to equity, FCFE)配股权成本(cost of equity)与普通股权益价值。知道经营活动现金流减资本开支(cash flow from operating activities less capital expenditures, CFO−CapEx)常是一个有用代理,却不自动等于 FCFF 或 FCFE。
- 推导有限期贴现现金流估值(discounted cash flow, DCF)、WACC 与戈登增长终值(Gordon growth terminal value, TV),解释重要假设;用敏感性和终值份额判断数值主要由什么驱动。
- 按点时信息(point-in-time, PIT)财报版本的可用时间、实际入库时间、市场估值时点和证券股类构造候选截面信号,并设计分母为零、为负或缺失时的规则。
完成条件:本章手算结果可以逐项复核;同章答案覆盖全部题号;核心 Python 函数可从干净项目环境导入;每个示例都把构造输入与公司披露分开。
2. 为什么 Quant 需要它
价值研究不是把几个比率排个名。财报先给出某段期间的会计利润或现金流;研究者再判断现金归谁、哪些项目属于经营、哪一版在信号时点已可用;市场数据给出某时点对不同索取权的定价;随后才有可能构造一个跨公司可比较的分子/分母。任一步口径错了,排序就可能把融资差异、会计差异或前视信息当成便宜与昂贵。
这条链是:报表行和期间 → FCFF 或 FCFE → 匹配的贴现率 → EV 或普通股价值 → 可比比率 → PIT 横截面信号 → 行业中性与样本外检验。每个后续量都继承前一步的边界。比如,若把合并口径的息税折旧摊销前利润(earnings before interest, taxes, depreciation and amortization, EBITDA)除以只包含母公司普通股的市值,分母漏了债权人、优先股和非控股股东的索取权;若再把这个错配比率送入组合排序,漂亮的排名也没有经济含义。
本章学习的是测量、估值关系和研究设计。低倍数不等于低风险或未来超额收益;DCF 结果也不是可观测的“真值”。我们可以在没有真实历史行情的情况下验证公司披露的报表算术,也可以用构造价格演示公式,但不能把后者说成真实市值、真实估值或实测策略绩效。
3. 直觉
想象两家同一行业的软件公司,市值都是一项对普通股的索取权。甲公司债务少、现金多;乙公司债务多,还有优先股和少数股东权益。若只问“普通股股东为盈利付了多少”,用市值对普通股净利润的 P/E 是一个合适起点。若问“所有经营资本提供者为税前利息与折旧前经营利润付了多少”,就要把债务、优先股和少数股东权益加进市值,并从中扣除现金等非经营资产,再除以同一合并范围的 EBITDA。两种倍数回答不同问题。
再看现金流。工厂产生的现金要先覆盖营运资金和资本开支,然后才分配给债权人和股东。FCFF 是在偿付债务前、可供全体资本提供者使用的经营现金流;FCFE 是利息、税和净借款调整后归普通股的现金流。前者折现后得到企业经营价值,后者折现后直接得到普通股价值。若把归股东的现金流按全体资本成本折现,或把经营现金流按股权成本折现,就在同一数值里混了两类索取权。
所以,最先问的不是“这个倍数是多少”,而是:“谁的价值在分子,谁的现金流或利润在分母?分母对应哪一期、哪一版?市场价格取自哪个时点?”这三个问题把会计、资本结构和信息时点连在一起。
4. 数学基础
金额用 Amount 记为有符号数值、币种和单位三元组。比如 x 表示,收益率用小数或百分数表示。
要区分三种时间对象:损益表与现金流量表的流量属于期间 available_at、ingested_at 和 accession。研究截点为 signal_time 时,源头与本地数据都必须已就绪;下单时点 trade_time 必须晚于信号形成;收益从持仓真正生效后开始测量。
因此,估值比率中的分母虽然也以金额表示,不能只因量纲同为“美元”就随便配对:FY2024 的流量和市值不是同一统计期间,但 P/E 等 trailing ratio 可以把截至信号时已公开的 FY2024 或过去十二个月盈利,配上信号时的市值。必须明确这是 trailing 估值口径,并且相应版本已经可用。资产负债表的现金、债务、普通股账面权益则取同一已知结账日和同一披露版本。
5. 正式定义
5.1 股权市值、企业价值与普通股价值
股权市值(equity market capitalization) 是指定日期所有相关普通股类别的价格乘以该日期相应流通股数,再按币种和单位求和。若只有一个股类,可写作
5.2 股权比率与盈利收益率
市盈率(price-to-earnings, P/E) 用普通股市值除以归属于普通股股东的净利润(net income attributable to common shareholders,
市净率(price-to-book, P/B) 是普通股市值与普通股账面权益(common book equity,
盈利收益率(earnings yield) 是
5.3 企业倍数与现金流收益率
息税折旧摊销前利润倍数(EV/EBITDA) 为 EV 除以同期间、同合并范围的 EBITDA;EV/EBIT 则用 EBIT。EBITDA 通常不属于唯一标准报表行,应记录原始行、调整项目和公司/研究者定义。此两种分母属于经营层面,EV 需要覆盖对应的债权、优先股和非控股索取权。EBIT 或 EBITDA 为零/负时常规倍数不用于横截面排序。
自由现金流(free cash flow, FCF) 一词口径很多,本章区分三类:
- 企业自由现金流(free cash flow to firm, FCFF):息税前利润(earnings before interest and taxes, EBIT)按经营税率
转为税后经营利润,公式为 。折旧与摊销(depreciation and amortization, D&A)是非现金费用;资本开支(capital expenditure, CapEx)用正支出金额;经营营运资本(net operating working capital, NWC)的增加额 使用现金; 是明确列出的其他经营现金调整。各金额同币种、单位和预测期间。 - 股权自由现金流(free cash flow to equity, FCFE):以下简式先限定为只有普通股与债务的公司;各现金流项目必须属于同一普通股经营范围。
。 是归属普通股股东的净利润;净借款(net borrowing)等于新增债务减去偿还债务,正数向股权资金提供现金。 - 经营活动现金流(cash flow from operating activities, CFO)减资本开支:
是常见现金流代理。它必须标成研究者采用的具体定义或 proxy,不能自动重命名为 FCFF。
以上现金流单位都是货币/期间。符号约定很重要:报表上的固定资产购置(property, plant and equipment, PP&E)通常以负现金流列示;公式里的
FCF 收益率(FCF yield) 需标记索取权:
5.4 贴现现金流、WACC 与终值
贴现现金流估值(discounted cash flow, DCF) 是未来预期现金流折算为估值日现值。若现金流每年年末发生:
加权平均资本成本(weighted average cost of capital, WACC) 的简化普通股与债务形式为:
这里的权重用市场价值,因为贴现率要反映估值日各类资本索取权的相对价值;账面权益是历史会计余额,不能直接代替市场权重。若企业现金流包含合并子公司的全部经营活动,母公司普通股市值本身没有覆盖 NCI。范围较完整的一般式为:
其中各金额均为估值时点的市场价值,
市场价值权重、优先股成本及贴现率与现金流风险匹配的讨论见 Damodaran, DCF Inputs;gross/net debt 与现金处理的口径关系见 Damodaran, What Is Debt?。gross-debt 与 net-debt 估值路径对现金风险与权重有不同处理;应将选定路径一致用于 EV 桥、权重、资本成本和经营现金流,不可只在 EV 中扣现金而忽略成本口径。这些材料提供估值框架,不规定每个发行人的现金、NOA、NCI 或租赁唯一处理;实际估值仍须使经营风险、资本成本和价值桥范围一致。
FCFF 折现用 WACC 得企业经营价值(随后再做索取权桥);FCFE 折现用股权成本得普通股价值。资本资产定价模型(capital asset pricing model, CAPM)可作为一个明示假设的股权成本模型,例如
6. 推导
6.1 从市值桥到可比倍数
若市场为普通股支付
之后,每个倍数的分子要和分母同层级:
- 市值与普通股股东净利润、普通股账面权益相配,得到 P/E 与 P/B。
- EV 与合并范围经营利润、折旧前经营利润相配,得到 EV/EBIT 与 EV/EBITDA。
- 普通股 FCFE 与市值相配,或者企业 FCFF 与 EV 相配,得到相应 FCF yield。
这不是纯粹记忆分类:如果先完成 EV 桥,就能追问倍数中遗漏了哪一类资本提供者;如果先确定现金流索取权,就能反推贴现率与估值对象。
6.2 从会计现金流到 FCFF 与 FCFE
令税后经营净利润(net operating profit after tax,
这个起点在付利息和本金前,因此属于公司全部融资方。相对地,从归属普通股的净利润出发,它已经扣过利息与税;加回非现金 D&A、扣资本投入和营运资金增加,再加入净借款,才得到归普通股的可用现金:
上述 FCFE 简式以及下面的桥接式限定为单一普通股与债务、同经营范围、利息税盾可实现且其他会计调整已一致处理。若存在优先股或 NCI,从归属母公司普通股净利润出发却加回全集团 D&A、扣全集团资本开支,会混合索取权;应先构造同范围全部权益现金流,再扣非控股及优先股应享现金,或直接逐项构造母公司普通股现金流。不得只在期末 EV 桥中减去 NCI 就认为期间 FCFE 已纠正。在简单债务税盾假设下,
然而,
6.3 从现金流到折现与终值
先把第
一般几何级数的收敛条件是比率绝对值小于 1。本章限定
7. 金融解释
7.1 倍数到底在比较什么
P/E 和 P/B 的分子是普通股市场定价,适合先问股东为每单位归属盈利或账面净资产付多少。它们会把杠杆和非经营资产的影响留在普通股定价中。P/E 还受增长、利润波动、回购、一次性费用、税负、会计政策影响;P/B 对金融企业有时更贴近其资产/资本约束,但对研发、品牌等大量未资本化无形资产的企业,账面值和经营资本可能差得很远。
EV/EBITDA 把净债务之外的资本结构因素在分子做了一层统一,并使用未扣折旧的经营结果;因此资本开支强度不同的公司,EV/EBITDA 可能看起来相似,但可持续自由现金流不同。EV/EBIT 将折旧摊销纳入经营成本,更能暴露资产折耗差异,却仍不扣资本开支和营运资金。没有一个倍数可以替代对现金、再投资和风险的检查。
7.2 税、利息、租赁与期间要一致
FCFF 应从经营利润按经营现金税近似构造,不能一边用含利息的净利润,一边又给 FCFE 加回错误的税后利息。FCFE 从已扣融资成本后的普通股收益出发。WACC 中债务成本乘
租赁处理尤其容易把企业间会计差异引进 EV/EBITDA 或 FCF 比率。若把租赁负债视为债务加进 EV,就要检查 EBIT/EBITDA 及现金流里租金、使用权资产折旧和租赁本金/利息怎样归类;若将租金视为持续经营费用,则 EV 桥不能再次把同一承诺加成债务。训练代码没有把租赁负债自动加进案例,原因是这属于显式口径选择,不是“自动更精确”。
7.3 终值与量化信号的边界
有限预测期之外的终值往往占 DCF 很大比例。高终值份额告诉我们结果对稳定期假设敏感,不告诉我们模型正确或公司便宜。每次估值应至少检查
量化研究通常把基本面压缩成可排序指标,而不是为单家公司的“内在价值”盖章。行业内经营模式和会计模式更接近时,倍数和收益率较可能比较;在行业中性排序之后,还需审查规模、杠杆、盈利质量、流动性、估计风险和因子暴露。因子定义、可用时点和交易时延应冻结在回测之前,然后对样本外、退市公司、修订版本和交易成本做反证。任何排名都只是一个待检验假说。
8. Numerical Example
一个可手算 WACC 例子仍用构造金额,并假定普通股与债务市场权重及相应成本匹配该简化经营风险:
9. Python Implementation
本读者版的默认运行入口
从接受I3读者包根目录,按其环境说明建立环境后运行:
.venv/bin/python run_notebook.py notebooks/ch13_valuation.ipynb
Notebook调用随包共享实现。第13章Orion/Lyra、预测现金流、资本成本、PIT时钟与市值均为构造;Apple小节仅核财报行。默认只展示随包既有两张图,不重绘;运行器把新内核执行记录写入唯一的runs/execution_*目录,Notebook另建立唯一UUID的本章方法目录并打印位置。两目录用途不同,不把既有图说成本批新产物。未随包提供的French数据不默认读取,也不下载。下方CLI及旧制作测试按课程工作根解释;读者用上方Notebook内断言,旧制作测试未随包时不要求补回。英文Notebook的Markdown层仍待BIL23装配,本批未执行Notebook或旧数值套件。
历史课程工作根与原实现
核心函数在 valuation.py,入口和图表在 ch13_valuation.py,测试在 test_ch13_valuation.py,教学 Notebook 在 ch13_valuation.ipynb。模块不下载数据。金额类要求显式币种与单位;倍数函数对非正分母返回 None;FCF yield 对现金流保留正负号,并检查索取权是否匹配;PIT 选择同时检查 available_at 和 ingested_at。
构造案例由相同的核心接口计算,示范如何从价格与百万股数得到市值,再完成 EV 桥和倍数。可以在项目目录运行:
from pathlib import Path
import sys
sys.path.insert(0, str(Path.cwd() / "src"))
from quant_course.valuation import Amount, enterprise_value, price_to_earnings
market_cap = Amount(600.0, "USD", "USD millions")
debt = Amount(100.0, "USD", "USD millions")
cash = Amount(50.0, "USD", "USD millions")
net_income = Amount(30.0, "USD", "USD millions")
ev = enterprise_value(market_cap, debt, cash)
print(
f"EV={ev.value:.0f} USD millions; "
f"P/E={price_to_earnings(market_cap, net_income):.2f}x"
)
本章的示例频率为年度财报流量与同一构造信号时点的市场金额。PIT 演示使用带 Z 的构造 UTC 时间;较晚修订即使回写了相同财政期间,也不能改写较早 signal。市场快照不得晚于 signal_time。示例 trade_time 置于 signal_time 之后;真实执行还需可交易日历、撮合延迟与订单约定。本章没有计算任何真实 return interval。
10. Visualization

EV 索取权桥图的横轴是 USD millions,纵轴分列构造的公司与桥接项目。每根条从前一累计值增加或扣减,虚线标注最终 EV。Lyra 的优先股与 NCI 抬高 EV,现金与非经营资产压低 EV;Orion 仅显示市值、债务和现金。

终值份额敏感性图横轴是 FCFF 使用的年度 WACC,纵轴是年度永续增长
两图均由 CLI 根据章节中列出的构造数字生成,不含市场观测或抽样随机数;没有随机种子需求。图轴和图下注明单位与假设。
11. Real Market Example
真实来源例只核验报表事实,不给真实估值或市场表现。Apple FY2024 Form 10-K 的合并报表列示 FY2024 营业利润 123,216、净利润 93,736 USD millions,摊薄 EPS 为 USD 6.08;计算摊薄 EPS 所用加权平均摊薄股数为 15,408,095 thousand shares。FY2024 报告日为 2024-09-28,文件 accession 为 0000320193-24-000123。这些数字说明 EPS 的分子/分母口径,但没有同一时点的验证价格,也没有证券类别映射和历史市值快照,因此本章不计算 Apple 的真实 P/E、P/B 或 FCF yield。Apple FY2024 Form 10-K
Apple filing 中“issued and outstanding shares”与 EPS 的加权平均摊薄股数也不是同一个字段;例如资产负债表的股数是结账日股票存量,EPS 股数是财政年度内的加权平均数。建立股权市值时应使用估值日对应股类的当期流通股数;若改用每股价格/EPS,也要披露 EPS 期间、基本/摊薄选择和股数基础。真实市场市值需价格、全部相关普通股类别、ADR 换算和交易时点都得到验证;这章没有下载这些数据,故无行情样本期、频率或文件哈希。
12. Common Mistakes
12.1 把 FCFE 除以 EV
若将 Orion 的 cash_flow_basis="FCFE" 与 claim_basis="EV" 的调用会报错。
fcfe = 28.0
equity_value = 600.0
enterprise_value_amount = 650.0
wrong_yield = fcfe / enterprise_value_amount
correct_yield = fcfe / equity_value
assert round(wrong_yield * 100, 2) == 4.31
assert round(correct_yield * 100, 2) == 4.67
12.2 把负 P/E 当成最便宜
负盈利企业的市盈率会得到负值,排序算法可能把最小的负数放在“最低估值”第一名。分母符号在这里改变经济解释,应把 P/E 设为不可比较,并另设亏损标记;要保留可以算的负盈利收益率时,应把它作为另一特征,并另行定义排名和缺失策略。
pe = {"亏损公司": 480.0 / -20.0, "盈利公司": 600.0 / 30.0}
wrong_order = sorted(pe, key=pe.get)
def comparable_pe(market_cap: float, net_income: float) -> float | None:
return market_cap / net_income if market_cap > 0 and net_income > 0 else None
safe = {
name: comparable_pe(480.0, -20.0)
if name == "亏损公司"
else comparable_pe(600.0, 30.0)
for name in pe
}
assert wrong_order[0] == "亏损公司"
assert safe["亏损公司"] is None and safe["盈利公司"] == 20.0
12.3 把 (CFO-CapEx) 自动称为 FCFF
CFO 常包含已付利息和现金税,营运资金变化也已通过现金流调节;会计准则还可能不同地归类利息。FCFF 应从税后经营利润扣经营再投资,故要检查利息/税/营运资金是否重复或缺漏。下列代码比较一项账面现金流 proxy 与基于经营利润构造的 FCFF:
cfo = 44.0
capex = 15.0
reported_cfo_less_capex = cfo - capex
ebit, tax, da, change_nwc = 50.0, 0.25, 10.0, 5.0
fcff = ebit * (1 - tax) + da - capex - change_nwc
assert reported_cfo_less_capex == 29.0
assert fcff == 27.5
两数不同并不单独说明哪项报表有错;要追到利息、税、非现金调节、营运资金定义、资本化及版本。
12.4 EV 与运营分母范围不一致
12.5 把“当前市值”配给未来财报或用错期间
报告期间结束不等于市场可知日。用数据库今天展示的 FY2024 后续重述值去回填此前信号,会把当时还不可见的信息塞进排序。下面故意先用“最新版本”算错早期收益率,再让核心 PIT 函数只选 signal_time 当时已公开且已入库的版本:错值是 4.17%,当时可复现的值是 4.67%。市场金额同样必须取不晚于信号时点、且股类和估值日期匹配的快照。
from datetime import date, datetime, timezone
from pathlib import Path
import sys
sys.path.insert(0, str(Path.cwd() / "src"))
from quant_course.valuation import FinancialVintage, select_pit_vintage
utc = timezone.utc
def vintage(available, ingested, accession, fcfe):
return FinancialVintage(
issuer_id="SYNTHETIC-1", security_id="SYNTHETIC-A", fiscal_period="FY2024",
period_end=date(2024, 12, 31),
available_at=datetime.fromisoformat(available).replace(tzinfo=utc),
ingested_at=datetime.fromisoformat(ingested).replace(tzinfo=utc),
accession=accession,
currency="USD", unit="USD millions", net_income_common=30.0,
common_book_equity=180.0, ebit=50.0, ebitda=75.0, free_cash_flow=fcfe,
cash_flow_basis="FCFE", industry="Software",
)
versions = [
vintage("2025-02-15T12:00:00", "2025-02-16T09:00:00", "SIM-ORIGINAL", 28.0),
vintage("2025-04-02T12:00:00", "2025-04-02T14:00:00", "SIM-RESTATED", 25.0),
]
signal_time = datetime(2025, 3, 31, 16, 1, tzinfo=utc)
market_cap_at_signal = 600.0 # 构造的 3 月 31 日市值,USD millions
wrong_latest = max(versions, key=lambda row: row.available_at)
wrong_yield = wrong_latest.free_cash_flow / market_cap_at_signal
selected = select_pit_vintage(
versions, security_id="SYNTHETIC-A", fiscal_period="FY2024", signal_time=signal_time
)
correct_yield = selected.free_cash_flow / market_cap_at_signal
assert wrong_latest.accession == "SIM-RESTATED"
assert selected.accession == "SIM-ORIGINAL"
assert round(wrong_yield * 100, 2) == 4.17
assert round(correct_yield * 100, 2) == 4.67
print(f"错误的未来重述收益率={wrong_yield:.2%}; PIT 收益率={correct_yield:.2%}")
真实研究还须保留 period_start/end、accession、available_at、ingested_at、signal_time、市场快照 as_of 和股类有效期。
本章所有三参数 MarketCapSnapshot 构造示例都明确假设:as_of 时行情已公开、已入库,所乘股数是当时已知的历史股数,并且 EV 各组成使用同一信号时点已知的财报版本。这个假设只用于构造演示;真实数据必须分别提供市场数据的 available_at 和 ingested_at,与 as_of 一起受 signal_time 限制。历史报价时间不等于研究者获得数据的时间,当前流通股数也不能倒乘历史价格。双时钟选择还不包括第12章的不再依赖公告状态机;实务需继续排除已知失效版本。
若重述版只在公开后更晚入库,即使 available_at 合格也不能使用。版本冲突应拒绝或进入审查队列;缺失值不能静默填零。
12.6 混淆股本口径、单位或租赁政策
价格单位是货币/股,股数若以百万股记录,乘积才是货币百万;收入或利润若也以百万计,金额比中的单位才能约掉。用美元总市值除以“美元百万元”利润会产生一百万倍错误。下面用构造的 60 美元股价和 1,000 万股展示:正确市值是 600 USD millions,P/E 是 20x。即使单位没错,只用 A 股价格乘 A+B 两类股数也会错:两类股分别按 60 与 30 美元计价时,总市值应是 540,而不是 600 USD millions。
from pathlib import Path
import sys
sys.path.insert(0, str(Path.cwd() / "src"))
from quant_course.valuation import market_cap_from_price
price_usd_per_share = 60.0
shares_millions = 10.0
net_income_usd_millions = 30.0
market_cap = market_cap_from_price(price_usd_per_share, shares_millions)
wrong_pe_mixed_units = (price_usd_per_share * 10_000_000) / net_income_usd_millions
correct_pe = market_cap.value / net_income_usd_millions
assert market_cap.value == 600.0
assert wrong_pe_mixed_units == 20_000_000.0 and correct_pe == 20.0
class_a_price, class_a_shares_m = 60.0, 8.0
class_b_price, class_b_shares_m = 30.0, 2.0
wrong_single_class_cap = class_a_price * (class_a_shares_m + class_b_shares_m)
correct_all_class_cap = (
class_a_price * class_a_shares_m + class_b_price * class_b_shares_m
)
assert wrong_single_class_cap == 600.0 and correct_all_class_cap == 540.0
print(
f"混用 USD 与 USD millions: 错误 P/E={wrong_pe_mixed_units:.0f},"
f"正确 P/E={correct_pe:.0f}x"
)
print(
f"漏用 B 类价格: 错误市值={wrong_single_class_cap:.0f},"
f"正确市值={correct_all_class_cap:.0f} USD millions"
)
租赁一致性处理见 §7.2。还要核对 ADR 比率、拆股调整、基本/摊薄 EPS 股数基础、受限现金及非经营投资处理,避免同一项目重复扣加。
13. Quant Research Application
把 valuation 指标当成基本面候选信号,可按以下流程推进。
- 声明假设和母体。 固定证券永久标识、可交易股类、行业、退市处理、财政期间与公司分类。若只研究普通股,就用普通股收益、市场值和账面值;若经营利润为合并口径,EV 的 NCI 也使用相同范围。
- 冻结财报特征。 对 P/E 明确 trailing net income 或 EPS 定义;对 P/B 明确母公司普通股账面权益;对 EV/EBITDA 和 EV/EBIT 记录原始报表行和调整;对 FCF yield 选择 FCFE/market cap、FCFF/EV 或独立命名的 (CFO-CapEx) proxy。保留税、利息、租赁、现金、债务、股数、币种和单位处理版本。
- 按时点筛选和配价。 一个候选财报版本须满足外部
available_at≤signal_time且本地ingested_at≤signal_time。财报的报告日、申报接收串和数据入库不互相替代。市场值必须来自信号截点当时或更早的价格和股数;全股类聚合、公司行动调整、ADR 换算、汇率和交易所日历有独立来源。若价格是收盘价,信号计算和订单生成发生于其后,trade_time取下一可执行时点,持有期收益从实际持仓生效后开始。 - 设置数值边界。 市值/EV 非正则整项无效;P/E、P/B、EV/EBIT、EV/EBITDA 的分母非正就保留“亏损/零/负权益”原因且不进单调排序;缺失项保留“来源缺失/映射失败/单位冲突/版本冲突”等状态。负 earnings yield 或负 FCF yield 可保留符号,但与正值不混成未经设计的“便宜排名”。
- 先行业内比较,再检验因子。 每个 signal date 在行业内按预先定义的方向做百分位或稳健标准分数,再形成组合;对盈余为负/负净资产公司报告排除占比并做替代规则敏感性。基准可以是行业内等权或行业中位数;不要只对着大盘解释组合表现。
- 做反证和成本后验证。 用滚动训练/验证/样本外区间,固定 rebalance、执行滞后、停牌/退市和财报版本规则。比较不同行业、规模、杠杆和财务困境暴露;测换手、买卖价差、冲击、佣金、借券和流动性限制。改变单一晚到版本不应改变早期信号;加入未来市值、未来财报、未来成分或修订值应被测试捕获。任何新结果都应和行业基准、简单账面/盈利排序及成本前后同时报告。
这里没有构造历史证券面板,也没有下载市场价、行业分类或执行成本,所以不报告因子收益、显著性、容量或投资结论。若之后开展实证,应先冻结数据 schema 和资格规则,再用实际可验证的版本链做研究。
14. Chapter Summary
估值中的第一件事是确定索取权。普通股市场值搭配普通股利润和权益,EV 搭配覆盖所有资本提供者的经营量;FCFE 与股权成本给普通股价值,FCFF 与 WACC 给企业经营价值。现金流口径、税、利息、租赁和 NCI 范围都得前后一致。EV 桥和倍数建立了可比较的市场量,DCF 则把明确预测现金流折现;终值是长期假设的压缩表达,往往主导结果。进入量化流程后,同样重要的是分母符号、单位、期间、财报版本、股类以及 signal 与交易时点。完成这些约束仍不等于证明信号有收益,必须通过行业基准、样本外和成本检验。
15. Exercises
概念、计算和解释题答案见第 18 节。
13-E01(索取权) 一项合并口径 EBITDA 包含非全资子公司的全部 EBITDA。解释为什么用它算 EV/EBITDA 时,要考虑 NCI;如果只研究母公司股东,怎样使用普通股市值?
13-E02(EV 桥) 用第 8 节 Lyra 的构造数据计算 EV,并反推普通股价值。分别说明优先股、NCI、现金和非经营资产的符号。
13-E03(倍数) 用第 8 节两家公司计算 P/E、P/B、EV/EBITDA、EV/EBIT、earnings yield、FCFE/equity yield 和 FCFF/EV yield。指出各自的索取权配对。
13-E04(非正分母) 公司市值为 500 USD millions,净亏损为 −25;另一公司普通股账面权益为 −60。报告相应 P/E、P/B 的处理、亏损公司的 earnings yield,并说明排序时应怎样保留信息。
13-E05(现金流) 给定 EBIT=80、税率 25%、D&A=12、CapEx=20、
13-E06(WACC)
13-E07(DCF 与终值) 年末 FCFF 为 30、35、40 USD millions,WACC=10%、永续增长
13-E08(PIT) FY2024 10-K 于 2025-02-15 公开、2-16 入库;2025-04-02 又公开/入库重述值。signal_time 分别为 2025-03-31 和 2025-04-03。市值快照分别为 2025-03-31 的 600 与 2025-04-02 的 620 USD millions。重述前后 FCFE 分别为 28 与 25。各时点选哪一版,计算相应 FCF yield,并列明使用哪天的市值。
13-E09(真实来源边界) Apple FY2024 10-K 列示净利润、摊薄 EPS 和加权平均摊薄股数。仅凭这些数据能否说出真实历史 P/E?至少还缺哪三项需要核验的数据或口径?
16. Programming Exercises
程序题在项目 .venv 中运行,代码可直接导入第 9 节核心模块。每题要求写能由断言核验的输出。
13-P01(索取权安全的比率) 用 Amount、EV 桥、P/E、EV/EBITDA 与 FCFE yield 重现 Orion 和 Lyra 的结果。断言 EV 分别为 650、750;P/E 分别为 20、24;EV/EBITDA 分别约为 8.67、10;若把 FCFE 配 EV,代码应拒绝。
13-P02(折现匹配与终值敏感性) 为年度 FCFF [40,45,50,55,60] USD millions 计算 WACC=9%、
13-P03(横截面与 PIT 反证) 用 industry_percentile_ranks 处理同一 signal date 的 3 个盈利公司、1 个负盈利缺失于 P/E 的公司,并处理并列名次。把某一重述版的 ingested_at 推到 signal_time 之后,断言早期 signal 仍选择旧版本。验证晚于 signal_time 的市值不会选中。
17. Challenge Problems
开放题可有多种合理答案,但须显式写范围、时间与反证条件。答案区提供参考论证和评分标准。
13-C01(合并 EBITDA、NCI 与租赁,先修:第 12 章) 假设 X 与 Y 经营利润相同,Y有大量未并表投资或并表非全资子公司,且租赁密集(先识别两类投资的实际会计范围)。分别提出一致的 EV/EBITDA 处理路径;指出至少两种“看似保守”但会产生双重计算的桥接方式,并列出所需财报附注字段。
13-C02(价值信号研究设计,先修:第 3、12 章) 设计一个跨公司 FCF yield PIT 检验:说明选 FCFF/EV、FCFE/市值或 CFO−CapEx proxy 的理由;定义财报版本、市场价格、股类、市值、行业分组、负分母与缺失规则;给出 signal_time、trade_time、return interval;列出至少两个反证和一套样本外、基准、交易成本比较。不得把未实际执行的研究写成结果。
18. Solutions / Solution Hints
概念与手算题
13-E01 合并 EBITDA 计入了子公司的全部经营结果,而普通股市值仅是母公司某类普通股的索取权。EV 加债务、优先股和 NCI 等非普通股索取权,使分子覆盖同一合并经营范围。若要估母公司股东价值,用普通股市值、归属普通股股东盈利/账面值或 FCFE;若从企业价值转来,扣掉这些非普通股索取权并加回被排除的现金和非经营资产。
13-E02
13-E03 Orion:P/E
13-E04 P/E
13-E05
13-E06
13-E07
13-E08 3 月 31 日仅选原版本,因为重述版尚未公开/入库;市值取 3 月 31 日快照,FCFE yield
13-E09 不能。至少要有验证过的普通股价格和同一估值时点、所有普通股类别/ADR 换算和股数基础、可用财报版本与所算 trailing EPS 的期间/股东范围。还应核对交易时区、分红/拆股、估值日期、期末流通股数与加权平均 EPS 股数的差别。仅凭净利润和 EPS 只能说明报表盈利口径。
编程题
13-P01 在项目根目录运行以下完整程序;它直接调用章节模块,两个 assert 同时验收 EV 桥与索取权限制。
from pathlib import Path
import sys
sys.path.insert(0, str(Path.cwd() / "src"))
from quant_course.valuation import (
Amount,
enterprise_value,
enterprise_multiple,
fcf_yield,
price_to_earnings,
)
def a(value: float) -> Amount:
return Amount(value, "USD", "USD millions")
orion_ev = enterprise_value(a(600), a(100), a(50))
lyra_ev = enterprise_value(a(480), a(260), a(30), noncontrolling_interest=a(40),
preferred_equity=a(20), nonoperating_assets=a(20))
assert orion_ev.value == 650 and lyra_ev.value == 750
assert price_to_earnings(a(600), a(30)) == 20
assert price_to_earnings(a(480), a(20)) == 24
assert enterprise_multiple(orion_ev, a(75)) == 650 / 75
assert enterprise_multiple(lyra_ev, a(75)) == 10
assert fcf_yield(a(40), orion_ev, cash_flow_basis="FCFF", claim_basis="EV") == 40 / 650
try:
fcf_yield(a(28), orion_ev, cash_flow_basis="FCFE", claim_basis="EV")
except ValueError:
pass
else:
raise AssertionError("FCFE must be paired with equity value")
print("Orion EV=650; Lyra EV=750; claim matching passed")
13-P02 完整参考实现如下。只改变 (r,g),对每个有效组合重算终值及 DCF。
from pathlib import Path
import sys
sys.path.insert(0, str(Path.cwd() / "src"))
from quant_course.valuation import (
Amount,
discounted_cash_flow_value,
gordon_terminal_value,
)
flows = [Amount(value, "USD", "USD millions") for value in (40, 45, 50, 55, 60)]
rate, growth = 0.09, 0.03
tv = gordon_terminal_value(flows[-1], rate, growth)
value = discounted_cash_flow_value(
flows, rate, cash_flow_basis="FCFF", discount_rate_basis="WACC", terminal_value=tv
)
pv_tv = tv.value / (1 + rate) ** len(flows)
assert round(tv.value, 2) == 1030.00
assert round(value.value, 2) == 860.57
assert round(100 * pv_tv / value.value, 2) == 77.79
valid = []
for test_rate in (0.08, 0.09, 0.10):
for test_growth in (0.02, 0.03, 0.04):
if test_growth < test_rate:
test_tv = gordon_terminal_value(flows[-1], test_rate, test_growth)
valid.append((test_rate, test_growth, test_tv.value))
assert len(valid) == 9
print(f"TV={tv.value:.2f}; EV={value.value:.2f}; PV(TV)/EV={pv_tv/value.value:.2%}")
13-P03 第 9 节核心模块给出全套 PIT 类型和行业百分位函数。以下完整代码同时核实排序、晚入库重述及未来市值排除;使用明确标为构造的公司与 UTC 时钟,不代表真实公司历史。
from pathlib import Path
import sys
sys.path.insert(0, str(Path.cwd() / "src"))
from quant_course.valuation import industry_percentile_ranks
values = {"A": 0.05, "B": 0.03, "C": 0.03, "LOSS": None}
industries = {"A": "Software", "B": "Software", "C": "Software", "LOSS": "Software"}
ranks = industry_percentile_ranks(values, industries)
assert ranks == {"A": 1.0, "B": 0.25, "C": 0.25, "LOSS": None}
print(ranks)
from datetime import date, datetime, timezone
from quant_course.valuation import (
Amount, FinancialVintage, MarketCapSnapshot,
select_pit_vintage, select_pit_market_cap,
)
signal = datetime(2025, 3, 31, 20, tzinfo=timezone.utc)
original = FinancialVintage(
issuer_id="SIM-ISSUER", security_id="SIM-COMMON", fiscal_period="FY2024",
period_end=date(2024, 12, 31),
available_at=datetime(2025, 2, 15, 8, tzinfo=timezone.utc),
ingested_at=datetime(2025, 2, 16, 8, tzinfo=timezone.utc),
accession="SIM-V1", currency="USD", unit="USD millions",
net_income_common=30, common_book_equity=180, ebit=50, ebitda=75,
free_cash_flow=28, cash_flow_basis="FCFE", industry="Software",
)
from dataclasses import replace
restated = replace(
original, accession="SIM-V2", free_cash_flow=25,
available_at=datetime(2025, 3, 1, 8, tzinfo=timezone.utc),
ingested_at=datetime(2025, 4, 2, 8, tzinfo=timezone.utc),
)
assert select_pit_vintage(
[original, restated], security_id="SIM-COMMON",
fiscal_period="FY2024", signal_time=signal,
) == original
# 构造演示假设:as_of 时价格和历史股数已公开且已入库。
old_cap = MarketCapSnapshot("SIM-COMMON", signal, Amount(600, "USD", "USD millions"))
future_cap = MarketCapSnapshot(
"SIM-COMMON", datetime(2025, 4, 2, 20, tzinfo=timezone.utc),
Amount(620, "USD", "USD millions"),
)
assert select_pit_market_cap(
[old_cap, future_cap], security_id="SIM-COMMON", signal_time=signal,
) == old_cap
print("late ingestion and future market cap excluded")
挑战题
13-C01 先分别识别并表非全资子公司与未逐行并表的投资,再固定经营分母覆盖哪些活动;不能仅凭“部分持有”或持股比例决定加NCI。
并表路径。 合并EBITDA若计入子公司100%的经营结果,经营EV也应覆盖同范围债务、优先股及外部非控股权益。NCI价值是从母公司普通股市值出发构造EV的加项,不是P/E盈利分母或普通股市值的加项。保留全部子公司EBITDA而漏加NCI,是漏计索取权、范围错配,不是双计。若改用比例归属的经营范围,债务、现金、非经营资产和经营量也须同口径重建,并解释总部费用与内部交易;不能只把合并EBITDA乘持股比例后直接配普通股市值。
未并表投资路径。 假定将该投资视为另估的非经营资产,令其母公司所持权益的估计价值为
这里的NCI仅属于前述已并表经营范围,不能再加未并表被投资方的外部股东权益。经营分母也须不含这项投资的贡献:若报告的EBITDA已经排除权益法投资收益,不再扣;若所选EBITDA定义实际包含投资收益,先核其项目、期间和归属,再剔除恰好已纳入的那部分。投资收益不是被投资企业完整EBITDA,也不能按持股比例随意当成完整经营贡献。相反,从不含投资收益的核心经营FCFF估出
同一投资不得既留在核心经营现金流/终值中、又完整另估加回;也不得从价值扣除两遍,或从本来已剔除投资收益的经营分母再扣一次。若选择整体纳入投资的估值路径,必须同步定义投资现金流、风险/贴现率和价值范围,不能只对倍数做单边修补。
两条租赁路径。 将租赁视为融资时,EV加相应租赁负债,经营分母按一致资本化口径调整,FCF与WACC也同步处理租赁本金、利息及债务成本;或者将现金租金完整留作持续经营费用,EV不再加入同一租赁承诺,利润、现金流与资本成本都沿该经营费用口径。两条路径是互斥的一致口径选择。
双计反例包括:以已完整扣租金的经营现金流估核心价值,又在EV到普通股的桥中再扣同一租赁负债;把投资价值保留在核心现金流/终值后再完整另估加回。上述漏加NCI属于漏计,应与双计分开标明。至少检查所有权与控制依据、实际并表/权益法范围、NCI账面值与估值依据、未并表投资的持有权益价值与收益入账位置、子公司EBIT/EBITDA、集团内部交易及总部费用、租赁负债期限/利率、使用权资产折旧、现金租金、租赁本金与利息现金流分类。NCI和投资价值若用账面值代理市场价值,写明近似;不能只凭资产负债表一个数字裁决哪种口径“正确”。
参考评分(10 分):索取权/经营范围一致 3 分;提出至少两条互斥且内部一致的租赁方案 3 分;指出两个以上双计/漏计反例 2 分;列出可复核的附注与字段 2 分。
13-C02 参考设计选 FCFE/普通股市值,前提是可靠的归属普通股盈利、利息、净借款和再投资数据;若杠杆将大变或净借款难以预测,改选 FCFF/EV 并明确 WACC 和 EV bridge;如果只能取 CFO−CapEx,则命名为 cash-flow proxy 并描述会计差异,不声称等于 FCFF。数据行保存 issuer/security 永久 ID、股类和有效期、财政期间、currency/unit、财报原行、accession、available_at、ingested_at、revision 状态和变换代码版本。市场快照保存价格/股数来源、as_of、币种、ADR 比率、公司行动、全部普通股类汇总规则;行业保存同日有效的版本。signal_time 只能选取满足两个时钟的财报;构造的订单下一可交易时点执行;return interval 从实际建仓成交后至下一持仓区间的计价终点,不以收盘信号同收盘成交作为默认。
反证至少包括:把未来重述或未来价格注入原始库,早期因子不应改变;将一版财报的入库时点移到 signal 之后,算法必须退回早期版本或缺失;删掉未来公布的成分证券,不能影响历史母体。样本外报告行业内等权基准与行业中位数;事先固定再平衡周期和排序规则;披露负分母/缺失占比、换手、容量、退市处理及佣金、价差、冲击、借券与融资成本前后结果。结论仅能对实际跑出的样本、时间和测量口径负责。
参考评分(10 分):现金流/索取权和贴现率匹配 2 分;PIT 与股类/市值版本 3 分;signal、trade、return 时间关系 2 分;两个可执行的反证 2 分;基准与成本后样本外比较 1 分。
19. Further Reading
- Must Know — MIT OpenCourseWare, Finance Theory I, “Present Value Relations”:看 Lecture I–II 与课件中资产现金流、现值、永续年金和复利约定,用来巩固折现的时间逻辑;课程材料不是本章 EV 桥的唯一标准。课件与录像入口
- Should Know — Aswath Damodaran, “An Introduction to Valuation”:读 DCF、equity-versus-firm valuation 和 relative valuation 段,理解索取权、贴现率、再投资与可比公司假设。作者公开讲义
- Should Know — Damodaran, “Valuation” lecture notes:读 FCFE、FCFF 和选择估值模型部分,对比预测杠杆变化时两种估值路径的优劣;历史示例中的金额/估值不应当作今日行情。讲义
- Should Know — SEC, Non-GAAP Financial Measures C&DI 102.07:核查 CFO 减资本开支的常见 FCF 解释边界;这是美国 SEC staff 指引,不是现金流的全球会计准则定义。SEC 页面
- Advanced — Damodaran, “Terminal Value”:读稳定增长、币种和真实/名义约束,重点检查终值如何随 (r-g) 变化。作者公开章节
20. References
- MIT OpenCourseWare, Finance Theory I — Present Value Relations:现金流现值、永续年金与复利,第 4、6、8 节。另见 Equities slides,包括股息折现、EPS 和 P/E 示例,第 5、7 节。
- Aswath Damodaran, NYU Stern, Valuation:FCFE/FCFF、股权和企业估值、WACC、现金流与贴现率匹配,第 5–7 节;An Introduction to Valuation:DCF 和 relative valuation 框架,第 5–7、13 节。
- Aswath Damodaran, Terminal Value:稳定期现金流、贴现率、增长与终值敏感性,第 5–8、10 节。
- SEC, Non-GAAP Financial Measures C&DIs, Question 102.07:CFO 减 CapEx 的常见 FCF 口径非统一、需解释且不等于可自由支配现金,第 5–7、12 节。
- Apple Inc., FY2024 Form 10-K, accession 0000320193-24-000123:期间、营业利润、净利润、摊薄 EPS、EPS 加权平均股数、期末流通股数及资产负债表行,第 11 节。仅支持 SEC 原申报中列示的财报事实,不支持真实市场市值、P/E、信号或回报结论。
本章不使用二手市场估值或历史行情。来源位置、阅读范围与核验边界详见 source_notes.md。