fintech-algorithms
Using a coding agent? Give it the skill: npx skills add IslamBaraka90/Fintech-Algorithms-Library What it does →

Dividend Discount Model

Install and import#

bash
npm install fintech-algorithms
ts
import { dividendDiscountModel } from "fintech-algorithms/fundamental-analysis-and-valuation/intrinsic-valuation/dividend-discount-model";

Signature#

dividendDiscountModel(data)

Discounts an explicit per-share dividend forecast at the cost of equity and adds a growing-perpetuity terminal value built from the final forecast dividend, returning intrinsic value per share.

Parameters#

NameTypeNotes
data{ dividends: number[]; cost_of_equity: number; terminal_growth: number }dividends is the explicit per-share forecast, one finite nonnegative number per period, discounted at periods 1 through n. cost_of_equity is the discount rate and terminal_growth grows the last dividends entry into the terminal dividend. Other keys in the record are not read.

Returns#

{ state: string; method: string; schedule: { period: number; dividend: number; discount_factor: number; present_value: number }[]; pv_explicit_dividends: number; terminal_dividend: number; terminal_value: number; terminal_discount_factor: number; pv_terminal_value: number; terminal_value_share: number; intrinsic_value_per_share: number }

A schedule row per forecast period with its discount_factor and present_value, then pv_explicit_dividends, the terminal block (terminal_dividend, terminal_value, terminal_discount_factor, pv_terminal_value) and intrinsic_value_per_share, which is the sum of the explicit and terminal present values. terminal_value_share is the terminal share of that sum, emitted as 0 when the sum is 0.

Errors#

  • When data is absent, an array, or not an object — throws Error
  • When dividends is not an array holding at least one finite number — throws Error
  • When any entry of dividends is negative — throws Error
  • When cost_of_equity is not strictly between 0 and 1 — throws Error
  • When terminal_growth is at or below -1, or at or above cost_of_equity — throws Error

Complexity: time O(n), space O(n).

Worked example#

executed Captured by running this function on the input its own test provides. Real output of real code — but not asserted against a published figure.

Input#

data
{
  "valuation_date": "2026-08-04",
  "currency": "USD",
  "dividends": [2, 2.2, 2.42, 2.6, 2.75],
  "cost_of_equity": 0.1,
  "terminal_growth": 0.04
}

Call#

dividendDiscountModel(data)

Returns#

object with 10 fields: state, method, schedule, pv_explicit_dividends, terminal_dividend, terminal_value, terminal_discount_factor, pv_terminal_value, …

{
  "state": "valued",
  "method": "multi-stage-dividend-discount",
  "schedule": [
    {
      "period": 1,
      "dividend": 2,
      "discount_factor": 0.9090909090909091,
      "present_value": 1.8181818181818181
    },
    {
      "period": 2,
      "dividend": 2.2,
      "discount_factor": 0.8264462809917354,
      "present_value": 1.8181818181818181
    },
    {
      "period": 3,
      "dividend": 2.42,
      "discount_factor": 0.7513148009015775,
      "present_value": 1.8181818181818177
    }
  ],
  "pv_explicit_dividends": 8.937914076907314,
  "terminal_dividend": 2.8600000000000003,
  "terminal_value": 47.66666666666667,
  "terminal_discount_factor": 0.6209213230591549,
  "pv_terminal_value": 29.59724973248639,
  "terminal_value_share": 0.7680582306301622,
  "intrinsic_value_per_share": 38.5351638093937
}

Other exports#

This module also exports calculate, freeCashFlowDcf, gordonGrowthModel, residualIncomeModel, economicValueAdded. Every module additionally exports run as an alias of its primary function, and a meta object carrying its catalog id, domain, family, shape and article URL.

Diagrams#

Dividend Discount Model — article hero
Dividend Discount Model — model boundaries
Dividend Discount Model — reconciliation bridge
Dividend Discount Model — sensitivity map
Dividend Discount Model — system map
Dividend Discount Model — valuation timeline

How it works#

This page states the contract — how to call it correctly. The article explains the concept: why it works, and where it breaks.

Read the article →

References#

The rest of the Intrinsic Valuation family#