Company Valuation: DCF, Multiples, and Intrinsic Value
How do you determine what a company is actually worth? DCF and multiples are the two primary frameworks for estimating intrinsic value, and they underpin all equity investing.
Before you buy a stock, you want to know if the price is reasonable. Valuation is the discipline of estimating what a company is actually worth.
The core idea: a company is worth the present value of its future cash flows.
The Two Valuation Frameworks
1. Discounted Cash Flow (DCF): Estimate future cash flows, discount them back to today, sum them up.
2. Relative valuation (multiples): Compare the company’s valuation metrics to similar companies or its own historical averages.
Both have strengths and weaknesses. Sophisticated analysts use both.
DCF: The Foundation
A company is worth the cash it will generate in the future, discounted back to today:
Where:
- = free cash flow in year
- = discount rate (WACC)
- = terminal value at year
Free cash flow (FCF): Cash generated by the business after paying all operating expenses and investments needed to maintain/grow the business.
The Discount Rate: WACC
The discount rate should reflect the risk of the cash flows. For a public company, this is typically WACC (Weighted Average Cost of Capital):
Where:
- = proportion of equity in capital structure
- = proportion of debt
- = cost of equity (required return for equity investors)
- = cost of debt
- = corporate tax rate
Cost of equity is usually estimated using the Capital Asset Pricing Model (CAPM):
Where measures the stock’s sensitivity to market movements.
Terminal Value
The hardest part of DCF is estimating the terminal value: the value beyond your explicit forecast period. Two common methods:
1. Gordon Growth Model (perpetuity):
Assumes free cash flow grows at a constant rate forever.
2. Exit multiple:
Assume the company is sold at a typical EV/EBITDA multiple for its industry (e.g., 15x EBITDA), giving an enterprise terminal value that you then discount back to today. Do not multiply FCF by an EV/EBITDA ratio, that mixes an equity-after-capex cash-flow number with an enterprise-value multiple and gives the wrong answer.
Valuation Multiples
Multiples are faster and more intuitive than DCF, but they’re shortcuts, not the full picture.
Price-to-Earnings (P/E):
Low P/E could mean the stock is cheap, or the market expects earnings to fall.
EV/EBITDA:
Better than P/E for comparing companies with different capital structures (debt levels).
Price-to-Book (P/B):
Often used for banks, insurers, asset-heavy businesses.
DCF in Python
import numpy as np
import pandas as pd
def dcf_valuation(fcf_forecast, terminal_growth, discount_rate, terminal_multiple=None,
forecast_years=5, ebitda_forecast=None):
"""
Discounted Cash Flow valuation.
Parameters
----------
fcf_forecast : list of floats
Free cash flow for each forecast year
terminal_growth : float
Terminal growth rate (g) used by the Gordon Growth branch
discount_rate : float
WACC (r)
terminal_multiple : float, optional
Exit EV/EBITDA multiple (only used if `ebitda_forecast` is supplied)
forecast_years : int
Number of explicit forecast years
ebitda_forecast : list of floats, optional
EBITDA for each forecast year; required when `terminal_multiple` is given.
Terminal value is then `terminal_ebitda * terminal_multiple`.
Returns
-------
pv_total : float
Enterprise value
"""
# PV of explicit forecast period
pv_explicit = 0
for t, fcf in enumerate(fcf_forecast, 1):
pv_explicit += fcf / (1 + discount_rate) ** t
# Terminal value
if terminal_multiple is not None:
if ebitda_forecast is None or len(ebitda_forecast) != len(fcf_forecast):
raise ValueError(
"An EBITDA forecast of the same length as `fcf_forecast` is "
"required when using an EV/EBITDA exit multiple."
)
terminal_ebitda = ebitda_forecast[-1] * (1 + terminal_growth)
terminal_value = terminal_ebitda * terminal_multiple
else:
# Gordon Growth Model: TV = FCF_{n+1} / (r - g)
terminal_fcf = fcf_forecast[-1] * (1 + terminal_growth)
terminal_value = terminal_fcf / (discount_rate - terminal_growth)
# PV of terminal value
pv_terminal = terminal_value / (1 + discount_rate) ** forecast_years
return pv_explicit + pv_terminal
def pe_comparable(peer_pe_ratios, earnings):
"""
Estimate stock value using P/E of comparable companies.
"""
median_pe = np.median(peer_pe_ratios)
return earnings * median_pe
def ev_ebitda_comparable(peer_ev_ebitda, ebitda):
"""
Estimate enterprise value using EV/EBITDA of comparables.
"""
median_multiple = np.median(peer_ev_ebitda)
return ebitda * median_multiple
PROMPT
Use numpy to build a basic DCF valuation with Gordon Growth and exit-multiple terminal values, plus helpers for comparable-based stock valuation from P/E and EV/EBITDA.
Key Assumptions Drive the Value
DCF is extremely sensitive to assumptions:
- Discount rate: A 1% change in WACC can shift valuation by 20-30%
- Terminal growth rate: Even 0.5% matters enormously (this is why the perpetuity formula is so sensitive to )
- Forecast period length: 5 years vs. 10 years changes the result significantly
This is why two analysts can reach very different conclusions with the same publicly available information, they make different assumptions.
Key Takeaways
- DCF: A company is worth the PV of its future cash flows
- Free cash flow is the gold standard for measuring value generated
- Terminal value is usually the largest component of DCF value
- Multiples are quick estimates that depend on comparable company selection
- Valuation is an art informed by science, all models require judgment
References
- Penman, Financial Statement Analysis and Security Valuation. McGraw-Hill, 2019. ISBN: 978-0-07-337966-3.
- Damodaran, Investment Valuation. Wiley, 2012. ISBN: 978-1-118-13074-1.
- Koller, Goedhart, Wessels, Valuation: Measuring and Managing the Value of Companies. Wiley, 2020. ISBN: 978-1-119-66845-5.