{/ This page is auto-generated from the skill's SKILL.md by website/scripts/generate-skill-docs.py. Edit the source SKILL.md, not this page. /}
Dcf Model
Build institutional-quality DCF valuation models in Excel — revenue projections, FCF build, WACC, terminal value, Bear/Base/Bull scenarios, 5x5 sensitivity tables. Pairs with excel-author. Use for intrinsic-value equity analysis.
Skill metadata
| Source | Optional — install with hermes skills install official/finance/dcf-model |
| Path | optional-skills/finance/dcf-model |
| Version | 1.0.0 |
| Author | Anthropic (adapted by Nous Research) |
| License | Apache-2.0 |
| Platforms | linux, macos, windows |
| Tags | finance, valuation, dcf, excel, openpyxl, modeling, investment-banking |
| Related skills | excel-author, pptx-author, comps-analysis, lbo-model, 3-statement-model |
Reference: full SKILL.mdℹ️ Info
The following is the complete skill definition that Hermes loads when this skill is triggered. This is what the agent sees as instructions when the skill is active.
Environment
ℹ️ Info
The following is the complete skill definition that Hermes loads when this skill is triggered. This is what the agent sees as instructions when the skill is active.
This skill assumes headless openpyxl — you are producing an.xlsx file on disk.
Follow the excel-author skill's conventions for cell coloring, formulas, named ranges, and sensitivity tables.
Recalculate before delivery: python /path/to/excel-author/scripts/recalc.py./out/model.xlsx.
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:
Formulas Over Hardcodes (NON-NEGOTIABLE):
- Every projection, margin, discount factor, PV, and sensitivity cell MUST be a live Excel formula — never a value computed in Python and written as a number
- When using openpyxl: ws["D20"] = "=D19*(1+$B$8)" is correct; ws["D20"] = calculated_revenue is WRONG
- The only hardcoded numbers permitted are: (1) raw historical inputs, (2) assumption drivers (growth rates, WACC inputs, terminal g), (3) current market data (share price, debt balance)
- If you catch yourself computing something in Python and writing the result — STOP. The model must flex when the user changes an assumption.
Verify Step-by-Step With the User (DO NOT build end-to-end): - After data retrieval → show the user the raw inputs block (revenue, margins, shares, net debt) and confirm before projecting - After revenue projections → show the projected top line and growth rates, confirm before building margin build - After FCF build → show the full FCF schedule, confirm logic before computing WACC - After WACC → show the calculation and inputs, confirm before discounting - After terminal value + PV → show the equity bridge (EV → equity value → per share), confirm before sensitivity tables - Catch errors at each stage — a wrong margin assumption discovered after sensitivity tables are built means rebuilding everything downstream
Sensitivity Tables:
- Use an ODD number of rows and columns (standard: 5×5, sometimes 7×7) — this guarantees a true center cell
- Center cell = base case. Build the axis values so the middle row header and middle column header exactly equal the model's actual assumptions (e.g., if base WACC = 9.0%, the middle row is 9.0%; if terminal g = 3.0%, the middle column is 3.0%). The center cell's output must therefore equal the model's actual implied share price — this is the sanity check that the table is built correctly.
- Highlight the center cell with the medium-blue fill (#BDD7EE) + bold font so it's immediately visible which cell is the base case.
- Populate ALL cells (typically 3 tables × 25 cells = 75) 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: 1. MCP Servers (if configured) - Structured financial data from providers like Daloopa 2. User-Provided Data - Historical financials from their research 3. 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%
Шаг 3. Постройте прогноз доходов
Методология: 1. Начните с последнего фактического дохода (LTM или последний финансовый год). 2. Примените темпы роста для каждого прогнозируемого года. 3. Покажите обе суммы в долларах И расчетный процент роста.
Темпы роста: - Годы 1-2: Более высокие темпы роста отражают видимость в краткосрочной перспективе. - 3–4 годы: постепенное снижение до среднего показателя по отрасли. - Год 5+: темпы роста приближаются к терминальному.
Структура формулы: - Выручка (год N) = Доход (год N-1) × (1 + темп роста) - Рост % (Год N) = Выручка (Год N) / Доход (Год 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: Расчет свободного денежного потока
Постройте свободный денежный поток в правильной последовательности:
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% изменения дохода. - Отрицательное число = источник денежных средств (высвобождение оборотного капитала) - Положительное число = использование денежных средств (наращивание оборотного капитала)
Капитальные затраты на техническое обслуживание и рост: - Капитальные затраты на техническое обслуживание: поддержание текущей деятельности (~ 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% (темп роста ВВП) - Умеренный: 2,5-3,5% - Агрессивная: 3,5-5,0% (только для лидеров рынка)
Не превышать: безрисковая ставка или долгосрочный рост ВВП.
Выход из нескольких методов (альтернативный):
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, показывающие, как меняется оценка при различных допущениях:
- WACC против конечного роста – показывает чувствительность стоимости предприятия к ставке дисконтирования и бессрочному росту.
- Рост выручки по сравнению с рентабельностью EBIT – показывает влияние роста выручки и операционного левереджа.
- Бета против безрисковой ставки – показывает чувствительность к стоимости компонентов собственного капитала.
Реализация. Это простые двумерные сетки (НЕ функция «Таблица данных» Excel) с формулами в каждой ячейке. Каждая ячейка должна содержать полный перерасчет DCF для этой конкретной комбинации допущений. См. раздел «Критические ограничения» для получения подробных требований к программному заполнению всех 75 ячеек с использованием openpyxl.
<правильные_шаблоны>
В этом разделе содержатся все ПРАВИЛЬНЫЕ шаблоны, которым следует следовать при построении моделей 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%
Каждый блок сценариев ДОЛЖЕН иметь строку заголовка столбца, показывающую прогнозируемые годы (2025ФГ, 2026ПФ и т. д.), непосредственно под заголовком раздела. Без этого пользователи не смогут определить, какое допущенное значение соответствует какому году.
Как ссылаться на предположения. Создайте столбец консолидации: 1. Ячейка выбора регистра (например, B6) содержит 1 = Медведь, 2 = База или 3 = Бык. 2. Создайте столбец консолидации с формулами ИНДЕКС или СМЕЩ для извлечения из правильного блока сценария. 3. Формулы проекции ссылаются на столбец консолидации (ссылки на чистые ячейки). 4. Каждый блок сценариев содержит полный набор допущений DCF на протяжении прогнозируемых лет.
Рекомендуемый шаблон столбца консолидации (с использованием ИНДЕКСА):
=ИНДЕКС(B10:D10, 1, $B$6)
НЕ это — повсюду разбросаны утверждения IF:
=IF($B$6=1,[Ячейка медвежьего блока],IF($B$6=2,[Базовая ячейка блока],[Ячейка бычьего блока]))
Подход на основе столбцов консолидации централизует логику и упрощает аудит модели.
Правильная модель прогнозирования доходов
Создайте столбец консолидации с формулами ИНДЕКС, а затем используйте его в прогнозах:
Шаг 1. Столбец консолидации данных о росте за 1 финансовый год:
=INDEX([Рост в 1 финансовом году]:[Рост в 1 финансовом году], 1, $B$6)
Шаг 2. Прогноз дохода ссылается на столбец консолидации:
Доход за 1-й год: =D29*(1+$E$10)
Где: - D29 = Выручка за предыдущий год - $E$10 = ячейка столбца консолидации для роста в 1 финансовом году (содержит формулу ИНДЕКС) - $B$6 = Выбор случая (1=Медведь, 2=База, 3=Бык)
Этот подход более понятен, чем встраивание утверждений ЕСЛИ в каждую формулу прогноза, и значительно упрощает проверку того, какие предположения сценария используются.
Правильный шаблон формулы 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
Каждая ячейка столбца консолидации содержит формулу ИНДЕКС, которая извлекается из соответствующего блока сценариев на основе селектора вариантов. Благодаря этому формулы прогнозирования остаются чистыми и проверяемыми.
Прежде чем писать формулы, подтвердите расположение строк блока сценария и настройте столбцы консолидации.
Правильный формат комментария к ячейке
Каждое жестко закодированное значение должно иметь следующий формат:
«Источник: [Система/Документ], [Дата], [Ссылка], [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
Правильная структура таблицы допущений
ВАЖНО: для каждого блока сценариев требуются ТРИ структурных элемента:
- Строка заголовка раздела (объединенные ячейки): например, «Предположения по случаю медведя».
- Строка заголовка столбца с указанием лет – ЭТО ОБЯЗАТЕЛЬНО, НЕ ПРОПУСКАЙТЕ.
- Строки данных с допущенными значениями.
Структура:
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%,,,,
БЕЗ строки заголовка столбца, показывающей годы прогноза (2025ПФ, 2026ПФ и т. д.), пользователи не могут определить, какое допущенное значение соответствует какому году. Эта строка ОБЯЗАТЕЛЬНА.
Затем создайте столбец консолидации (обычно следующий столбец справа), который использует формулы ИНДЕКС для извлечения данных из выбранного блока сценария на основе селектора вариантов. На этот столбец консолидации ссылаются ваши формулы прогноза.
Правильный процесс планирования рядов
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 - шаг, base, base + шаг, base + 2*step] — симметрично вокруг основания, нечетное количество гарантирует наличие центра.
Шаблон формулы — ячейка B88 (WACC=8,0%, терминальный рост=2,0%):
Формула в B88 должна пересчитать подразумеваемую цену, используя: - WACC из заголовка строки: $A88 (8,0%). - Терминальный рост из заголовка столбца: «B$87» (2,0%)
Рекомендуемый подход: Используйте основной расчет DCF, но замените эти значения.
Пример структуры формулы:
=([СУММА свободных денежных потоков от PV с использованием 88 долларов США в качестве ставки дисконтирования] + [Терминальная стоимость с использованием 87 долларов США в качестве темпа роста и 88 долларов США в качестве WACC] - [Чистый долг]) / [Акции]
ВАЖНО. Напишите формулу для КАЖДОЙ ячейки в сетке 5x5 (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>
<распространенные_ошибки>
В этом разделе собраны все НЕПРАВИЛЬНЫЕ шаблоны, которых следует избегать при построении моделей 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 формул кажется сложным, поэтому я оставлю заметку, чтобы пользователь мог заполнить ее вручную».
Реальность: Написать 75 формул несложно, если использовать цикл Python с openpyxl. Каждая формула следует одному и тому же шаблону — просто замените значения строк/столбцов. Это обязательная часть результата.
Вместо этого: заполните каждую ячейку чувствительности формулами, которые пересчитывают полный DCF для этой конкретной комбинации допущений.
НЕПРАВИЛЬНО: отсутствуют комментарии к ячейке
Не делайте этого: - Создание всех жестко запрограммированных входных данных без комментариев. - Подумайте: «Я добавлю их позже» - Напишите «TODO: добавить источник» - Оставить синие входы без документации
Почему это неправильно: - Невозможно проверить, откуда взялись данные. - Не соответствует требованиям к навыкам xlsx - Не готов к аудиту - трата времени на исправление позже.
Вместо этого: добавляйте комментарий к ячейке ПРИ создании КАЖДОГО жестко запрограммированного значения.
НЕПРАВИЛЬНО: ссылки на строки формул отключены
Симптом:
В разделе FCF ссылаются на неверные строки допущений:
D&A: =E29*$E$34 // Должно быть $E$21, но ссылка на неправильную строку
CapEx: =E29*$E$41 // Должно быть $E$22, но строка сдвинута
Почему это происходит: 1. Формулы написаны первыми 2. Затем вставляются заголовки 3. Сдвинуты все ссылки на строки. 4. Теперь формулы указывают не на те ячейки → #ССЫЛКА! ошибки
Вместо этого: СНАЧАЛА заблокируйте макет строки, а затем напишите формулы.
НЕПРАВИЛЬНО: одна строка для каждого предположения в сценариях
Не структурируйте предположения следующим образом:
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.
</common_mistakes>
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: 1. Realistic revenue and margin assumptions based on historical performance 2. Appropriate cost of capital calculation with proper CAPM methodology 3. Comprehensive sensitivity analysis showing valuation ranges 4. Clear terminal value calculation with supporting rationale 5. Professional model structure enabling scenario analysis 6. 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 excel-author skill:
python recalc.py [path_to_excel_file] [timeout_seconds]
Пример:
python recalc.py AAPL_DCF_Model_2025-10-12.xlsx 30
Скрипт будет: - Пересчитать все формулы на всех листах с помощью LibreOffice. - Сканировать ВСЕ ячейки на наличие ошибок Excel (#ССЫЛКА!, #ДЕЛ/0!, #ЗНАЧЕНИЕ!, #ИМЯ?, #NULL!, #NUM!, #Н/Д). - Возврат подробного 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 до тех пор, пока статус не станет «успех», прежде чем доставлять модель.
Стандарты форматирования
ВАЖНО. Следуйте навыкам работы с 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,5 пт) вокруг основных разделов: - Раздел «КЛЮЧЕВЫЕ ВХОДЫ» - Раздел ПРОГНОЗНЫЕ ПРЕДПОЛОЖЕНИЯ - Раздел ПРОГНОЗ ДЕНЕЖНЫХ ПОТОКОВ НА 5 ЛЕТ - раздел ТЕРМИНАЛЬНОЕ ЗНАЧЕНИЕ - раздел ОБЗОР ОЦЕНКИ - Каждая таблица АНАЛИЗА ЧУВСТВИТЕЛЬНОСТИ
Средние границы (1 пт) между подразделами: - Подробности о компании и исторические показатели - Допущения роста в сравнении с рентабельностью EBIT и параметрами свободного денежного потока
Тонкие рамки (0,5 пт) вокруг таблиц данных: - Таблицы предположений сценариев (Медвежий | Базовый | Бычий | Выбранный) - Матрица исторических и прогнозируемых финансовых показателей
Без границ: Отдельные ячейки в таблицах (сохраняйте чистоту и возможность сканирования)
Границы обязательны — модели без профессиональных рамок не готовы для клиентов.
Числовые форматы (в соответствии со стандартами навыков xlsx):
– Годы: формат в виде текстовых строк (например, «2024», а не «2024»).
- Проценты: 0,0% (один десятичный знак)
- Валюта: $#,##0 для миллионов; $#,##0.00 для каждой акции - ВСЕГДА указывайте единицы измерения в заголовках ("Доход ($мм)")
- Нули: используйте форматирование чисел, чтобы все нули были «-» (например, $#,##0;($#,##0);-)
- Большие числа: #,##0 с разделителем тысяч.
- Отрицательные числа: (#,##0) в скобках (НЕ знак минус)
Комментарии к ячейке (ОБЯЗАТЕЛЬНО для всех жестко закодированных входных данных):
Согласно навыку xlsx, ВСЕ жестко запрограммированные значения должны иметь комментарии к ячейкам, документирующие источник. Формат: «Источник: [Система/Документ], [Дата], [Ссылка], [URL, если применимо]»
КРИТИЧЕСКОЕ: добавляйте комментарии ПО мере создания ячеек. Не откладывайте дело до конца.
Подробная структура листа 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
Создайте отдельные блоки допущений для каждого сценария (медвежий, базовый, бычий) с предположениями, специфичными для DCF (% роста выручки, % маржи EBIT, % налоговой ставки, % D&A от выручки, % капитальных затрат от выручки, % изменения NWC от ΔRev, темпы конечного роста, WACC), расположенными горизонтально по годам прогнозирования. Каждый блок должен включать заголовок раздела, строку заголовка столбца, показывающую годы прогноза (1-й финансовый год, 2-й финансовый год и т. д.), и строки данных. См. раздел <correct_patterns> «Правильная структура таблицы допущений» для точного макета.
Раздел 4: Исторические и прогнозируемые финансовые показатели
Ссылайтесь на столбец консолидации (например, «Выбранный случай»), который извлекается из блоков сценариев, а не на разбросанные формулы ЕСЛИ в каждой строке прогноза.
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 = допущение о капитальных затратах в % (столбец консолидации, строка 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)
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: 1. Create table structure with row/column headers (the assumption values to test) 2. 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 3. All cells must contain working formulas when delivered 4. Format cells with conditional formatting: Green scale for higher values, red scale for lower values 5. Bold the base case cell 6. 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: 1. 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) 2. 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
statusis"success"→ Continue to step 4 -
If
statusis"errors_found"→ Checkerror_summaryand 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
Data sources — MCP first, web fallback
Many passages below say "use the S&P Kensho MCP / Daloopa MCP / FactSet MCP". Those are commercial financial-data MCPs from the original Cowork plugin context. In Hermes:
- If you have any structured financial-data MCP configured (Hermes supports MCP — see
native-mcpskill), prefer it for point-in-time comps, precedent transactions, and filings. - Otherwise, fall back to:
web_search/web_extractagainst SEC EDGAR (https://www.sec.gov/cgi-bin/browse-edgar) for US filings- Company IR pages for press releases, earnings decks
browser_navigatefor interactive data portals- User-provided data (explicitly ask when the context doesn't have it)
- Never fabricate. If a multiple, precedent, or filing number can't be sourced, flag the cell as
[UNSOURCED]and surface it to the user.
Attribution
This skill is adapted from Anthropic's Claude for Financial Services plugin suite (Apache-2.0). The Office-JS / Cowork live-Excel paths have been removed; this version targets headless openpyxl via the excel-author skill's conventions. Original: https://github.com/anthropics/financial-services