The Two-Stage Dividend Discount Model extends the (single-stage) Gordon Growth Model to companies that are not expected to grow at a constant rate forever. It explicitly projects and discounts dividends over an initial high-growth phase, and then values everything from the end of that phase onward as a perpetuity growing at a lower, more sustainable stable rate (a Gordon Growth terminal value).

The formula is as follows:

\[\text{Dividend Projection}_{t} = \text{Dividends Per Share} \cdot (1 + \text{High Growth Rate}) ^{t}\] \[\text{High-Growth Phase Present Value} = \text{Sum of Dividend Projection}_{t} / (1 + \text{Rate of Return}) ^{t},\;\; \text{for} \;\; t = 1,\;\; \text{...},\;\; \text{High Growth Periods}\] \[\text{Terminal Value} = \text{Last Dividend Projection} \cdot (1 + \text{Stable Growth Rate}) / (\text{Rate of Return} - \text{Stable Growth Rate})\] \[\text{Intrinsic Value} = \text{High-Growth Phase Present Value} + (\text{Terminal Value} / (1 + \text{Rate of Return}) ^{\text{High}} \text{Growth Periods})\]

With transition periods it becomes the Three-Stage Dividend Discount Model: between the high-growth and the stable phase, the growth rate declines in equal steps from the high to the stable rate, and those dividends are discounted explicitly as well. In transition period k (of n), dividends grow at High Growth Rate - (High Growth Rate - Stable Growth Rate) * k / (n + 1), and the Terminal Value is taken at the end of the transition phase.

Also known as: two-stage DDM, two-stage dividend discount model, three-stage DDM, three-stage dividend discount model.

Two-Stage Dividend Discount Model in Python or via the MCP

Install the Finance Toolkit with:

pip install financetoolkit -U

Then call get_two_stage_dividend_discount_model as shown below.

from financetoolkit import Toolkit

toolkit = Toolkit(
    ["JNJ", "PG", "PEP"],
    api_key="FINANCIAL_MODELING_PREP_KEY",
    start_date="2021-01-01",
    end_date="2025-12-31",
)

toolkit.models.get_two_stage_dividend_discount_model().xs(
    "Intrinsic Value", level=1
)

Or, after setting up the Finance Toolkit MCP, ask:

What are Johnson & Johnson, Procter & Gamble and PepsiCo worth per share in a two-stage dividend discount model based on their own dividend growth and cost of equity?

Which returns:

  High-Growth Periods = 5
JNJ 295.957
PEP 294.465
PG 200.93

Parameters

get_two_stage_dividend_discount_model accepts the following parameters.

ParameterTypeDescriptionExample
rate_of_returnfloat, list or dictThe required rate of return (discount rate) used to discount both phases. Can be one number to use for all tickers, or a list or dict that contains a rate of return for each ticker. Defaults to None, which uses the latest Cost of Equity of each company: the CAPM with the equity risk premium of its country, as in get_weighted_average_cost_of_capital.0.08
high_growth_ratefloat, list or dictThe constant growth rate applied to dividends during the explicit high-growth phase. Can be one number to use for all tickers, or a list or dict that contains a high growth rate for each ticker. Defaults to None, which uses the compound annual growth of the company’s Dividends per Share up to the latest period.0.1
stable_growth_ratefloat, list or dictThe perpetual (terminal) growth rate applied to dividends from the end of the high-growth phase onward. Can be one number to use for all tickers, or a list or dict that contains a stable growth rate for each ticker. Defaults to None, which uses the company’s dividend growth kept within 0 and the long-run growth rate of 2.5% (2.5% where it has none).0.03
high_growth_periodsintThe number of years in the explicit high-growth phase. Defaults to 5.10
transition_periodsintThe number of years in which the growth rate declines linearly from the high to the stable growth rate (the Three-Stage Dividend Discount Model). Defaults to 0, no transition phase.0, no transition phase
roundingint | NoneThe number of decimals to round the results to. Defaults to None, which uses the rounding of the Toolkit (4 unless set otherwise).2
Share