dcf-model

安装量: 158
排名: #5490

安装

npx skills add https://github.com/anthropics/financial-services-plugins --skill dcf-model
DCF Model Builder
Overview
This skill creates institutional-quality DCF models for equity valuation following investment banking standards. Each analysis produces a detailed Excel model (with sensitivity analysis included at the bottom of the DCF sheet).
Tools
Default to using all of the information provided by the user and MCP servers available for data sourcing.
Critical Constraints - Read These First
These constraints apply throughout all DCF model building. Review before starting:
Sensitivity Tables:
Populate ALL 75 cells (3 tables × 25 cells) with full DCF recalculation formulas
Use openpyxl loops to write formulas programmatically
NO placeholder text, NO linear approximations, NO manual steps required
Each cell must recalculate full DCF for that assumption combination
Cell Comments:
Add cell comments AS each hardcoded value is created
Format: "Source: [System/Document], [Date], [Reference], [URL if applicable]"
Every blue input must have a comment before moving to next section
Do not defer to end or write "TODO: add source"
Model Layout Planning:
Define ALL section row positions BEFORE writing any formulas
Write ALL headers and labels first
Write ALL section dividers and blank rows second
THEN write formulas using the locked row positions
Test formulas immediately after creation
Formula Recalculation:
Run
python recalc.py model.xlsx 30
before delivery
Fix ALL errors until status is "success"
Zero formula errors required (#REF!, #DIV/0!, #VALUE!, etc.)
Scenario Blocks:
Create separate blocks for Bear/Base/Bull cases
Show assumptions horizontally across projection years within each block
Use IF formulas:
=IF($B$6=1,[Bear cell],IF($B$6=2,[Base cell],[Bull cell]))
Verify formulas reference correct scenario block cells
DCF Process Workflow
Step 1: Data Retrieval and Validation
Fetch data from MCP servers, user provided data, and the web.
Data Sources Priority:
MCP Servers
(if configured) - Structured financial data from providers like Daloopa
User-Provided Data
- Historical financials from their research
Web Search/Fetch
- Current prices, beta, debt and cash when needed
Validation Checklist:
Verify net debt vs net cash (critical for valuation)
Confirm diluted shares outstanding (check for recent buybacks/issuances)
Validate historical margins are consistent with business model
Cross-check revenue growth rates with industry benchmarks
Verify tax rate is reasonable (typically 21-28%)
Step 2: Historical Analysis (3-5 years)
Analyze and document:
Revenue growth trends
Calculate CAGR, identify drivers
Margin progression
Track gross margin, EBIT margin, FCF margin
Capital intensity
D&A and CapEx as % of revenue
Working capital efficiency
NWC changes as % of revenue growth
Return metrics
ROIC, ROE trends
Create summary tables showing:
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%
Step 3: Build Revenue Projections
Methodology:
Start with latest actual revenue (LTM or most recent fiscal year)
Apply growth rates for each projection year
Show both dollar amounts AND calculated growth %
Growth Rate Framework:
Year 1-2: Higher growth reflecting near-term visibility
Year 3-4: Gradual moderation toward industry average
Year 5+: Approaching terminal growth rate
Formula structure:
Revenue(Year N) = Revenue(Year N-1) × (1 + Growth Rate)
Growth %(Year N) = Revenue(Year N) / Revenue(Year N-1) - 1
Three-scenario approach:
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%)
Step 4: Operating Expense Modeling
Fixed/Variable Cost Analysis:
Operating expenses should model realistic operating leverage:
Sales & Marketing
Typically 15-40% of revenue depending on business model
Research & Development
Typically 10-30% for technology companies
General & Administrative
Typically 8-15% of revenue, shows leverage as company scales
Key principles:
ALL percentages based on REVENUE, not gross profit
Model operating leverage: % should decline as revenue scales
Maintain separate line items for S&M, R&D, G&A
Calculate EBIT = Gross Profit - Total OpEx
Margin expansion framework:
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)
Step 5: Free Cash Flow Calculation
Build FCF in proper sequence:
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
Working Capital Modeling:
Calculate as % of revenue change (delta revenue)
Typical range: -2% to +2% of revenue change
Negative number = source of cash (working capital release)
Positive number = use of cash (working capital build)
Maintenance vs Growth CapEx:
Maintenance CapEx: Sustains current operations (~2-3% revenue)
Growth CapEx: Supports expansion (additional 2-5% revenue)
Total CapEx should align with company's growth strategy
Step 6: Cost of Capital (WACC) Research
CAPM Methodology for Cost of Equity:
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)
Cost of Debt Calculation:
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
Capital Structure Weights:
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)
Special Cases:
Net Cash Position
If Cash > Debt, Net Debt is NEGATIVE
Debt Weight may be negative
WACC calculation adjusts accordingly
No Debt
WACC = Cost of Equity
Typical WACC Ranges:
Large Cap, Stable: 7-9%
Growth Companies: 9-12%
High Growth/Risk: 12-15%
Step 7: Discount Rate Application (5-10 Year Forecast)
Mid-Year Convention:
Cash flows assumed to occur mid-year
Discount Period: 0.5, 1.5, 2.5, 3.5, 4.5, etc.
Discount Factor = 1 / (1 + WACC)^Period
Present Value Calculation:
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
Projection Period Selection:
5 years
Standard for most analyses
7-10 years
High growth companies with longer runway
3 years
Mature, stable businesses
Step 8: Terminal Value Calculation
Perpetuity Growth Method (Preferred):
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)
Terminal Growth Rate Selection:
Conservative: 2.0-2.5% (GDP growth rate)
Moderate: 2.5-3.5%
Aggressive: 3.5-5.0% (only for market leaders)
Do not exceed
Risk-free rate or long-term GDP growth
Exit Multiple Method (Alternative):
Terminal Value = Final Year EBITDA × Exit Multiple
Where Exit Multiple comes from:
- Industry comparable trading multiples
- Precedent transaction multiples
- Typical range: 8-15x EBITDA
Present Value of Terminal Value:
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
Terminal Value Sanity Check:
Should represent 50-70% of Enterprise Value
If >75%, model may be over-reliant on terminal assumptions
If <40%, check if terminal assumptions are too conservative
Step 9: Enterprise to Equity Value Bridge
Valuation Summary Structure:
(+) 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%
Critical Adjustments:
Net Debt = Total Debt - Cash & Equivalents
If positive: Subtract from EV (reduces equity value)
If negative (Net Cash): Add to EV (increases equity value)
Use Diluted Shares
Includes options, RSUs, convertible securities
Other adjustments
(if applicable):
Minority interests
Pension liabilities
Operating lease obligations
Valuation Output Format:
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%
Step 10: Sensitivity Analysis
Build
three sensitivity tables
at the bottom of the DCF sheet showing how valuation changes with different assumptions:
WACC vs Terminal Growth
- Shows enterprise value sensitivity to discount rate and perpetuity growth
Revenue Growth vs EBIT Margin
- Shows impact of top-line growth and operating leverage
Beta vs Risk-Free Rate
- Shows sensitivity to cost of equity components
Implementation
These are simple 2D grids (NOT Excel's "Data Table" feature) with formulas in each cell. Each cell must contain a full DCF recalculation for that specific assumption combination. See Critical Constraints section for detailed requirements on populating all 75 cells programmatically using openpyxl.
This section contains all the CORRECT patterns to follow when building DCF models.
Scenario Block Selection Pattern - Follow This Approach
Assumptions are organized in separate blocks for each scenario:
CRITICAL STRUCTURE - Three rows per section header:
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%
Each scenario block MUST have a column header row
showing the projection years (FY2025E, FY2026E, etc.) immediately below the section title. Without this, users cannot tell which assumption value corresponds to which year.
How to reference assumptions - Create a consolidation column:
Case selector cell (e.g., B6) contains 1=Bear, 2=Base, or 3=Bull
Create a consolidation column with INDEX or OFFSET formulas to pull from the correct scenario block
Projection formulas reference the consolidation column (clean cell references)
Each scenario block contains full set of DCF assumptions across projection years
Recommended consolidation column pattern (using INDEX):
=INDEX(B10:D10, 1, $B$6)
NOT this - scattered IF statements throughout:
=IF($B$6=1,[Bear block cell],IF($B$6=2,[Base block cell],[Bull block cell]))
The consolidation column approach centralizes logic and makes the model easier to audit.
Correct Revenue Projection Pattern
Create a consolidation column with INDEX formulas, then reference it in projections:
Step 1 - Consolidation column for FY1 growth:
=INDEX([Bear FY1 growth]:[Bull FY1 growth], 1, $B$6)
Step 2 - Revenue projection references the consolidation column:
Revenue Year 1: =D29*(1+$E$10)
Where:
D29 = Prior year revenue
$E$10 = Consolidation column cell for FY1 growth (contains INDEX formula)
$B$6 = Case selector (1=Bear, 2=Base, 3=Bull)
This approach is cleaner than embedding IF statements in every projection formula
and makes it much easier to audit which scenario assumptions are being used.
Correct FCF Formula Pattern
Use consolidation columns with INDEX formulas, then reference them in FCF calculations:
Consolidation column approach:
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
Each consolidation column cell contains an INDEX formula
that pulls from the appropriate scenario block based on case selector. This keeps projection formulas clean and auditable.
Before writing formulas, confirm scenario block row locations and set up consolidation columns.
Correct Cell Comment Format
Every hardcoded value needs this format:
"Source: [System/Document], [Date], [Reference], [URL if applicable]"
Examples:
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
Correct Assumption Table Structure
CRITICAL: Each scenario block requires THREE structural elements:
Section header row
(merged cells): e.g., "BEAR CASE ASSUMPTIONS"
Column header row
showing years - THIS IS REQUIRED, DO NOT SKIP
Data rows
with assumption values
Structure:
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%
,
,
,
,
WITHOUT the column header row showing projection years (FY2025E, FY2026E, etc.), users cannot tell which assumption value corresponds to which year. This row is MANDATORY.
Then create a consolidation column
(typically the next column to the right) that uses INDEX formulas to pull from the selected scenario block based on the case selector. This consolidation column is what your projection formulas reference.
Correct Row Planning Process
1. Write ALL headers and labels FIRST:
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. Write ALL section dividers and blank rows
3. THEN write formulas using the locked row positions
4. Test formulas immediately after creation
Think of it like construction:
Good: Pour foundation, then build walls (stable structure)
Bad: Build walls, then pour foundation (walls collapse)
Excel version:
Good: Add headers, then write formulas (formulas stable)
Bad: Write formulas, then add headers (formulas break)
Correct Sensitivity Table Implementation
IMPORTANT
These are NOT Excel's "Data Table" feature. These are simple grids where you write regular formulas using openpyxl. Yes, this means ~75 formulas total (3 tables × 25 cells each), but this is straightforward and required. Programmatic Population with Formulas: Each sensitivity table must be fully populated with formulas that recalculate the implied share price for each combination of assumptions. Do not use Excel's Data Table feature (it requires manual intervention and cannot be automated via openpyxl). Implementation approach - CONCRETE EXAMPLE: Table Structure (5x5 grid): WACC vs Terminal Growth , 2.0% , 2.5% , 3.0% , 3.5% , 4.0% 8.0% , [B88 formula] , [C88 formula] , [D88 formula] , [E88 formula] , [F88 formula] 9.0% , [B89 formula] , [C89 formula] , [D89 formula] , [E89 formula] , [F89 formula] ... , ... , ... , ... , ... , ... Formula Pattern - Cell B88 (WACC=8.0%, Terminal Growth=2.0%): The formula in B88 should recalculate the implied price using: WACC from row header: $A88 (8.0%) Terminal Growth from column header: B$87 (2.0%) Recommended approach: Reference the main DCF calculation but substitute these values. Example formula structure: =([SUM of PV FCFs using $A88 as discount rate] + [Terminal Value using B$87 as growth rate and $A88 as WACC] - [Net Debt]) / [Shares] CRITICAL - Write a formula for EVERY cell in the 5x5 grid (25 cells per table, 75 cells total). Use openpyxl to write these formulas programmatically in a loop. Do NOT skip this step or leave placeholder text. Python implementation pattern:

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
The sensitivity tables must work immediately when the model is opened, with no manual steps required from the user.
This section contains all the WRONG patterns to avoid when building DCF models.
WRONG: Simplified Sensitivity Table Approximations or Placeholder Text
Don't use linear approximations:
// 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
Don't leave placeholder text:
// 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"]
Don't confuse terminology:
❌ "Sensitivity tables need Excel's Data Table feature" (NO - that's a specific Excel tool we can't use)
✅ "Sensitivity tables are simple grids with formulas in each cell" (YES - this is what we build)
Why these shortcuts are wrong:
Linear approximation formulas don't actually recalculate the DCF - they just apply simple math adjustments
The relationships are not linear, so the results will be inaccurate
Placeholder text requires manual user intervention
Model is not immediately usable when delivered
Not professional or client-ready
Empty cells = incomplete deliverable
Common rationalization to REJECT:
"Writing 75+ formulas feels complex, so I'll leave a note for the user to complete it manually."
Reality:
Writing 75 formulas is straightforward when you use a loop in Python with openpyxl. Each formula follows the same pattern - just substitute the row/column values. This is a required part of the deliverable.
Instead:
Populate every sensitivity cell with formulas that recalculate the full DCF for that specific combination of assumptions
WRONG: Missing Cell Comments
Don't do this:
Create all hardcoded inputs without comments
Think "I'll add them later"
Write "TODO: add source"
Leave blue inputs without documentation
Why it's wrong:
Can't verify where data came from
Fails xlsx skill requirements
Not audit-ready
Wastes time fixing later
Instead:
Add cell comment AS EACH hardcoded value is created
WRONG: Formula Row References Off
Symptom:
The FCF section references wrong assumption rows:
D&A: =E29*$E$34 // Should be $E$21, but referencing wrong row
CapEx: =E29*$E$41 // Should be $E$22, but row shifted
Why this happens:
Formulas written first
Then headers inserted
All row references shifted
Now formulas point to wrong cells → #REF! errors
Instead:
Lock row layout FIRST, then write formulas
WRONG: Single Row for Each Assumption Across Scenarios
Don't structure assumptions like this:
Assumption
,
Bear
,
Base
,
Bull
Revenue Growth FY1
,
10%
,
13%
,
16%
Revenue Growth FY2
,
9%
,
12%
,
15%
This vertical layout makes it hard to see the progression across years within each scenario.
Why it's wrong:
Makes it difficult to see assumptions evolving across years within each scenario
Harder to compare scenario assumptions across full projection period
Less intuitive for reviewing scenario logic
Instead:
Create separate blocks for each scenario (Bear, Base, Bull)
Within each block, show assumptions horizontally across projection years
This makes each scenario's assumptions easier to review as a cohesive set
WRONG: No Borders
Don't deliver a model without borders:
No section delineation
All cells blend together
Hard to read and unprofessional
Why it's wrong:
Not client-ready
Difficult to navigate
Looks amateur
Instead:
Add borders around all major sections
WRONG: Wrong Font Colors or No Font Color Distinction
Don't do this:
All text is black
Only use fill colors (no font color changes)
Mix up which cells are blue vs black
Why it's wrong:
Can't distinguish inputs from formulas
Auditing becomes impossible
Violates xlsx skill requirements
Instead:
Blue text for ALL hardcoded inputs, black text for ALL formulas, green for sheet links
WRONG: Operating Expenses Based on Gross Profit
Don't do this:
S&M: =E33*0.15 // E33 = Gross Profit (WRONG)
Why it's wrong:
Operating expenses scale with revenue, not gross profit
Produces unrealistic margin progression
Not how businesses actually operate
Instead:
S&M: =E29*0.15 // E29 = Revenue (CORRECT)
TOP 5 ERRORS SUMMARY
Formula row references off
→ Define ALL row positions BEFORE writing formulas
Missing cell comments
→ Add comments AS cells are created, not at end
Simplified sensitivity tables
→ Populate all cells with full DCF recalc formulas, not approximations
Scenario block references wrong
→ Ensure IF formulas pull from correct Bear/Base/Bull blocks
No borders
→ Add professional section borders for client-ready appearance
In addition, be aware of these errors:
WACC Calculation Errors
Mixing book and market values in capital structure
Using equity beta instead of asset/unlevered beta incorrectly
Wrong tax rate application to cost of debt
Incorrect risk-free rate (must use current 10Y Treasury)
Failure to adjust for net debt vs net cash position
Growth Assumption Flaws
Terminal growth > WACC (creates infinite value)
Projection growth rates inconsistent with historical performance
Ignoring industry growth constraints
Revenue growth not aligned with unit economics
Margin expansion without operational justification
Terminal Value Mistakes
Using wrong growth method (perpetuity vs exit multiple)
Terminal value >80% of enterprise value (suggests over-reliance)
Inconsistent terminal margins with steady state assumptions
Wrong discount period for terminal value
Cash Flow Projection Errors
Operating expenses based on gross profit instead of revenue
D&A/CapEx percentages misaligned with business model
Working capital changes not properly calculated
Tax rate inconsistency between years
NOPAT calculation errors
These errors are the most common. Re-read this section before starting any DCF build.
Excel File Creation
This skill uses the
xlsx
skill for all spreadsheet operations.
The xlsx skill provides:
Standardized formula construction rules
Number formatting conventions
Automated formula recalculation via
recalc.py
script
Comprehensive error checking and validation
All Excel files created by this skill must follow xlsx skill requirements, including zero formula errors and proper recalculation.
Quality Rubric
Every DCF model must maximize for:
Realistic revenue and margin assumptions
based on historical performance
Appropriate cost of capital calculation
with proper CAPM methodology
Comprehensive sensitivity analysis
showing valuation ranges
Clear terminal value calculation
with supporting rationale
Professional model structure
enabling scenario analysis
Transparent documentation
of all key assumptions
Input Requirements
Minimum Required Inputs
Company identifier
Ticker symbol or company name
Growth assumptions
Revenue growth rates for projection period (or "use consensus")
Optional parameters
:
Projection period (default: 5 years)
Scenario cases (Bear/Base/Bull growth and margin assumptions)
Terminal growth rate (default: 2.5-3.0%)
Specific WACC inputs if not using CAPM
Excel Model Structure
Sheet Architecture
Create
two sheets
:
DCF
- Main valuation model with sensitivity analysis at bottom
WACC
- Cost of capital calculation
CRITICAL
Sensitivity tables go at the BOTTOM of the DCF sheet (not on a separate sheet). This keeps all valuation outputs together.
Formula Recalculation (MANDATORY)
After creating or modifying the Excel model,
recalculate all formulas
using the recalc.py script from the xlsx skill:
python recalc.py
[
path_to_excel_file
]
[
timeout_seconds
]
Example:
python recalc.py AAPL_DCF_Model_2025-10-12.xlsx
30
The script will:
Recalculate all formulas in all sheets using LibreOffice
Scan ALL cells for Excel errors (#REF!, #DIV/0!, #VALUE!, #NAME?, #NULL!, #NUM!, #N/A)
Return detailed JSON with error locations and counts
Expected output format:
{
"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
}
If errors are found
, the output will include details:
{
"status"
:
"errors_found"
,
"total_errors"
:
2
,
"total_formulas"
:
42
,
"error_summary"
:
{
"#REF!"
:
{
"count"
:
2
,
"locations"
:
[
"DCF!B25"
,
"DCF!C25"
]
}
}
}
Fix all errors
and re-run recalc.py until status is "success" before delivering the model.
Formatting Standards
IMPORTANT
Follow the xlsx skill for formula construction rules and number formatting conventions. The DCF skill adds specific visual presentation standards.
Color Scheme - Two Layers
:
Layer 1: Font Colors (MANDATORY from xlsx skill)
Blue text (RGB: 0,0,255)
ALL hardcoded inputs (stock price, shares, historical data, assumptions)
Black text (RGB: 0,0,0)
ALL formulas and calculations
Green text (RGB: 0,128,0)
Links to other sheets (WACC sheet references)
Layer 2: Fill Colors (Optional for enhanced presentation)
Fill colors are optional and should only be applied if requested by the user or if enhancing presentation
If the user requests colors or professional formatting, use this standard scheme:
Section headers
Dark blue (RGB: 68,114,196) background with white text
Sub-headers/column headers
Light blue (RGB: 217,225,242) background with black text
Input cells
Light green/cream (RGB: 226,239,218) background with blue text
Calculated cells
White background with black text
Users can override with custom brand colors if specified
How the layers work together (if fill colors are used):
Input cell: Blue text + light green fill = "Hardcoded input"
Formula cell: Black text + white background = "Calculated value"
Sheet link: Green text + white background = "Reference from WACC sheet"
Font color tells you WHAT it is. Fill color tells you WHERE it is (if used).
IMPORTANT:
Font colors from xlsx skill are mandatory. Fill colors are optional - default is white/no fill unless the user requests enhanced formatting or colors.
Border Standards (REQUIRED for Professional Appearance)
Thick borders
(1.5pt) around major sections:
KEY INPUTS section
PROJECTION ASSUMPTIONS section
5-YEAR CASH FLOW PROJECTION section
TERMINAL VALUE section
VALUATION SUMMARY section
Each SENSITIVITY ANALYSIS table
Medium borders
(1pt) between sub-sections:
Company Details vs Historical Performance
Growth Assumptions vs EBIT Margin vs FCF Parameters
Thin borders
(0.5pt) around data tables:
Scenario assumption tables (Bear | Base | Bull | Selected)
Historical vs projected financials matrix
No borders:
Individual cells within tables (keep clean, scannable)
Borders are mandatory
- models without professional borders are not client-ready.
Number Formats
(follows xlsx skill standards):
Years
Format as text strings (e.g., "2024" not "2,024")
Percentages
:
0.0%
(one decimal place)
Currency
:
$#,##0
for millions;
$#,##0.00
for per-share - ALWAYS specify units in headers ("Revenue ($mm)")
Zeros
Use number formatting to make all zeros "-" (e.g., $#,##0;($#,##0);- ) Large numbers :

,##0

with thousands separator
Negative numbers
:
(#,##0)
in parentheses (NOT minus sign)
Cell Comments (MANDATORY for all hardcoded inputs)
:
Per the xlsx skill, ALL hardcoded values must have cell comments documenting the source. Format: "Source: [System/Document], [Date], [Reference], [URL if applicable]"
CRITICAL
Add comments AS CELLS ARE CREATED. Do not defer to the end.
DCF Sheet Detailed Structure
Section 1: Header
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"
)))
Section 2: Market Data (NOT case dependent)
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]
Section 3: DCF Scenario Assumptions
Create separate assumption blocks for each scenario (Bear, Base, Bull) with DCF-specific assumptions (Revenue Growth %, EBIT Margin %, Tax Rate %, D&A % of Revenue, CapEx % of Revenue, NWC Change % of ΔRev, Terminal Growth Rate, WACC) laid out horizontally across projection years. Each block must include section header, column header row showing the projection years (FY1, FY2, etc.), and data rows. See
section "Correct Assumption Table Structure" for the exact layout.
Section 4: Historical & Projected Financials
Reference a consolidation column (e.g., "Selected Case") that pulls from scenario blocks
, not scattered IF formulas in every projection row.
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]
Key Formula Pattern
:
Revenue growth:
=E29*(1+$E$10)
where $E$10 is consolidation column for Year 1 growth
NOT:
=E29*(1+IF($B$6=1,$B$10,IF($B$6=2,$C$10,$D$10)))
This approach is cleaner, easier to audit, and prevents formula errors by centralizing the scenario logic.
Section 5: Free Cash Flow Build
CRITICAL
Verify row references point to the CORRECT assumption rows. Test formulas immediately after creation.
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]
Row reference examples
(based on layout planning):
$E$21 = D&A % assumption (consolidation column, row 21)
$E$22 = CapEx % assumption (consolidation column, row 22)
$E$23 = NWC % assumption (consolidation column, row 23)
E29 = Revenue for year (row 29)
E45 = NOPAT for year (row 45)
Before writing formulas
Confirm these row numbers match the actual layout. Test one column, then copy across.
Section 6: Discounting & Valuation
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 Sheet Structure
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]
Key WACC Formulas:
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)
Sensitivity Analysis (Bottom of DCF Sheet)
TERMINOLOGY REMINDER
"Sensitivity tables" = simple 2D grids with row headers, column headers, and formulas in each data cell. NOT Excel's "Data Table" feature (Data → What-If Analysis → Data Table). You will use openpyxl to write regular Excel formulas into each cell.
Location
Rows 87+ on DCF sheet (NOT a separate sheet)
Three sensitivity tables, vertically stacked:
WACC vs Terminal Growth
(rows 87-100) - 5x5 grid = 25 cells with formulas
Revenue Growth vs EBIT Margin
(rows 102-115) - 5x5 grid = 25 cells with formulas
Beta vs Risk-Free Rate
(rows 117-130) - 5x5 grid = 25 cells with formulas
Total formulas to write: 75
(this is required, not optional)
CRITICAL
All sensitivity table cells must be populated programmatically with formulas using openpyxl. DO NOT use linear approximation shortcuts. DO NOT leave placeholder text or notes about manual steps. DO NOT rationalize leaving cells empty because "it's complex" - use a Python loop to generate the formulas.
Table Setup:
Create table structure with row/column headers (the assumption values to test)
Populate EVERY data cell with a formula that:
Uses the row header value (e.g., WACC = 9.0%)
Uses the column header value (e.g., Terminal Growth = 3.0%)
Recalculates the full DCF with those specific assumptions
Returns the implied share price for that scenario
All cells must contain working formulas when delivered
Format cells with conditional formatting: Green scale for higher values, red scale for lower values
Bold the base case cell
Leave 1-2 blank rows between tables
No manual intervention required
- the sensitivity tables must be fully functional when the user opens the file.
Case Selector Implementation
Three-Case Framework:
Bear Case
Conservative revenue growth (low end of historical range)
Margin compression or no expansion
Higher WACC (risk premium increase)
Lower terminal growth rate
Higher CapEx assumptions
Base Case
Consensus or management guidance revenue growth
Moderate margin expansion based on operating leverage
Current market-implied WACC
GDP-aligned terminal growth (2.5-3.0%)
Standard CapEx assumptions
Bull Case
Optimistic revenue growth (high end of projections)
Significant margin expansion
Lower WACC (reduced risk premium)
Higher terminal growth (3.5-5.0%)
Reduced CapEx intensity
Formula Implementation:
DO NOT use nested IF formulas scattered throughout.
Instead, create a consolidation column that uses INDEX or OFFSET formulas to pull from the appropriate scenario block.
Recommended pattern (using INDEX):
=INDEX(B10:D10, 1, $B$6)
where
B10:D10
= Bear/Base/Bull values,
1
= row offset,
$B$6
= case selector cell (1, 2, or 3)
Then reference the consolidation column
in all projections:
Revenue Year 1: =D29*(1+$E$10)
where $E$10 is the consolidation column value for Year 1 growth.
This approach centralizes scenario logic, making the model easier to audit and maintain.
Deliverables Structure
File naming
:
[Ticker]DCF_Model[Date].xlsx
Two sheets
:
DCF
- Complete model with Bear/Base/Bull cases + three sensitivity tables at bottom (WACC vs Terminal Growth, Revenue Growth vs EBIT Margin, Beta vs Risk-Free Rate)
WACC
- Cost of capital calculation
Key features
Case selector (1/2/3), consolidation column with INDEX/OFFSET formulas, color-coded cells, cell comments on all inputs, professional borders
Best Practices
Model Construction
Build incrementally
Complete each section before moving to next
Test as building
Enter sample numbers to verify formulas
Use consistent structure
Similar calculations follow similar patterns
Comment complex formulas
Add notes for unusual calculations
Build in checks
Sum checks and balance checks where applicable
Documentation
Document all assumptions
Explain reasoning behind key inputs
Cite data sources
Note where each data point came from
Explain methodology
Describe any non-standard approaches
Flag uncertainties
Highlight areas with limited visibility
Quality Control
Cross-check calculations
Verify math in multiple ways
Stress test assumptions
Run sensitivity to ensure model is robust
Peer review
Have someone else check formulas
Version control
Save versions as work progresses
Common Variations
High-Growth Technology Companies
Longer projection period (7-10 years)
Higher initial growth rates (20-30%)
Significant margin expansion over time
Higher WACC (12-15%)
Model unit economics (users, ARPU, etc.)
Mature/Stable Companies
Shorter projection period (3-5 years)
Modest growth rates (GDP +1-3%)
Stable margins
Lower WACC (7-9%)
Focus on cash generation and capital allocation
Cyclical Companies
Model through economic cycle
Normalize margins at mid-cycle
Consider trough and peak scenarios
Adjust beta for cyclicality
Multi-Segment Companies
Separate DCFs for each business unit
Different growth rates and margins by segment
Sum-of-parts valuation
Consider synergies
Troubleshooting
If you encounter errors or unreasonable results, read
TROUBLESHOOTING.md
for detailed debugging guidance.
Workflow Integration
At Start of DCF Build
Gather market data
:
Check for available MCP servers for current market data
Use web search/fetch for stock prices, beta, and other market metrics
Request from user if specific data is needed
Gather historical financials
:
Check for available MCP servers (Daloopa, etc.)
Request from user if not available via MCP
Manual extraction from 10-Ks if necessary
Begin model construction
using the DCF methodology detailed in this skill
During Model Construction
Build Excel model
using openpyxl with formulas (not hardcoded values)
Follow xlsx skill conventions
for formula construction and formatting
Apply fill colors only if requested
by user or if specific brand guidelines are provided
Before Delivering Model (MANDATORY)
Verify structure
:
Scenario blocks for Bear/Base/Bull with assumptions across projection years
Case selector functional with formulas referencing correct scenario blocks
Sensitivity tables at bottom of DCF sheet (not separate sheet)
Font colors: Blue inputs, black formulas, green sheet links
Cell comments on ALL hardcoded inputs
Professional borders around major sections
Recalculate formulas
Run
python recalc.py model.xlsx 30
Check output
:
If
status
is
"success"
→ Continue to step 4
If
status
is
"errors_found"
→ Check
error_summary
and read
TROUBLESHOOTING.md
for debugging guidance
Fix errors and re-run recalc.py
until status is "success"
Spot-check formulas
:
Test one FCF formula - does it reference the correct assumption rows?
Change case selector - does the consolidation column update properly?
Verify revenue formulas reference consolidation column (not nested IF formulas)
Deliver model
Available Data Sources
MCP servers
If configured (Daloopa for historical financials)
Web search/fetch
For current stock prices, beta, and market data
User-provided data
Historical financials, consensus estimates
Manual extraction
SEC EDGAR filings as fallback Final Output Checklist Before delivering DCF model: Required: Run python recalc.py model.xlsx 30 until status is "success" (zero formula errors) Two sheets: DCF (with sensitivity at bottom), WACC Font colors: Blue=inputs, Black=formulas, Green=sheet links Cell comments on ALL hardcoded inputs Sensitivity tables fully populated with formulas Professional borders around major sections Validation: OpEx based on revenue (not gross profit) Terminal value 50-70% of EV Terminal growth < WACC Tax rate 21-28% File naming: [Ticker]DCF_Model[Date].xlsx
返回排行榜