DCF 模型构建器

概述

此技能按照投资银行标准创建机构质量的 DCF 模型用于股权估值。每个分析都会生成详细的 Excel 模型(敏感性分析包含在 DCF 工作表底部)。

工具

关键约束 — 先阅读这些

这些约束适用于所有 DCF 模型构建。在开始前审查:

环境:Office JS vs Python/openpyxl:

Office JS 合并单元格陷阱: 在构建带有合并单元格的部分标题时,不要先调用 .merge() 再在合并范围上设置 .values — Office JS 仍报告范围的原始尺寸,并将抛出 InvalidArgument:输入数组中的行数或列数与范围的尺寸或大小不匹配。相反,单独写入左上角单元格的值,然后合并并格式化整个范围:

// 错误 — 抛出 InvalidArgument:
const hdr = ws.getRange("A7:H7");
hdr.merge();
hdr.values = [["市场数据与关键输入"]];  // 1×1 数组 vs 1×8 范围 → 失败

// 正确 — 先在一个单元格上设置值,然后合并 + 格式化范围:
ws.getRange("A7").values = [["市场数据与关键输入"]];
const hdr = ws.getRange("A7:H7");
hdr.merge();
hdr.format.fill.color = "#1F4E79";
hdr.format.font.bold = true;
hdr.format.font.color = "#FFFFFF";

这适用于 DCF 中的每个合并部分标题(市场数据、情景块、现金流预测、终值、估值摘要、敏感性表格)。

公式优先于硬编码(不可协商):

与用户逐步验证(不要端到端构建):

敏感性表格:

单元格注释:

模型布局规划:

公式重新计算:

情景块:

DCF 流程工作流

步骤 1:数据检索与验证

从 MCP 服务器、用户提供的数据和网络获取数据。

数据来源优先级:

  1. MCP 服务器(如已配置)— 来自 Daloopa 等提供商的结构化财务数据
  2. 用户提供的数据 — 来自其研究的历史财务数据
  3. 网络搜索/获取 — 当前价格、贝塔、债务和现金(需要时)

验证检查清单:

步骤 2:历史分析(3-5 年)

分析和记录:

创建汇总表,显示:

历史指标(LTM):
收入:$X 百万
收入增长:X% CAGR
毛利率:X%
EBIT 利润率:X%
D&A 占收入 %:X%
资本支出占收入 %:X%
FCF 利润率:X%

步骤 3:构建收入预测

方法:

  1. 从最新的实际收入开始(LTM 或最近财年)
  2. 为每个预测年应用增长率
  3. 同时显示美元金额和计算的增长率 %

增长率框架:

公式结构:

三情景方法:

悲观情景:保守增长(例如 8-12%)
基准情景:最可能情景(例如 12-16%)
乐观情景:乐观增长(例如 16-20%)

步骤 4:营业费用建模

固定/变动成本分析:

营业费用应模拟现实的操作杠杆:

关键原则:

利润率扩张框架:

当前状态 → 目标状态(第 5 年)
毛利率:X% → Y%(基于规模、效率证明合理性)
EBIT 利润率:X% → Y%(收入增长 + 运营费用杠杆的结果)

步骤 5:自由现金流计算

按正确顺序构建 FCF:

EBIT
(-) 税费(EBIT × 税率)
= NOPAT(税后净营业利润)
(+) D&A(非现金费用,收入百分比)
(-) 资本支出(收入百分比,通常 4-8%)
(-) Δ NWC(营运资本变动)
= 无杠杆自由现金流

营运资本建模:

维护性 vs 增长性资本支出:

步骤 6:资本成本(WACC)研究

股权成本的 CAPM 方法:

股权成本 = 无风险利率 + 贝塔 × 股权风险溢价

其中:
- 无风险利率 = 当前 10 年期国债收益率
- 贝塔 = 5 年月度股票相对于市场指数的贝塔
- 股权风险溢价 = 5.0-6.0%(市场标准)

债务成本计算:

税后债务成本 = 税前债务成本 ×(1 - 税率)

从以下来源确定税前债务成本:
- 信用评级(如可用)
- 公司债券的当前收益率
- 财务报表中的利息费用 / 总债务

资本结构权重:

权益市场价值 = 当前股价 × 流通股数
净债务 = 总债务 - 现金及等价物
企业价值 = 市值 + 净债务

权益权重 = 市值 / 企业价值
债务权重 = 净债务 / 企业价值

WACC =(股权成本 × 权益权重)+(税后债务成本 × 债务权重)

特殊情况:

典型 WACC 范围:

步骤 7:折现率应用(5-10 年预测)

年中惯例:

现值计算:

对于每个预测年:
FCF 的 PV = 无杠杆 FCF × 折现因子

示例(第 1 年):
FCF = $1,000
WACC = 10%
期间 = 0.5
折现因子 = 1 /(1.10)^0.5 = 0.9535
PV = $1,000 × 0.9535 = $954

预测期间选择:

步骤 8:终值计算

永续增长法(推荐):

终期 FCF = 最后一年 FCF ×(1 + 终值增长率)
终值 = 终期 FCF /(WACC - 终值增长率)

关键约束:终值增长率 < WACC(否则将产生无限价值)

终值增长率选择:

不要超过: 无风险利率或长期 GDP 增长率

退出倍数法(替代方法):

终值 = 最后一年 EBITDA × 退出倍数

退出倍数来自:
- 行业可比交易倍数
- 先例交易倍数
- 典型范围:8-15x EBITDA

终值的现值:

终值的 PV = 终值 /(1 + WACC)^最终期间

其中最终期间考虑时间:
5 年模型中年度惯例:期间 = 4.5(年中折现最终调整为 4.5)
5 年模型年中惯例:期间 = 5

终值合理性检查:

步骤 9:企业价值到股权价值桥梁

估值摘要结构:

(+) 预测 FCF 的 PV 之和 = $X 百万
(+) 终值的 PV = $Y 百万
= 企业价值 = $Z 百万

(-) 净债务 [或如果净债务为负则 + 净现金] = $A 百万
= 股权价值 = $B 百万

÷ 稀释后流通股数 = C 百万股
= 隐含每股价格 = $XX.XX

当前股价 = $YY.YY
隐含回报 =(隐含价格 / 当前价格)- 1 = XX%

关键调整:

估值输出格式:

估值组件,金额($M)
显性 FCF 的 PV,X.X
终值的 PV,Y.Y
企业价值,Z.Z
(-) 净债务,A.A
股权价值,B.B
,,
流通股数(M),C.C
隐含每股价格,$XX.XX
当前股价,$YY.YY
隐含上涨/下跌空间,+XX%

步骤 10:敏感性分析

在 DCF 工作表底部构建三个敏感性表格,显示估值如何随不同假设变化:

  1. WACC vs 终值增长率 - 显示企业价值对折现率和永续增长的敏感性
  2. 收入增长 vs EBIT 利润率 - 显示顶线增长和操作杠杆的影响
  3. 贝塔 vs 无风险利率 - 显示对股权成本组成部分的敏感性

实现:这些是简单的 2D 网格(不是 Excel 的"数据表"功能),每个单元格中包含公式。每个单元格必须包含针对该特定假设组合的完整 DCF 重新计算。有关如何使用 openpyxl 以编程方式填充所有 75 个单元格的详细要求,请参阅关键约束部分。

<correct_patterns>

此部分包含构建 DCF 模型时要遵循的所有正确模式。

情景块选择模式 — 遵循此方法

假设按每个情景的单独块组织:

关键结构 — 每个部分标题三行:

悲观情景假设(部分标题,跨列合并单元格)
假设,FY1,FY2,FY3,FY4,FY5
收入增长率(%),12%,10%,9%,8%,7%
EBIT 利润率(%),45%,44%,43%,42%,41%

基准情景假设(部分标题,跨列合并单元格)
假设,FY1,FY2,FY3,FY4,FY5
收入增长率(%),16%,14%,12%,10%,9%
EBIT 利润率(%),48%,49%,50%,51%,52%

乐观情景假设(部分标题,跨列合并单元格)
假设,FY1,FY2,FY3,FY4,FY5
收入增长率(%),20%,18%,15%,13%,11%
EBIT 利润率(%),50%,51%,52%,53%,54%

每个情景块必须有一个列标题行,在部分标题下方立即显示预测年份(FY2025E、FY2026E 等)。没有这个,用户无法知道哪个假设值对应哪一年。

如何引用假设 — 创建合并列:

  1. 情景选择器单元格(例如,B6)包含 1=悲观、2=基准或 3=乐观
  2. 创建一个合并列,使用 INDEX 或 OFFSET 公式从正确的情景块中提取数据
  3. 预测公式引用合并列(干净的单元格引用)
  4. 每个情景块包含跨预测年份的完整 DCF 假设集

推荐的合并列模式(使用 INDEX): =INDEX(B10:D10, 1, $B$6)

不是这样 — 分散在各处的 IF 语句: =IF($B$6=1,[悲观块单元格],IF($B$6=2,[基准块单元格],[乐观块单元格]))

合并列方法集中逻辑,使模型更易于审计。

正确的收入预测模式

使用 INDEX 公式创建一个合并列,然后在预测中引用它:

步骤 1 — FY1 增长的合并列: =INDEX([悲观 FY1 增长]:[乐观 FY1 增长], 1, $B$6)

步骤 2 — 收入预测引用合并列: 收入第 1 年:=D29*(1+$E$10)

其中:

这种方法比在每个预测公式中嵌入 IF 语句更清晰,并且使审计使用了哪些情景假设变得容易得多。

正确的 FCF 公式模式

使用带有 INDEX 公式的合并列,然后在 FCF 计算中引用它们:

合并列方法:

项目,公式,参考
D&A,=E29*$E$21,$E$21 = D&A % 的合并列
资本支出,=E29*$E$22,$E$22 = 资本支出 % 的合并列
Δ NWC,=(E29-D29)*$E$23,$E$23 = NWC % 的合并列
无杠杆 FCF,=E57+E58-E60-E62,E57=NOPAT E58=D&A E60=资本支出 E62=Δ NWC

每个合并列单元格包含一个 INDEX 公式,根据情景选择器从适当的情景块中提取数据。这使预测公式保持干净和可审计。

在编写公式之前,确认情景块行位置并设置合并列。

正确的单元格注释格式

每个硬编码值都需要此格式:

"来源:[系统/文档],[日期],[参考],[URL 如适用]"

示例:

项目,来源注释
股价,来源:市场数据脚本 2025-10-12 收盘价
流通股数,来源:10-K FY2024 第45页 注释12
历史收入,来源:10-K FY2024 第32页 合并报表
贝塔,来源:市场数据脚本 2025-10-12 5年每月贝塔
共识估计,来源:管理层指引 Q3 2024 财报电话会议

正确的假设表结构

关键:每个情景块需要三个结构元素:

  1. 部分标题行(合并单元格):例如"悲观情景假设"
  2. 列标题行显示年份 — 这是必需的,不要跳过
  3. 数据行包含假设值

结构:

悲观情景假设(部分标题 — 跨列 A:G 合并)
假设,FY1,FY2,FY3,FY4,FY5
收入增长率(%),X%,X%,X%,X%,X%
EBIT 利润率(%),X%,X%,X%,X%,X%
终值增长率,X%,,,,
WACC,X%,,,,

基准情景假设(部分标题 — 跨列 A:G 合并)
假设,FY1,FY2,FY3,FY4,FY5
收入增长率(%),X%,X%,X%,X%,X%
EBIT 利润率(%),X%,X%,X%,X%,X%
终值增长率,X%,,,,
WACC,X%,,,,

乐观情景假设(部分标题 — 跨列 A:G 合并)
假设,FY1,FY2,FY3,FY4,FY5
收入增长率(%),X%,X%,X%,X%,X%
EBIT 利润率(%),X%,X%,X%,X%,X%
终值增长率,X%,,,,
WACC,X%,,,,

如果没有显示预测年份(FY2025E、FY2026E 等)的列标题行,用户无法知道哪个假设值对应哪一年。此行是强制性的。

然后创建一个合并列(通常在右侧的下一列),使用 INDEX 公式根据情景选择器从选定的情景块中提取数据。此合并列是您的预测公式引用的内容。

正确的行规划流程

1. 首先编写所有标题和标签:

行,内容
1,[公司名称] DCF 模型
2,股票代码 | 日期 | 年末
4,情景选择器
7,关键假设
26,假设标题
27-31,增长假设
...,...

2. 编写所有部分分隔线和空行

3. 然后使用锁定的行位置编写公式

4. 创建后立即测试公式

把它想象成建筑:

Excel 版本:

正确的敏感性表格实现

重要:这些不是 Excel 的"数据表"功能。这些是简单的网格,您使用 openpyxl 编写常规公式。是的,这意味着总共约 75 个公式(3 个表格 × 25 个单元格),但这很简单且是必需的。

用公式以编程方式填充:

每个敏感性表格必须完全填充公式,为每个假设组合重新计算隐含股价。不要使用 Excel 的数据表功能(它需要手动干预,无法通过 openpyxl 自动化)。

实现方法 — 具体示例:

表格结构 — 5×5 网格(奇数维度,基准情景居中):

如果模型的基准 WACC = 9.0% 且基准终值增长率 = 3.0%,围绕这些值对称构建轴:

WACC vs 终值增长率, 2.0%,  2.5%,  3.0%,  3.5%,  4.0%
              8.0%,       [fml], [fml], [fml], [fml], [fml]
              8.5%,       [fml], [fml], [fml], [fml], [fml]
              9.0%,       [fml], [fml], [★  ], [fml], [fml]   ← 中间行 = 基准 WACC
              9.5%,       [fml], [fml], [fml], [fml], [fml]
             10.0%,       [fml], [fml], [fml], [fml], [fml]
                                  ↑
                          中间列 = 基准终值 g

★ = 中心单元格。 其公式输出必须等于模型的实际隐含股价(来自估值摘要)。对此单元格应用中蓝色填充(#BDD7EE)和加粗字体,以便基准情景在视觉上有锚点。

轴值规则: axis_values = [base - 2*step, base - step, base, base + step, base + 2*step] — 围绕基准对称,奇数计数保证有中心。

公式模式 — 单元格 B88(WACC=8.0%,终值增长率=2.0%):

B88 中的公式应使用以下值重新计算隐含价格:

推荐方法: 引用主 DCF 计算,但替换这些值。

示例公式结构: =([使用 $A88 作为折现率的 FCF PV 之和] + [使用 B$87 作为增长率和 $A88 作为 WACC 的终值] - [净债务]) / [股份]

关键 — 为 5x5 网格中的每个单元格编写公式(每个表格 25 个单元格,总共 75 个单元格)。 使用 openpyxl 以编程方式在循环中写入这些公式。不要跳过此步骤或留下占位符文本。

Python 实现模式:

# 填充敏感性表格的伪代码
for row_idx, wacc_value in enumerate(wacc_range):
    for col_idx, term_growth_value in enumerate(term_growth_range):
        # 构建使用 wacc_value 和 term_growth_value 的公式
        formula = f"=<使用{wacc_value}{term_growth_value}的 DCF 重新计算>"
        ws.cell(row=start_row+row_idx, column=start_col+col_idx).value = formula

敏感性表格必须在打开模型时立即工作,无需用户任何手动步骤。

</correct_patterns>

<common_mistakes>

此部分包含在构建 DCF 模型时要避免的所有错误模式。

错误:简化的敏感性表格近似或占位符文本

不要使用线性近似:

// 错误 — 线性近似
B97: =B88*(1+(0.096-0.116))    // 假设线性关系

// 错误 — 除法快捷方式
B105: =B88/(1+(E48-0.07))      // 不重新计算完整 DCF

不要留下占位符文本:

// 错误 — 占位符说明
"注意:使用 Excel 数据表功能(数据 → 假设分析 → 数据表)来填充敏感性表格。"

// 错误 — 空单元格
[因为"这很复杂"而留空单元格]

不要混淆术语:

为什么这些快捷方式是错误的:

需要拒绝的常见合理化: "编写 75 个以上的公式感觉很复杂,所以我要给用户留个说明让他们手动完成。"

实际情况: 当您使用 Python 和 openpyxl 的循环时,编写 75 个公式很简单。每个公式遵循相同的模式 — 只需替换行/列值。这是交付物的必需部分。

相反: 用为每个特定假设组合重新计算完整 DCF 的公式填充每个敏感性单元格。

错误:缺少单元格注释

不要这样做:

为什么错误:

相反: 在创建每个硬编码值时立即添加单元格注释。

错误:公式行引用错误

症状: FCF 部分引用了错误的假设行: D&A:=E29*$E$34 // 应为 $E$21,但引用了错误行 资本支出:=E29*$E$41 // 应为 $E$22,但行已偏移

发生原因:

  1. 先写公式
  2. 然后插入标题
  3. 所有行引用偏移
  4. 现在公式指向错误的单元格 → #REF! 错误

相反: 先锁定行布局,然后写公式。

错误:每个假设在情景间使用单行

不要像这样构建假设:

假设,悲观,基准,乐观
FY1 收入增长率,10%,13%,16%
FY2 收入增长率,9%,12%,15%

这种垂直布局使查看每个情景内跨年的进展变得困难。

为什么错误:

相反:

错误:无边框

不要交付没有边框的模型:

为什么错误:

相反: 在所有主要部分周围添加边框。

错误:错误的字体颜色或没有字体颜色区分

不要这样做:

为什么错误:

相反: 所有硬编码输入使用蓝色文本,所有公式使用黑色文本,工作表链接使用绿色文本。

错误:基于毛利润的营业费用

不要这样做: S&M:=E33*0.15 // E33 = 毛利润(错误)

为什么错误:

相反: S&M:=E29*0.15 // E29 = 收入(正确)

前5大错误摘要

  1. 公式行引用偏移 → 在编写公式前定义所有行位置
  2. 缺少单元格注释 → 在创建单元格时即添加注释,而非结束时
  3. 简化的敏感性表格 → 用完整的 DCF 重新计算公式填充所有单元格,而非近似值
  4. 情景块引用错误 → 确保 IF 公式从正确的悲观/基准/乐观块提取数据
  5. 无边框 → 添加专业的部分边框,呈现客户就绪外观

此外,请注意这些错误:

WACC 计算错误

增长假设缺陷

终值错误

现金流预测错误

这些错误最常见。在开始任何 DCF 构建前重新阅读本节。

</common_mistakes>

Excel 文件创建

此技能使用 xlsx 技能进行所有电子表格操作。 xlsx 技能提供:

此技能创建的所有 Excel 文件必须遵循 xlsx 技能要求,包括零公式错误和正确的重新计算。

质量评分标准

每个 DCF 模型必须在以下方面最大化:

  1. 基于历史表现的真实收入和利润率假设
  2. 使用合适的 CAPM 方法计算适当的资本成本
  3. 显示估值区间的全面敏感性分析
  4. 清晰的终值计算及支持理由
  5. 支持情景分析的专业模型结构
  6. 所有关键假设的透明文档

输入要求

最低必需输入

  1. 公司标识符:股票代码或公司名称
  2. 增长假设:预测期间的收入增长率(或"使用共识")
  3. 可选参数

Excel 模型结构

工作表架构

创建两个工作表

  1. DCF - 主要估值模型,底部带敏感性分析
  2. WACC - 资本成本计算

关键:敏感性表格放在 DCF 工作表的底部(不在单独的工作表上)。这使所有估值输出保持在一起。

公式重新计算(强制)

创建或修改 Excel 模型后,使用 xlsx 技能的 recalc.py 脚本重新计算所有公式:

python recalc.py [path_to_excel_file] [超时秒数]

示例:

python recalc.py AAPL_DCF_Model_2025-10-12.xlsx 30

该脚本将:

预期输出格式:

{
  "status": "success",           //  "errors_found"
  "total_errors": 0,              // 总错误计数
  "total_formulas": 42,           // 文件中的公式数量
  "error_summary": {}             // 仅当发现错误时存在
}

如果发现错误,输出将包含详细信息:

{
  "status": "errors_found",
  "total_errors": 2,
  "total_formulas": 42,
  "error_summary": {
    "#REF!": {
      "count": 2,
      "locations": ["DCF!B25", "DCF!C25"]
    }
  }
}

修复所有错误并重新运行 recalc.py,直到状态为"success",再交付模型。

格式标准

重要:遵循 xlsx 技能的公式构建规则和数字格式惯例。DCF 技能增加了特定的视觉呈现标准。

配色方案 — 两层

第 1 层:字体颜色(xlsx 技能强制要求)

第 2 层:填充颜色 — 专业蓝/灰配色(默认,除非用户另有指定)

两层如何协同工作:

字体颜色告诉您它是什么(输入/公式/链接)。填充颜色告诉您它在哪里(标题/数据/输出)。

边框标准(专业外观必需)

粗边框(1.5pt)围绕主要部分:

中边框(1pt)在子部分之间:

细边框(0.5pt)围绕数据表:

无边框: 表格内的单个单元格(保持干净、可扫描)

边框是强制性的 — 没有专业边框的模型未准备好供客户使用。

数字格式(遵循 xlsx 技能标准):

单元格注释(所有硬编码输入强制要求)

根据 xlsx 技能,所有硬编码值必须包含记录来源的单元格注释。格式:"来源:[系统/文档],[日期],[参考],[URL 如适用]"

关键:在创建单元格的同时添加注释。不要推迟到结束。

DCF 工作表详细结构

第 1 部分:标题

行,内容
1,[公司名称] DCF 模型
2,股票代码:[XXX] | 日期:[日期] | 年末:[FYE]
3,空行
4,情景选择器单元格(1=悲观 2=基准 3=乐观)
5,情景名称显示(公式:=IF([选择器]=1,"悲观",IF([选择器]=2,"基准","乐观")))

第 2 部分:市场数据(不依赖情景)

项目,数值
当前股价,$XX.XX
流通股数(M),XX.X
市值($M),[公式]
净债务($M),XXX [如果为负则为净现金]

第 3 部分:DCF 情景假设

为每个情景(悲观、基准、乐观)创建单独的假设块,包含 DCF 特定假设(收入增长率%、EBIT 利润率%、税率%、D&A 占收入%、资本支出占收入%、NWC 变动占 Δ收入%、终值增长率、WACC),跨预测年份水平布局。每个块必须包含部分标题、显示预测年份(FY1、FY2 等)的列标题行和数据行。参见 <correct_patterns> 部分的"正确假设表结构"了解确切布局。

第 4 部分:历史与预测财务数据

引用从情景块提取数据的合并列(例如"选定情景"),而不是在每个预测行中使用分散的 IF 公式。

利润表($M),2020A,2021A,2022A,2023A,2024E,2025E,2026E
收入,XXX,XXX,XXX,XXX,[=E29*(1+$E$10)],[=F29*(1+$E$11)],[=G29*(1+$E$12)]
  增长 %,XX%,XX%,XX%,XX%,[=E29/D29-1],[=F29/E29-1],[=G29/F29-1]
,,,,,,
毛利润,XXX,XXX,XXX,XXX,[=E29*E33],[=F29*F33],[=G29*G33]
  利润率 %,XX%,XX%,XX%,XX%,[=E33/E29],[=F33/F29],[=G33/G29]
,,,,,,
营业费用:,,,,,,,
  S&M,XXX,XXX,XXX,XXX,[=E29*0.15],[=F29*0.14],[=G29*0.13]
  R&D,XXX,XXX,XXX,XXX,[=E29*0.12],[=F29*0.11],[=G29*0.10]
  G&A,XXX,XXX,XXX,XXX,[=E29*0.08],[=F29*0.07],[=G29*0.07]
  总运营费用,XXX,XXX,XXX,XXX,[=E36+E37+E38],[=F36+F37+F38],[=G36+G37+G38]
,,,,,,
EBIT,XXX,XXX,XXX,XXX,[=E33-E39],[=F33-F39],[=G33-G39]
  利润率 %,XX%,XX%,XX%,XX%,[=E41/E29],[=F41/F29],[=G41/G29]
,,,,,,
税费,(XX),(XX),(XX),(XX),[=E41*$E$24],[=F41*$E$24],[=G41*$E$24]
  税率,XX%,XX%,XX%,XX%,[=E43/E41],[=F43/F41],[=G43/G41]
,,,,,,
NOPAT,XXX,XXX,XXX,XXX,[=E41-E43],[=F41-F43],[=G41-G43]

关键公式模式

这种方法更清晰,更易于审计,并通过集中情景逻辑防止公式错误。

第 5 部分:自由现金流构建

关键:验证行引用指向正确的假设行。创建后立即测试公式。

现金流($M),2020A,2021A,2022A,2023A,2024E,2025E,2026E
NOPAT,XXX,XXX,XXX,XXX,[=E45],[=F45],[=G45]
(+) D&A,XXX,XXX,XXX,XXX,[=E29*$E$21],[=F29*$E$21],[=G29*$E$21]
    占收入 %,XX%,XX%,XX%,XX%,[=E58/E29],[=F58/F29],[=G58/G29]
(-) 资本支出,(XX),(XX),(XX),(XX),[=E29*$E$22],[=F29*$E$22],[=G29*$E$22]
    占收入 %,XX%,XX%,XX%,XX%,[=E60/E29],[=F60/F29],[=G60/G29]
(-) Δ NWC,(XX),(XX),(XX),(XX),[=(E29-D29)*$E$23],[=(F29-E29)*$E$23],[=(G29-F29)*$E$23]
    占 Δ收入 %,XX%,XX%,XX%,XX%,[=E62/(E29-D29)],[=F62/(F29-E29)],[=G62/(G29-F29)]
,,,,,,
无杠杆 FCF,XXX,XXX,XXX,XXX,[=E57+E58-E60-E62],[=F57+F58-F60-F62],[=G57+G58-G60-G62]

行引用示例(基于布局规划):

在编写公式前:确认这些行号与实际布局匹配。测试一列,然后复制到其他列。

第 6 部分:折现与估值

DCF 估值,2024E,2025E,2026E,2027E,2028E,终值
无杠杆 FCF($M),XXX,XXX,XXX,XXX,XXX,
期间,0.5,1.5,2.5,3.5,4.5,
折现因子,0.XX,0.XX,0.XX,0.XX,0.XX,
FCF 的 PV($M),XXX,XXX,XXX,XXX,XXX,
,,,,,,
终期 FCF($M),,,,,,,XXX
终值($M),,,,,,,XXX
终值的 PV($M),,,,,,,XXX
,,,,,,
估值摘要($M),,,,,,
FCF 的 PV 之和,XXX,,,,,
终值的 PV,XXX,,,,,
企业价值,XXX,,,,,
(-) 净债务,(XX),,,,,
股权价值,XXX,,,,,
,,,,,,
流通股数(M),XX.X,,,,,
隐含每股价格,$XX.XX,,,,,
当前股价,$XX.XX,,,,,
隐含上涨/下跌空间,XX%,,,,,

WACC 工作表结构

股权成本计算,,
无风险利率(10 年期国债),X.XX%,[黄色输入]
贝塔(5 年月度),X.XX,[黄色输入]
股权风险溢价,X.XX%,[黄色输入]
股权成本,X.XX%,[计算蓝色]
,,
债务成本计算,,
信用评级,AA-,[黄色输入]
税前债务成本,X.XX%,[黄色输入]
税率,XX.X%,[链接到 DCF 工作表]
税后债务成本,X.XX%,[计算蓝色]
,,
资本结构,,
当前股价,$XX.XX,[链接到 DCF]
流通股数(M),XX.X,[链接到 DCF]
市值($M),"X,XXX",[计算]
,,
总债务($M),XXX,[黄色输入]
现金及等价物($M),XXX,[黄色输入]
净债务($M),XXX,[计算]
,,
企业价值($M),"X,XXX",[计算]
,,
WACC 计算,权重,成本,贡献
权益,XX.X%,X.X%,X.XX%
债务,XX.X%,X.X%,X.XX%
,,
加权平均资本成本,X.XX%,[绿色输出]

关键 WACC 公式:

市值 = 价格 × 股份
净债务 = 总债务 - 现金
企业价值 = 市值 + 净债务
权益权重 = 市值 / EV
债务权重 = 净债务 / EV
WACC =(股权成本 × 权益权重)+(税后债务成本 × 债务权重)

敏感性分析(DCF 工作表底部)

术语提醒:"敏感性表格" = 简单的 2D 网格,包含行标题、列标题和每个数据单元格中的公式。不是 Excel 的"数据表"功能(数据 → 假设分析 → 数据表)。您将使用 openpyxl 将常规 Excel 公式写入每个单元格。

位置:DCF 工作表第 87 行以后(不在单独的工作表上)

三个敏感性表格,垂直堆叠:

  1. WACC vs 终值增长率(第 87-100 行)- 5×5 网格 = 25 个带有公式的单元格
  2. 收入增长 vs EBIT 利润率(第 102-115 行)- 5×5 网格 = 25 个带有公式的单元格
  3. 贝塔 vs 无风险利率(第 117-130 行)- 5×5 网格 = 25 个带有公式的单元格

要编写的总公式数:75 个(这是必需的,不是可选的)

关键:所有敏感性表格单元格必须使用 openpyxl 以编程方式用公式填充。不要使用线性近似快捷方式。不要留下关于手动步骤的占位符文本或说明。不要以"这很复杂"为理由让单元格留空 — 使用 Python 循环生成公式。

表格设置:

  1. 创建带有行/列标题的表格结构(要测试的假设值)
  2. 用以下公式填充每个数据单元格:
  3. 所有单元格在交付时必须包含有效的公式
  4. 使用条件格式格式化单元格:较高值使用绿色刻度,较低值使用红色刻度
  5. 加粗基准情景单元格
  6. 表格之间留 1-2 个空行

无需手动干预 — 用户打开文件时,敏感性表格必须完全可用。

情景选择器实现

三情景框架:

悲观情景

基准情景

乐观情景

公式实现:

不要在各处使用分散的嵌套 IF 公式。 而是创建使用 INDEX 或 OFFSET 公式从适当情景块提取数据的合并列。

推荐模式(使用 INDEX): =INDEX(B10:D10, 1, $B$6) 其中 B10:D10 = 悲观/基准/乐观值,1 = 行偏移,$B$6 = 情景选择器单元格(1、2 或 3)

然后在所有预测中引用合并列: 收入第 1 年:=D29*(1+$E$10) 其中 E10 是第 1 年增长的合并列值。

这种方法集中情景逻辑,使模型更易于审计和维护。

可交付物结构

文件命名[股票代码]_DCF_Model_[日期].xlsx

两个工作表

  1. DCF - 包含悲观/基准/乐观情景 + 底部三个敏感性表格(WACC vs 终值增长率、收入增长 vs EBIT 利润率、贝塔 vs 无风险利率)的完整模型
  2. WACC - 资本成本计算

关键特性:情景选择器(1/2/3)、使用 INDEX/OFFSET 公式的合并列、颜色编码单元格、所有输入上的单元格注释、专业边框

最佳实践

模型构建

  1. 增量构建:在进入下一部分前完成每个部分
  2. 边建边测:输入样本数字以验证公式
  3. 使用一致的结构:类似的计算遵循类似的模式
  4. 注释复杂公式:为不常见的计算添加说明
  5. 内置检查:在适用处添加求和检查和平衡检查

文档

  1. 记录所有假设:解释关键输入背后的推理
  2. 引用数据来源:注明每个数据点的来源
  3. 解释方法论:描述任何非标准方法
  4. 标记不确定性:高亮可见性有限的领域

质量控制

  1. 交叉检查计算:以多种方式验证数学
  2. 压力测试假设:运行敏感性以确保模型稳健
  3. 同行审查:让其他人检查公式
  4. 版本控制:随工作进展保存版本

常见变体

高增长科技公司

成熟/稳定公司

周期性公司

多业务板块公司

故障排除

如果遇到错误或不合理的结果,请阅读 TROUBLESHOOTING_cn.md 获取详细的调试指导。

工作流程整合

DCF 构建开始时

  1. 收集市场数据

  2. 收集历史财务数据

  3. 使用此技能详述的 DCF 方法开始构建模型

模型构建期间

  1. 使用 openpyxl 构建 Excel 模型,使用公式(而非硬编码值)
  2. 遵循 xlsx 技能惯例进行公式构建和格式化
  3. 仅在用户要求或提供了特定品牌指南时应用填充颜色

交付模型前(强制)

  1. 验证结构

  2. 重新计算公式:运行 python recalc.py model.xlsx 30

  3. 检查输出

  4. 修复错误并重新运行 recalc.py,直到状态为"success"

  5. 抽查公式

  6. 交付模型

可用数据来源

最终输出检查清单

在交付 DCF 模型前:

必需:

验证: