28 — Dividend Discount Models, Multiples, and CAPM¶
Free learning pack¶
reference/equity/dividend_discount_model.mdreference/equity/relative_valuation_multiples.mdreference/equity/capm_and_beta.mdresources/equity.md
Do not search for more material until these are insufficient.
PREDICT¶
A stock pays a $2 dividend next year, grows dividends 4% a year forever, and you require a 9% return. Without calculating, what happens to the Gordon-growth value if the growth assumption rises toward 9% — does it rise smoothly, or does something break?
Formula (Gordon growth)¶
V = D1 / (r - g)
dividend_next = 2.0
required_return = 0.09
growth_rate = 0.04
# MANUAL FIRST:
# compute the Gordon-growth value by hand.
value = None
print(value)
PREDICT (multiples)¶
Two companies have the same 40% payout ratio and the same 9% required return, but Company A grows 2% a year and Company B grows 6% a year. Without calculating, which one has the higher justified P/E, and is the gap between them small or large?
Formula (justified P/E)¶
P/E = payout_ratio / (r - g)
payout_ratio = 0.40
required_return = 0.09
growth_a = 0.02
growth_b = 0.06
# MANUAL FIRST:
# compute the justified P/E for each company by hand.
pe_a = None
pe_b = None
print(pe_a, pe_b)
PREDICT (CAPM)¶
A stock's returns have moved almost exactly 1.5x the market's on every up and down day this year. Without calculating a regression, what beta would you expect, and would you expect this stock's CAPM-required return to be above or below the market's own expected return?
Formula (CAPM)¶
beta = Cov(r_stock, r_market) / Var(r_market)
E[r] = r_f + beta * (E[r_market] - r_f)
import numpy as np
market_returns = np.array([0.01, 0.02, -0.01, 0.03, 0.00])
stock_returns = 1.5 * market_returns # exact 1.5x mover, for a clean hand check
risk_free_rate = 0.03
expected_market_return = 0.08
# MANUAL FIRST:
# compute beta by hand (Cov/Var over the two series above), then the
# CAPM-required return.
beta_value = None
expected_return = None
print(beta_value, expected_return)
Experiment¶
Push growth_rate in the first cell up toward 0.09 (the required
return) and rerun. Confirm your PREDICT answer about what breaks, and
read gordon_growth_value's ValueError message in
src/pm/equity/valuation.py to see how the repo enforces that
constraint deliberately rather than letting it silently divide by a tiny
number.
Reference¶
reference/equity/dividend_discount_model.md
reference/equity/relative_valuation_multiples.md
reference/equity/capm_and_beta.md
Promote¶
Use src/pm/equity/valuation.py (gordon_growth_value, justified_pe)
and src/pm/equity/capm.py (beta, capm_expected_return) only after
your own implementation.
Test¶
pytest tests/test_equity.py
ORAL CHECK¶
Explain to a PM why a stock's justified P/E and its Gordon-growth DDM
value are the same claim viewed two different ways, and why CAPM's
required return is the r that both formulas need as an input.
Try /tutor equity valuation or /tutor CAPM for an adaptive
walkthrough.