Justified Multiples
The justified multiples are the Price-to-Earnings and Price-to-Book ratios the dividend discount and residual income models imply for a company with a constant payout ratio, Return on Equity and growth rate. Comparing them with the actual multiples shows whether the market prices a company above or below what its profitability, payout and growth justify at a given required rate of return.
The formula is as follows:
\[\text{Growth Rate} = \text{Return on Equity} \cdot (1 - \text{Payout Ratio}),\;\; \text{the sustainable growth rate},\;\; \text{unless a growth rate is given}\] \[\text{Justified Trailing}\; P / E = \text{Payout Ratio} \cdot (1 + \text{Growth Rate}) / (\text{Rate of Return} - \text{Growth Rate})\] \[\text{Justified Leading}\; P / E = \text{Payout Ratio} / (\text{Rate of Return} - \text{Growth Rate})\] \[\text{Justified}\; P / B = (\text{Return on Equity} - \text{Growth Rate}) / (\text{Rate of Return} - \text{Growth Rate})\] \[\text{Price-to-Earnings Ratio} = \text{Share Price} / (\text{Net Income} / \text{Weighted Average Shares})\] \[\text{Price-to-Book Ratio} = \text{Share Price} / (\text{Total Shareholder Equity} / \text{Weighted Average Shares})\]Also known as: justified P/E, justified P/B, fundamental P/E, warranted multiples.
Justified Multiples in Python or via the MCP
Install the Finance Toolkit with:
pip install financetoolkit -U
Then call get_justified_multiples as shown below.
from financetoolkit import Toolkit
toolkit = Toolkit(
["KO", "PEP", "PG"],
api_key="FINANCIAL_MODELING_PREP_KEY",
start_date="2021-01-01",
end_date="2025-12-31",
)
toolkit.models.get_justified_multiples(rate_of_return=0.08, growth_rate=0.04).loc["KO"]
Or, after setting up the Finance Toolkit MCP, ask:
Which P/E and P/B ratios did Coca-Cola's payout and return on equity justify from 2021 to 2025, at an 8% required return and 4% growth, and how do they compare with its actual multiples?
Which returns:
| 2021 | 2022 | 2023 | 2024 | 2025 | |
|---|---|---|---|---|---|
| Payout Ratio | 0.7422 | 0.7982 | 0.7422 | 0.7863 | 0.6698 |
| Return on Equity | 0.4591 | 0.3838 | 0.4149 | 0.3869 | 0.497 |
| Growth Rate | 0.04 | 0.04 | 0.04 | 0.04 | 0.04 |
| Justified Trailing P/E | 19.2971 | 20.752 | 19.2974 | 20.4434 | 17.4147 |
| Justified Leading P/E | 18.5549 | 19.9539 | 18.5552 | 19.6571 | 16.7449 |
| Justified P/B | 10.4769 | 8.5957 | 9.3713 | 8.6716 | 11.4251 |
| Price-to-Earnings Ratio | 26.2994 | 28.9985 | 23.8657 | 25.2999 | 23.0046 |
| Price-to-Book Ratio | 11.1732 | 11.4791 | 9.8569 | 10.8209 | 9.3731 |
Parameters
get_justified_multiples accepts the following parameters.
| Parameter | Type | Description | Example |
|---|---|---|---|
rate_of_return | float | The required rate of return on equity. | 0.08 |
growth_rate | float | None | The constant growth rate of the earnings, dividends and book value. Defaults to None, which uses the sustainable growth rate of each period. | 0.03 |
diluted | bool | Whether to use the diluted share count for the actual multiples. Defaults to True. | False |
trailing | int | None | Sum the flows over this many periods and measure the Return on Equity on the equity that many periods back. Defaults to None, which is 4 for quarterly data (a trailing twelve months) and 1 otherwise. | 4 |
rounding | int | None | The number of decimals to round the results to. Defaults to None, which uses the rounding of the Toolkit (4 unless set otherwise). | 2 |
show_columns | list[str] | None | The periods to show. Defaults to None, all periods. | None, all periods |