mcpField
D
dcf-model

dcf-model

github.com/anthropics数据与数据库40.9k2.5k 次安装今天更新
代码仓库

关于 dcf-model

dcf-model 是用于股权估值的 Excel DCF 建模技能,面向金融分析工作流。它强调公式驱动的预测、分阶段确认和敏感性分析表。

主要功能

  1. 01基于公式的 Excel 预测
  2. 02熊市、基准和牛市情景
  3. 03分阶段用户确认
  4. 04DCF 敏感性分析表
  5. 05历史财务分析

适用场景

  1. 01根据现金流预测评估公司
  2. 02在完成模型前核对假设
  3. 03比较不同情景下的估值结果

MCP 相关

该技能可将 MCP 服务用作结构化财务数据来源,并结合用户提供的数据和网络研究。

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/anthropics/financial-services --skill dcf-model

安装后在 Claude Code 中输入/dcf-model确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

requirements.txt
TROUBLESHOOTING.md
scripts/
validate_dcf.py

详细介绍

DCF 模型构建器

概述

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

工具

  • 默认使用用户提供的所有信息以及可用于数据获取的 MCP 服务。

关键约束 - 请先阅读这些内容

这些约束适用于所有 DCF 模型构建过程。开始前请先审阅:

环境:Office JS 与 Python/openpyxl:

  • 如果在 Excel 内运行(Office 加载项 / Office JS 环境): 直接使用 Office JS —— 不要使用 Python/openpyxl。通过 range.formulas = [["=D19*(1+$B$8)"]] 写入公式。无需单独的重算步骤;Excel 会原生计算。使用 range.format.* 进行样式设置。公式优先于硬编码的规则同样适用:对派生单元格设置 .formulas,绝不要设置 .values。
  • 如果生成独立的 .xlsx 文件(没有实时 Excel 会话): 按下文所述使用 Python/openpyxl,然后在交付前运行 recalc.py。
  • 本技能的其余部分使用 openpyxl 示例 —— 在该环境中请转换为 Office JS API 调用,但所有原则(公式字符串、单元格批注、分节检查点、敏感性表循环)都同样适用。

⚠️ Office JS 合并单元格陷阱: 使用合并单元格构建分节标题时,不要先调用 .merge() 再在合并区域上设置 .values —— Office JS 仍会报告该区域的原始尺寸,并会抛出 InvalidArgument: The number of rows or columns in the input array doesn't match the size or dimensions of the range。相反,应先将值写入左上角单元格,然后再合并并格式化整个区域:

// WRONG — throws InvalidArgument:
const hdr = ws.getRange("A7:H7");
hdr.merge();
hdr.values = [["MARKET DATA & KEY INPUTS"]];  // 1×1 array vs 1×8 range → fails

// CORRECT — value first on single cell, then merge + format the range:
ws.getRange("A7").values = [["MARKET DATA & KEY INPUTS"]];
const hdr = ws.getRange("A7:H7");
hdr.merge();
hdr.format.fill.color = "#1F4E79";
hdr.format.font.bold = true;
hdr.format.font.color = "#FFFFFF";

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

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

  • 每个预测、利润率、折现因子、PV 和敏感性单元格都必须是实时 Excel 公式 —— 绝不能是在 Python 中计算并作为数字写入的值
  • 使用 openpyxl 时:ws["D20"] = "=D19*(1+$B$8)" 是正确的;ws["D20"] = calculated_revenue 是错误的
  • 唯一允许的硬编码数字是:(1) 原始历史输入,(2) 假设驱动因素(增长率、WACC 输入、终值 g),(3) 当前市场数据(股价、债务余额)
  • 如果你发现自己在 Python 中计算某个结果并写入结果 —— 停下来。当用户更改假设时,模型必须能够灵活调整。

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

  • 数据检索后 → 向用户展示原始输入块(收入、利润率、股数、净债务),并在预测前确认
  • 收入预测后 → 展示预测的顶线收入和增长率,在构建利润率明细前确认
  • FCF 构建后 → 展示完整的 FCF 明细表,在计算 WACC 前确认逻辑
  • WACC 后 → 展示计算和输入,在折现前确认
  • 终值 + PV 后 → 展示股权桥接(EV → 股权价值 → 每股),在敏感性表前确认
  • 在每个阶段发现错误 —— 在敏感性表构建完成后才发现错误的利润率假设,意味着需要重建所有下游内容 敏感性表格:
  • 使用奇数行和奇数列(标准:5×5,有时 7×7)——这能保证存在一个真正的中心单元格
  • 中心单元格 = 基准情形。 构建轴值时,要让中间行标题和中间列标题恰好等于模型的实际假设(例如,若基准 WACC = 9.0%,则中间行为 9.0%;若终值 g = 3.0%,则中间列为 3.0%)。因此,中心单元格的输出必须等于模型实际隐含的每股价格——这是验证表格构建正确的合理性检查。
  • 突出显示中心单元格,使用中蓝色填充(#BDD7EE)+ 加粗字体,使其作为基准情形一目了然。
  • 填充所有单元格(通常 3 张表 × 25 个单元格 = 75 个),并使用完整的 DCF 重算公式
  • 使用 openpyxl 循环(或 Office JS 循环)以编程方式写入公式
  • 无占位文本,无线性近似,无需手动步骤
  • 每个单元格都必须针对该假设组合重算完整 DCF

单元格批注:

  • 在创建每个硬编码值时添加单元格批注
  • 格式:“来源:[系统/文档],[日期],[参考],[适用时附 URL]”
  • 每个蓝色输入项在进入下一部分前都必须有批注
  • 不要推迟到最后,也不要写“TODO: add source”

模型布局规划:

  • 在编写任何公式之前,先定义所有部分的行的位置
  • 先写入所有标题和标签
  • 再写入所有部分分隔线和空行
  • 然后使用锁定的行位置编写公式
  • 创建后立即测试公式

公式重算:

  • 交付前运行 python recalc.py model.xlsx 30
  • 修复所有错误,直到状态为“success”
  • 要求零公式错误(#REF!、#DIV/0!、#VALUE! 等)

情景块:

  • 为 Bear/Base/Bull 情形创建独立块
  • 在每个块内按预测年度横向展示假设
  • 使用 IF 公式:=IF($B$6=1,[Bear cell],IF($B$6=2,[Base cell],[Bull cell]))
  • 验证公式引用了正确的情景块单元格

DCF 流程工作流

步骤 1:数据获取与验证

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

数据来源优先级:

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

验证清单:

  • 核实净债务 vs 净现金(对估值至关重要)
  • 确认稀释后流通股数(检查近期回购/发行)
  • 验证历史利润率与商业模式一致
  • 用行业基准交叉核对收入增长率
  • 验证税率合理(通常为 21-28%)
步骤 2:历史分析(3-5 年)

分析并记录:

  • 收入增长趋势:计算 CAGR,识别驱动因素
  • 利润率演进:跟踪毛利率、EBIT 利润率、FCF 利润率
  • 资本密集度:D&A 和 CapEx 占收入的百分比
  • 营运资本效率:NWC 变动占收入增长的百分比
  • 回报指标:ROIC、ROE 趋势

创建汇总表,展示:

Historical Metrics (LTM):
Revenue: $X million
Revenue growth: X% CAGR
Gross margin: X%
EBIT margin: X%
D&A % of revenue: X%
CapEx % of revenue: X%
FCF margin: X%
步骤 3:构建收入预测

方法:

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

增长率框架:

  • 第 1-2 年:较高增长,反映近期可见度
  • 第 3-4 年:逐步放缓至行业平均水平
  • 第 5 年及以后:接近终值增长率

公式结构:

  • 收入(Year N) = 收入(Year N-1) × (1 + 增长率)
  • 增长 %(Year N) = 收入(Year N) / 收入(Year N-1) - 1

三情景方法:

Bear Case: Conservative growth (e.g., 8-12%)
Base Case: Most likely scenario (e.g., 12-16%)
Bull Case: Optimistic growth (e.g., 16-20%)
第 4 步:运营费用建模

固定/可变成本分析:

运营费用应建模体现真实的经营杠杆:

  • 销售与营销:通常为收入的 15-40%,具体取决于商业模式
  • 研究与开发:科技公司通常为 10-30%
  • 一般与行政:通常为收入的 8-15%,随着公司规模扩大体现出杠杆效应

关键原则:

  • 所有百分比均基于收入,而非毛利润
  • 建模经营杠杆:随着收入规模扩大,百分比应下降
  • 为 S&M、R&D、G&A 保持独立的行项目
  • 计算 EBIT = 毛利润 - 总运营费用

利润率扩张框架:

Current State → Target State (Year 5)
Gross Margin: X% → Y% (justify based on scale, efficiency)
EBIT Margin: X% → Y% (result of revenue growth + opex leverage)
第 5 步:自由现金流计算

按正确顺序构建 FCF:

EBIT
(-) Taxes (EBIT × Tax Rate)
= NOPAT (Net Operating Profit After Tax)
(+) D&A (non-cash expense, % of revenue)
(-) CapEx (% of revenue, typically 4-8%)
(-) Δ NWC (change in working capital)
= Unlevered Free Cash Flow

营运资金建模:

  • 按收入变化(增量收入)的百分比计算
  • 典型范围:收入变化的 -2% 至 +2%
  • 负数 = 现金来源(营运资金释放)
  • 正数 = 现金使用(营运资金积累)

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

  • 维护性资本支出:维持当前运营(约为收入的 2-3%)
  • 增长性资本支出:支持扩张(额外占收入的 2-5%)
  • 总资本支出应与公司的增长战略保持一致
第 6 步:资本成本 (WACC) 研究

权益成本的 CAPM 方法论:

Cost of Equity = Risk-Free Rate + Beta × Equity Risk Premium

Where:
- Risk-Free Rate = Current 10-Year Treasury Yield
- Beta = 5-year monthly stock beta vs market index
- Equity Risk Premium = 5.0-6.0% (market standard)

债务成本计算:

After-Tax Cost of Debt = Pre-Tax Cost of Debt × (1 - Tax Rate)

Determine Pre-Tax Cost of Debt from:
- Credit rating (if available)
- Current yield on company bonds
- Interest expense / Total Debt from financials

资本结构权重:

Market Value Equity = Current Stock Price × Shares Outstanding
Net Debt = Total Debt - Cash & Equivalents
Enterprise Value = Market Cap + Net Debt

Equity Weight = Market Cap / Enterprise Value
Debt Weight = Net Debt / Enterprise Value

WACC = (Cost of Equity × Equity Weight) + (After-Tax Cost of Debt × Debt Weight)

特殊情况:

  • 净现金状况:如果现金 > 债务,则净债务为负数
    • 债务权重可能为负数
    • WACC 计算相应调整
  • 无债务:WACC = 权益成本

典型 WACC 范围:

  • 大盘股,稳定:7-9%
  • 成长型公司:9-12%
  • 高增长/高风险:12-15%
第 7 步:折现率应用(5-10 年预测)

年中惯例:

  • 假设现金流发生在年中
  • 折现期:0.5、1.5、2.5、3.5、4.5 等
  • 折现因子 = 1 / (1 + WACC)^期数

现值计算:

For each projection year:
PV of FCF = Unlevered FCF × Discount Factor

Example (Year 1):
FCF = $1,000
WACC = 10%
Period = 0.5
Discount Factor = 1 / (1.10)^0.5 = 0.9535
PV = $1,000 × 0.9535 = $954

预测期选择:

  • 5 年:大多数分析的标准
  • 7-10 年:拥有更长发展期的高增长公司
  • 3 年:成熟、稳定的企业
第 8 步:终值计算

永续增长法(首选):

Terminal FCF = Final Year FCF × (1 + Terminal Growth Rate)
Terminal Value = Terminal FCF / (WACC - Terminal Growth Rate)

Critical Constraint: Terminal Growth < WACC (otherwise infinite value)

终值增长率选择:

  • 保守:2.0-2.5%(GDP 增长率)
  • 温和:2.5-3.5%
  • 激进:3.5-5.0%(仅适用于市场领导者)

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

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

Terminal Value = Final Year EBITDA × Exit Multiple

Where Exit Multiple comes from:
- Industry comparable trading multiples
- Precedent transaction multiples
- Typical range: 8-15x EBITDA

终值现值:

PV of Terminal Value = Terminal Value / (1 + WACC)^Final Period

Where Final Period accounts for timing:
5-year model with mid-year convention: Period = 4.5

终值合理性检查:

  • 应占企业价值的 50-70%
  • 如果 >75%,模型可能过度依赖终值假设
  • 如果 <40%,检查终值假设是否过于保守
第 9 步:企业价值到股权价值桥接

估值摘要结构:

(+) Sum of PV of Projected FCFs = $X million
(+) PV of Terminal Value = $Y million
= Enterprise Value = $Z million

(-) Net Debt [or + Net Cash if negative] = $A million
= Equity Value = $B million

÷ Diluted Shares Outstanding = C million shares
= Implied Price per Share = $XX.XX

Current Stock Price = $YY.YY
Implied Return = (Implied Price / Current Price) - 1 = XX%

关键调整:

  • 净债务 = 总债务 - 现金及等价物
    • 如果为正:从 EV 中减去(降低股权价值)
    • 如果为负(净现金):加到 EV 中(增加股权价值)
  • 使用摊薄后股数:包括期权、RSU、可转换证券
  • 其他调整(如适用):
    • 少数股东权益
    • 养老金负债
    • 经营租赁义务

估值输出格式:

Valuation Component,Amount ($M)
PV Explicit FCFs,X.X
PV Terminal Value,Y.Y
Enterprise Value,Z.Z
(-) Net Debt,A.A
Equity Value,B.B
,,
Shares Outstanding (M),C.C
Implied Price per Share,$XX.XX
Current Share Price,$YY.YY
Implied Upside/(Downside),+XX%
步骤 10:敏感性分析

在 DCF 工作表底部创建 三个敏感性分析表,展示估值如何随不同假设变化:

  1. WACC 与终值增长率 - 展示企业价值对折现率和永续增长率的敏感性
  2. 收入增长率与 EBIT 利润率 - 展示营收增长和经营杠杆的影响
  3. Beta 与无风险利率 - 展示股权资本成本组成部分的敏感性

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

<correct_patterns>

本部分列出了构建 DCF 模型时应遵循的所有正确模式。

情景区块选择模式 - 请遵循此方法

假设按情景分别组织在不同区块中:

关键结构 - 每个章节标题下方有三行:

BEAR CASE ASSUMPTIONS (section header, merge cells across)
Assumption,FY1,FY2,FY3,FY4,FY5
Revenue Growth (%),12%,10%,9%,8%,7%
EBIT Margin (%),45%,44%,43%,42%,41%

BASE CASE ASSUMPTIONS (section header, merge cells across)
Assumption,FY1,FY2,FY3,FY4,FY5
Revenue Growth (%),16%,14%,12%,10%,9%
EBIT Margin (%),48%,49%,50%,51%,52%

BULL CASE ASSUMPTIONS (section header, merge cells across)
Assumption,FY1,FY2,FY3,FY4,FY5
Revenue Growth (%),20%,18%,15%,13%,11%
EBIT Margin (%),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,[Bear block cell],IF($B$6=2,[Base block cell],[Bull block cell]))

汇总列方法将逻辑集中起来,让模型更易于审查。

正确的收入预测模式

使用 INDEX 公式创建汇总列,然后在预测中引用该列:

步骤 1 - FY1 增长率的汇总列: =INDEX([Bear FY1 growth]:[Bull FY1 growth], 1, $B$6)

步骤 2 - 收入预测引用汇总列: Revenue Year 1: =D29*(1+$E$10)

其中:

  • D29 = 上一年度收入
  • $E$10 = FY1 增长率的汇总列单元格(包含 INDEX 公式)
  • $B$6 = 情景选择单元格(1=悲观、2=基准、3=乐观)

这种方式比在每个预测公式中嵌入 IF 语句更简洁,也更便于审查所使用的情景假设。

正确的 FCF 公式模式

使用带 INDEX 公式的汇总列,然后在 FCF 计算中引用该列:

汇总列方法:

Item,Formula,Reference
D&A,=E29*$E$21,$E$21 = consolidation column for D&A %
CapEx,=E29*$E$22,$E$22 = consolidation column for CapEx %
Δ NWC,=(E29-D29)*$E$23,$E$23 = consolidation column for NWC %
Unlevered FCF,=E57+E58-E60-E62,E57=NOPAT E58=D&A E60=CapEx E62=Δ NWC

每个汇总列单元格都包含一个 INDEX 公式,根据情景选择单元格从相应的情景区块提取数据。这样可以让预测公式保持简洁且便于审查。

在编写公式之前,请确认情景区块的行位置并设置好汇总列。

正确的单元格批注格式

每个硬编码值都需要采用以下格式:

“来源:[系统/文档],[日期],[参考资料],[适用时填写 URL]”

示例:

Item,Source Comment
Stock price,Source: Market data script 2025-10-12 Close price
Shares outstanding,Source: 10-K FY2024 Page 45 Note 12
Historical revenue,Source: 10-K FY2024 Page 32 Consolidated Statements
Beta,Source: Market data script 2025-10-12 5-year monthly beta
Consensus estimates,Source: Management guidance Q3 2024 earnings call
正确的假设表结构

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

  1. 分区标题行(合并单元格):例如“BEAR CASE ASSUMPTIONS”
  2. 列标题行,显示年份——此项必不可少,不要跳过
  3. 数据行,填写假设值

结构:

BEAR CASE ASSUMPTIONS (section header - merge across columns A:G)
Assumption,FY1,FY2,FY3,FY4,FY5
Revenue Growth (%),X%,X%,X%,X%,X%
EBIT Margin (%),X%,X%,X%,X%,X%
Terminal Growth,X%,,,,
WACC,X%,,,,

BASE CASE ASSUMPTIONS (section header - merge across columns A:G)
Assumption,FY1,FY2,FY3,FY4,FY5
Revenue Growth (%),X%,X%,X%,X%,X%
EBIT Margin (%),X%,X%,X%,X%,X%
Terminal Growth,X%,,,,
WACC,X%,,,,

BULL CASE ASSUMPTIONS (section header - merge across columns A:G)
Assumption,FY1,FY2,FY3,FY4,FY5
Revenue Growth (%),X%,X%,X%,X%,X%
EBIT Margin (%),X%,X%,X%,X%,X%
Terminal Growth,X%,,,,
WACC,X%,,,,

如果没有显示预测年份(FY2025E、FY2026E 等)的列标题行,用户就无法判断每个假设值对应哪一年。此行必须包含。

然后创建一个汇总列(通常是右侧紧邻的下一列),使用 INDEX 公式根据情景选择器从选定的情景区块中提取数据。投影公式会引用此汇总列。

正确的行规划流程

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

Row,Content
1,[Company Name] DCF Model
2,Ticker | Date | Year End
4,Case Selector
7,KEY ASSUMPTIONS
26,Assumption headers
27-31,Growth assumptions
...,...

2. 写入所有分区分隔行和空行

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

4. 编写公式后立即测试

可以把这想象成建造房屋:

  • 正确:先浇筑地基,再建墙(结构稳固)
  • 错误:先建墙,再浇筑地基(墙会倒塌)

Excel 版本:

  • 正确:先添加标题,再编写公式(公式稳定)
  • 错误:先编写公式,再添加标题(公式会出错)
正确的敏感性分析表实现方式

重要:这不是 Excel 的“数据表”功能,而是使用 openpyxl 编写常规公式的简单网格。没错,这意味着总共约 75 个公式(3 张表 × 每张表 25 个单元格),但这很简单,也是必需的。

使用公式以编程方式填充:

每张敏感性分析表都必须填入完整公式,以便在每组假设下重新计算隐含股价。不要使用 Excel 的数据表功能(它需要手动操作,无法通过 openpyxl 自动化)。

实现方法——具体示例:

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

如果模型的基准 WACC = 9.0%,基准永续增长率 = 3.0%,则围绕这些值对称地构建坐标轴:

WACC vs Terminal Growth,  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]   ← middle row = base WACC
              9.5%,       [fml], [fml], [fml], [fml], [fml]
             10.0%,       [fml], [fml], [fml], [fml], [fml]
                                   ↑
                          middle col = base terminal g

★ = 中心单元格。 其公式计算结果必须等于模型的实际隐含股价(来自估值摘要)。对该单元格应用中蓝色填充(#BDD7EE)和粗体字,以突出显示基准情景。

坐标轴取值规则: axis_values = [base - 2*step, base - step, base, base + step, base + 2*step]——围绕基准值对称排列,奇数个值可确保中心位置有一个值。

公式示例——单元格 B88(WACC=8.0%,永续增长率=2.0%):

B88 中的公式应使用以下数据重新计算隐含股价:

  • 行标题中的 WACC:$A88(8.0%)
  • 列标题中的永续增长率:B$87(2.0%)

**建议方法:**引用主要 DCF 计算,但用这些值替换相应参数。

公式结构示例: =([SUM of PV FCFs using $A88 as discount rate] + [Terminal Value using B$87 as growth rate and $A88 as WACC] - [Net Debt]) / [Shares]

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

Python 实现模式:

# Pseudocode for populating sensitivity table
for row_idx, wacc_value in enumerate(wacc_range):
    for col_idx, term_growth_value in enumerate(term_growth_range):
        # Build formula that uses wacc_value and term_growth_value
        formula = f"=<DCF recalc using {wacc_value} and {term_growth_value}>"
        ws.cell(row=start_row+row_idx, column=start_col+col_idx).value = formula

打开模型后,敏感性分析表必须立即可用,无需用户执行任何手动操作。

</correct_patterns>

<common_mistakes>

本节列出了构建 DCF 模型时应避免的所有错误做法。

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

不要使用线性近似:

// WRONG - Linear approximation
B97: =B88*(1+(0.096-0.116))    // Assumes linear relationship

// WRONG - Division shortcut
B105: =B88/(1+(E48-0.07))      // Doesn't recalculate full DCF

不要留下占位文本:

// WRONG - Placeholder note
"Note: Use Excel Data Table feature (Data → What-If Analysis → Data Table) to populate sensitivity tables."

// WRONG - Empty cells
[leaving cells blank because "this is complex"]

不要混淆术语:

  • ❌ "敏感性表格需要 Excel 的数据表功能"(不对——那是我们无法使用的特定 Excel 工具)
  • ✅ "敏感性表格是简单的网格,每个单元格中都有公式"(对——这才是我们要构建的)

为什么这些捷径是错误的:

  • 线性近似公式实际上并不会重新计算 DCF——它们只是应用简单的数学调整
  • 这些关系不是线性的,因此结果会不准确
  • 占位文本需要用户手动干预
  • 交付时模型无法立即使用
  • 不专业,也无法交付给客户
  • 空单元格 = 不完整的交付物

要拒绝的常见合理化借口: "编写 75 个以上的公式感觉太复杂,所以我留个备注让用户手动完成。"

现实: 当你在 Python 中使用 openpyxl 编写循环时,编写 75 个公式是直截了当的。每个公式都遵循相同的模式——只需替换行/列值即可。这是交付物的必需部分。

正确做法: 为每个敏感性单元格填充公式,针对该特定假设组合重新计算完整的 DCF

错误:缺少单元格批注

不要这样做:

  • 创建所有硬编码输入却没有批注
  • 想着"我稍后再加"
  • 写"TODO: 添加来源"
  • 留下蓝色输入却没有文档说明

为什么这是错误的:

  • 无法验证数据来自哪里
  • 不符合 xlsx 技能要求
  • 未经审计准备
  • 浪费以后修复的时间

正确做法: 在创建每个硬编码值时添加单元格批注

错误:公式行引用偏移

症状: FCF 部分引用了错误的假设行: D&A: =E29*$E$34 // 应该是 $E$21,但引用了错误的行 CapEx: =E29*$E$41 // 应该是 $E$22,但行偏移了

为什么会发生这种情况:

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

正确做法: 先锁定行布局,然后编写公式

错误:每个假设在所有情景中只占一行

不要这样组织假设:

Assumption,Bear,Base,Bull
Revenue Growth FY1,10%,13%,16%
Revenue Growth FY2,9%,12%,15%

这种垂直布局使得难以看出每个情景中各年份的演进。

为什么这是错误的:

  • 使得难以看出每个情景中假设在各年份的演进
  • 更难在整个预测期内比较情景假设
  • 对审查情景逻辑来说不够直观

正确做法:

  • 为每个情景(Bear、Base、Bull)创建单独的区块
  • 在每个区块内,横向展示假设在各预测年份的分布
  • 这使得每个情景的假设作为一个连贯的整体更易于审查
错误:没有边框

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

  • 没有分节划分
  • 所有单元格混在一起
  • 难以阅读且不专业

为什么这是错误的:

  • 无法交付给客户
  • 难以导航
  • 看起来很业余

正确做法: 在所有主要部分周围添加边框

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

不要这样做:

  • 所有文本都是黑色
  • 只使用填充颜色(不改变字体颜色)
  • 搞混哪些单元格是蓝色、哪些是黑色

为什么这是错误的:

  • 无法区分输入和公式
  • 审计变得不可能
  • 违反 xlsx 技能要求

正确做法: 所有硬编码输入使用蓝色文本,所有公式使用黑色文本,工作表链接使用绿色

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

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

为什么这是错误的:

  • 营业费用随收入变化,而不是随毛利润变化
  • 产生不切实际的利润率演进
  • 不符合企业的实际运营方式

正确做法: S&M: =E29*0.15 // E29 = 收入(正确)

前 5 大错误总结
  1. 公式行引用错位 → 在编写公式之前先定义所有行位置
  2. 缺少单元格批注 → 在创建单元格时就添加批注,而不是最后才加
  3. 过度简化的敏感性表格 → 用完整的 DCF 重算公式填充所有单元格,而不是近似值
  4. 情景区块引用错误 → 确保 IF 公式从正确的 Bear/Base/Bull 区块取值
  5. 没有边框 → 添加专业的分节边框,以便呈现给客户

此外,还要注意以下错误:

WACC 计算错误
  • 在资本结构中混用账面价值和市场价值
  • 错误地使用股权 beta 而非资产/无杠杆 beta
  • 对债务成本应用错误的税率
  • 无风险利率不正确(必须使用当前 10Y 国债收益率)
  • 未针对净债务与净现金头寸进行调整
增长假设缺陷
  • 永续增长率 > WACC(会创造无限价值)
  • 预测增长率与历史表现不一致
  • 忽视行业增长约束
  • 收入增长与单位经济模型不一致
  • 没有运营依据的利润率扩张
终值错误
  • 使用错误的增长方法(永续增长法与退出倍数法)
  • 终值 > 企业价值的 80%(表明过度依赖终值)
  • 终值利润率与稳态假设不一致
  • 终值的折现期数错误
现金流预测错误
  • 营业费用基于毛利润而非收入
  • D&A/CapEx 百分比与商业模式不一致
  • 营运资本变动未正确计算
  • 各年度税率不一致
  • NOPAT 计算错误

这些错误最为常见。在开始任何 DCF 建模之前,请重新阅读本节。

</common_mistakes>

Excel 文件创建

本技能在所有电子表格操作中使用 xlsx 技能。 xlsx 技能提供:

  • 标准化的公式构建规则
  • 数字格式约定
  • 通过 recalc.py 脚本自动重算公式
  • 全面的错误检查与验证

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

质量评分标准

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

  1. 基于历史表现的现实收入和利润率假设
  2. 采用正确 CAPM 方法的适当资本成本计算
  3. 展示估值区间的全面敏感性分析
  4. 带有支持性依据的清晰终值计算
  5. 支持情景分析的专业模型结构
  6. 对所有关键假设的透明文档记录

输入要求

最低必需输入
  1. 公司标识:股票代码或公司名称
  2. 增长假设:预测期的收入增长率(或“使用一致预期”)
  3. 可选参数:
    • 预测期(默认:5 年)
    • 情景案例(Bear/Base/Bull 增长和利润率假设)
    • 终值增长率(默认:2.5-3.0%)
    • 若不使用 CAPM,则指定具体的 WACC 输入

Excel 模型结构

工作表架构

创建两个工作表:

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

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

公式重算(强制)

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

python recalc.py [path_to_excel_file] [timeout_seconds]

示例:

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

该脚本将:

  • 使用 LibreOffice 重算所有工作表中的所有公式
  • 扫描所有单元格以查找 Excel 错误(#REF!、#DIV/0!、#VALUE!、#NAME?、#NULL!、#NUM!、#N/A)
  • 返回包含错误位置和数量的详细 JSON

预期输出格式:

{
  "status": "success",           // or "errors_found"
  "total_errors": 0,              // Total error count
  "total_formulas": 42,           // Number of formulas in file
  "error_summary": {}             // Only present if errors found
}

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

{
  "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 技能,强制)

  • 蓝色文本(RGB: 0,0,255):所有硬编码输入(股价、股数、历史数据、假设)
  • 黑色文本(RGB: 0,0,0):所有公式和计算
  • 绿色文本(RGB: 0,128,0):指向其他工作表的链接(WACC 工作表引用)

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

  • 保持极简 — 填充仅使用蓝色和灰色。不要引入绿色、黄色、橙色或多种强调色。颜色过多的模型看起来很业余。
  • 默认填充调色板:
    • 章节标题:深蓝色(RGB: 31,78,121 / #1F4E79)背景配白色粗体文本
    • 子标题/列标题:浅蓝色(RGB: 217,225,242 / #D9E1F2)背景配黑色粗体文本
    • 输入单元格:浅灰色(RGB: 242,242,242 / #F2F2F2)背景配蓝色字体 — 或者如果追求极致极简,也可仅用白色背景配蓝色字体
    • 计算单元格:白色背景配黑色字体
    • 输出/汇总行(每股价值、EV 等):中蓝色(RGB: 189,215,238 / #BDD7EE)背景配黑色粗体字体
  • 就这样 — 3 种蓝色 + 1 种灰色 + 白色。 抵制添加更多颜色的冲动。
  • 用户提供的模板或明确的颜色偏好始终覆盖这些默认值。

两层如何协同工作:

  • 输入单元格:蓝色字体 + 浅灰色填充 = "硬编码输入"
  • 公式单元格:黑色字体 + 白色背景 = "计算值"
  • 工作表链接:绿色字体 + 白色背景 = "来自另一工作表的引用"
  • 关键输出:黑色粗体字体 + 中蓝色填充 = "这就是答案"

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

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

粗边框(1.5pt)用于主要部分:

  • 关键输入部分
  • 预测假设部分
  • 5 年现金流预测部分
  • 终值部分
  • 估值摘要部分
  • 每个敏感性分析表

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

  • 公司详情与历史业绩
  • 增长假设与 EBIT 利润率与 FCF 参数

细边框(0.5pt)用于数据表格:

  • 情景假设表(Bear | Base | Bull | Selected)
  • 历史与预测财务数据矩阵

无边框: 表格内的单个单元格(保持整洁、便于浏览)

边框是强制性的 —— 没有专业边框的模型无法交付给客户。

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

  • 年份:格式化为文本字符串(例如 "2024" 而非 "2,024")
  • 百分比:0.0%(一位小数)
  • 货币:百万为单位用 $#,##0;每股用 $#,##0.00 —— 始终在表头中指定单位("Revenue ($mm)")
  • 零值:使用数字格式将所有零显示为 "-"(例如 $#,##0;($#,##0);-)
  • 大数字:#,##0,带千位分隔符
  • 负数:(#,##0) 用括号表示(不是负号)

单元格注释(所有硬编码输入都必须添加):

根据 xlsx 技能,所有硬编码值都必须有单元格注释记录来源。格式:"Source: [System/Document], [Date], [Reference], [URL if applicable]"

关键:在创建单元格时就添加注释。不要推迟到最后。

DCF 工作表详细结构

第 1 部分:表头

Row,Content
1,[Company Name] DCF Model
2,Ticker: [XXX] | Date: [Date] | Year End: [FYE]
3,Blank
4,Case Selector Cell (1=Bear 2=Base 3=Bull)
5,Case Name Display (formula: =IF([Selector]=1"Bear"IF([Selector]=2"Base""Bull")))

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

Item,Value
Current Stock Price,$XX.XX
Shares Outstanding (M),XX.X
Market Cap ($M),[Formula]
Net Debt ($M),XXX [or Net Cash if negative]

第 3 部分:DCF 情景假设

为每个情景(Bear、Base、Bull)创建独立的假设块,包含 DCF 特定的假设(收入增长率 %、EBIT 利润率 %、税率 %、D&A 占收入 %、CapEx 占收入 %、NWC 变动占 ΔRev %、终值增长率、WACC),横向排列在各预测年份上。每个块必须包含部分标题、显示预测年份(FY1、FY2 等)的列标题行以及数据行。有关确切布局,请参阅 <correct_patterns> 部分的"正确的假设表结构"。

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

引用一个汇总列(例如 "Selected Case"),从各情景块中提取数据,而不是在每个预测行中散布 IF 公式。

Income Statement ($M),2020A,2021A,2022A,2023A,2024E,2025E,2026E
Revenue,XXX,XXX,XXX,XXX,[=E29*(1+$E$10)],[=F29*(1+$E$11)],[=G29*(1+$E$12)]
  % growth,XX%,XX%,XX%,XX%,[=E29/D29-1],[=F29/E29-1],[=G29/F29-1]
,,,,,,
Gross Profit,XXX,XXX,XXX,XXX,[=E29*E33],[=F29*F33],[=G29*G33]
  % margin,XX%,XX%,XX%,XX%,[=E33/E29],[=F33/F29],[=G33/G29]
,,,,,,
Operating Expenses:,,,,,,,
  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]
  Total OpEx,XXX,XXX,XXX,XXX,[=E36+E37+E38],[=F36+F37+F38],[=G36+G37+G38]
,,,,,,
EBIT,XXX,XXX,XXX,XXX,[=E33-E39],[=F33-F39],[=G33-G39]
  % margin,XX%,XX%,XX%,XX%,[=E41/E29],[=F41/F29],[=G41/G29]
,,,,,,
Taxes,(XX),(XX),(XX),(XX),[=E41*$E$24],[=F41*$E$24],[=G41*$E$24]
  Tax rate,XX%,XX%,XX%,XX%,[=E43/E41],[=F43/F41],[=G43/G41]
,,,,,,
NOPAT,XXX,XXX,XXX,XXX,[=E41-E43],[=F41-F43],[=G41-G43]

关键公式模式:

  • 收入增长:=E29*(1+$E$10),其中 $E$10 是第 1 年增长的汇总列
  • 而非:=E29*(1+IF($B$6=1,$B$10,IF($B$6=2,$C$10,$D$10)))

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

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

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

Cash Flow ($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]
    % of Rev,XX%,XX%,XX%,XX%,[=E58/E29],[=F58/F29],[=G58/G29]
(-) CapEx,(XX),(XX),(XX),(XX),[=E29*$E$22],[=F29*$E$22],[=G29*$E$22]
    % of Rev,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]
    % of Δ Rev,XX%,XX%,XX%,XX%,[=E62/(E29-D29)],[=F62/(F29-E29)],[=G62/(G29-F29)]
,,,,,,
Unlevered FCF,XXX,XXX,XXX,XXX,[=E57+E58-E60-E62],[=F57+F58-F60-F62],[=G57+G58-G60-G62]

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

  • $E$21 = D&A % 假设(汇总列,第 21 行)
  • $E$22 = CapEx % 假设(汇总列,第 22 行)
  • $E$23 = NWC % 假设(汇总列,第 23 行)
  • E29 = 当年收入(第 29 行)
  • E45 = 当年 NOPAT(第 45 行)

编写公式之前:确认这些行号与实际布局一致。先测试一列,然后横向复制。

第 6 部分:折现与估值

DCF Valuation,2024E,2025E,2026E,2027E,2028E,Terminal
Unlevered FCF ($M),XXX,XXX,XXX,XXX,XXX,
Period,0.5,1.5,2.5,3.5,4.5,
Discount Factor,0.XX,0.XX,0.XX,0.XX,0.XX,
PV of FCF ($M),XXX,XXX,XXX,XXX,XXX,
,,,,,,
Terminal FCF ($M),,,,,,,XXX
Terminal Value ($M),,,,,,,XXX
PV Terminal Value ($M),,,,,,,XXX
,,,,,,
Valuation Summary ($M),,,,,,
Sum of PV FCFs,XXX,,,,,
PV Terminal Value,XXX,,,,,
Enterprise Value,XXX,,,,,
(-) Net Debt,(XX),,,,,
Equity Value,XXX,,,,,
,,,,,,
Shares Outstanding (M),XX.X,,,,,
IMPLIED PRICE PER SHARE,$XX.XX,,,,,
Current Stock Price,$XX.XX,,,,,
Implied Upside/(Downside),XX%,,,,,
WACC 工作表结构
COST OF EQUITY CALCULATION,,
Risk-Free Rate (10Y Treasury),X.XX%,[Yellow input]
Beta (5Y monthly),X.XX,[Yellow input]
Equity Risk Premium,X.XX%,[Yellow input]
Cost of Equity,X.XX%,[Calculated blue]
,,
COST OF DEBT CALCULATION,,
Credit Rating,AA-,[Yellow input]
Pre-Tax Cost of Debt,X.XX%,[Yellow input]
Tax Rate,XX.X%,[Link to DCF sheet]
After-Tax Cost of Debt,X.XX%,[Calculated blue]
,,
CAPITAL STRUCTURE,,
Current Stock Price,$XX.XX,[Link to DCF]
Shares Outstanding (M),XX.X,[Link to DCF]
Market Capitalization ($M),"X,XXX",[Calculated]
,,
Total Debt ($M),XXX,[Yellow input]
Cash & Equivalents ($M),XXX,[Yellow input]
Net Debt ($M),XXX,[Calculated]
,,
Enterprise Value ($M),"X,XXX",[Calculated]
,,
WACC CALCULATION,Weight,Cost,Contribution
Equity,XX.X%,X.X%,X.XX%
Debt,XX.X%,X.X%,X.XX%
,,
WEIGHTED AVERAGE COST OF CAPITAL,X.XX%,[Green output]

关键 WACC 公式:

Market Cap = Price × Shares
Net Debt = Total Debt - Cash
Enterprise Value = Market Cap + Net Debt
Equity Weight = Market Cap / EV
Debt Weight = Net Debt / EV
WACC = (Cost of Equity × Equity Weight) + (After-tax Cost of Debt × Debt Weight)
敏感性分析(DCF 工作表底部)

术语提醒:"敏感性表" = 简单的二维网格,包含行标题、列标题,以及每个数据单元格中的公式。不是 Excel 的"数据表"功能(数据 → 模拟分析 → 数据表)。你将使用 openpyxl 将常规 Excel 公式写入每个单元格。

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

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

  1. WACC vs 永续增长率(第 87-100 行)- 5x5 网格 = 25 个包含公式的单元格
  2. 收入增长率 vs EBIT 利润率(第 102-115 行)- 5x5 网格 = 25 个包含公式的单元格
  3. Beta vs 无风险利率(第 117-130 行)- 5x5 网格 = 25 个包含公式的单元格

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

关键:所有敏感性表单元格都必须使用 openpyxl 以编程方式填充公式。不要使用线性近似捷径。不要留下占位文本或关于手动步骤的注释。不要因为"太复杂"就合理化地让单元格留空——使用 Python 循环生成公式。

表格设置:

  1. 创建带有行/列标题的表格结构(要测试的假设值)
  2. 为每个数据单元格填充公式,该公式:
    • 使用行标题值(例如,WACC = 9.0%)
    • 使用列标题值(例如,永续增长率 = 3.0%)
    • 使用这些特定假设重新计算完整的 DCF
    • 返回该情景下的隐含股价
  3. 交付时所有单元格必须包含可用的公式
  4. 使用条件格式设置单元格格式:较高值使用绿色色阶,较低值使用红色色阶
  5. 将基准情景单元格加粗
  6. 表格之间留 1-2 个空行

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

情景选择器实现

三情景框架:

熊市情景
  • 保守的收入增长(历史区间低端)
  • 利润率压缩或无扩张
  • 更高的 WACC(风险溢价增加)
  • 更低的永续增长率
  • 更高的 CapEx 假设
基准情景
  • 共识或管理层指引的收入增长
  • 基于经营杠杆的适度利润率扩张
  • 当前市场隐含的 WACC
  • 与 GDP 一致的永续增长率(2.5-3.0%)
  • 标准 CapEx 假设
牛市情景
  • 乐观的收入增长(预测区间高端)
  • 显著的利润率扩张
  • 更低的 WACC(风险溢价降低)
  • 更高的永续增长率(3.5-5.0%)
  • 降低的 CapEx 强度

公式实现:

不要到处使用嵌套 IF 公式。 而是创建一个合并列,使用 INDEX 或 OFFSET 公式从适当的情景块中提取数据。

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

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

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

交付物结构

文件命名:[Ticker]_DCF_Model_[Date].xlsx

两个工作表:

  1. DCF - 包含熊市/基准/牛市情景的完整模型 + 底部的三个敏感性表(WACC vs 永续增长率、收入增长率 vs EBIT 利润率、Beta vs 无风险利率)
  2. WACC - 资本成本计算

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

最佳实践

模型构建
  1. 逐步构建:在进入下一部分之前完成每个部分
  2. 边构建边测试:输入示例数字以验证公式
  3. 使用一致的结构:相似的计算遵循相似的模式
  4. 注释复杂公式:为不寻常的计算添加注释
  5. 内置检查:在适用处添加求和检查和平衡检查
文档记录
  1. 记录所有假设:解释关键输入背后的推理依据
  2. 引用数据来源:注明每个数据点的出处
  3. 说明方法论:描述任何非标准方法
  4. 标记不确定性:突出显示可见性有限的领域
质量控制
  1. 交叉核对计算:以多种方式验证数学计算
  2. 压力测试假设:运行敏感性分析以确保模型稳健
  3. 同行评审:让他人检查公式
  4. 版本控制:随着工作推进保存各个版本

常见变体

高增长科技公司
  • 更长的预测期(7-10 年)
  • 更高的初始增长率(20-30%)
  • 随时间推移显著的利润率扩张
  • 更高的 WACC(12-15%)
  • 对单位经济模型建模(用户数、ARPU 等)
成熟/稳定公司
  • 较短的预测期(3-5 年)
  • 适度的增长率(GDP +1-3%)
  • 稳定的利润率
  • 较低的 WACC(7-9%)
  • 关注现金生成和资本配置
周期性公司
  • 贯穿经济周期建模
  • 在周期中部将利润率正常化
  • 考虑谷底和峰值情景
  • 根据周期性调整 beta
多业务板块公司
  • 为每个业务单元分别进行 DCF
  • 按板块设定不同的增长率和利润率
  • 分部估值加总法
  • 考虑协同效应

故障排查

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

工作流集成

在 DCF 构建开始时
  1. 收集市场数据:

    • 检查是否有可用的 MCP 服务获取当前市场数据
    • 使用网页搜索/抓取获取股价、beta 及其他市场指标
    • 如需特定数据,向用户请求
  2. 收集历史财务数据:

    • 检查是否有可用的 MCP 服务(Daloopa 等)
    • 如果无法通过 MCP 获取,向用户请求
    • 如有必要,从 10-K 中手动提取
  3. 开始模型构建,使用本技能中详述的 DCF 方法论

在模型构建过程中
  1. 构建 Excel 模型,使用 openpyxl 并采用公式(而非硬编码值)
  2. 遵循 xlsx 技能约定进行公式构建和格式设置
  3. 仅在用户要求时或提供了特定品牌指南时才应用填充颜色
在交付模型之前(强制要求)
  1. 验证结构:

    • 熊市/基准/牛市的情景区块,假设覆盖各预测年份
    • 情景选择器可正常工作,公式引用正确的情景区块
    • 敏感性表格位于 DCF 工作表底部(而非单独的工作表)
    • 字体颜色:蓝色输入、黑色公式、绿色工作表链接
    • 对所有权硬编码输入添加单元格批注
    • 主要区块周围使用专业边框
  2. 重新计算公式:运行 python recalc.py model.xlsx 30

  3. 检查输出:

    • 如果 status 为 "success" → 继续执行步骤 4
    • 如果 status 为 "errors_found" → 检查 error_summary 并阅读 TROUBLESHOOTING.md 获取调试指导
  4. 修复错误并重新运行 recalc.py,直到状态为 "success"

  5. 抽查公式:

    • 测试一个 FCF 公式——它是否引用了正确的假设行?
    • 更改情景选择器——合并列是否正确更新?
    • 验证收入公式引用的是合并列(而非嵌套 IF 公式)
  6. 交付模型

可用数据来源
  • MCP 服务:如果已配置(Daloopa 用于历史财务数据)
  • 网页搜索/抓取:用于获取当前股价、beta 和市场数据
  • 用户提供的数据:历史财务数据、一致预期
  • 手动提取:SEC EDGAR 文件作为后备方案

最终输出检查清单

交付 DCF 模型之前:

必需项:

  • 运行 python recalc.py model.xlsx 30,直到状态为 "success"(零公式错误)
  • 两个工作表:DCF(底部包含敏感性分析)、WACC
  • 字体颜色:蓝色=输入项,黑色=公式,绿色=工作表链接
  • 所有硬编码输入项都要有单元格批注
  • 敏感性表格完全用公式填充
  • 主要部分周围使用专业边框

验证:

  • OpEx 基于收入(而非毛利润)
  • 终值占 EV 的 50-70%
  • 永续增长率 < WACC
  • 税率 21-28%
  • 文件命名:[Ticker]_DCF_Model_[Date].xlsx

评论

支持 Markdown