Price to Earnings is one of the key metrics use to value companies using multiples. The P/E ratio and other multiples are relative valuation metrics and they ca

P/E Ratios Using Normalized Earnings


blog post cover photo

Image credit: Thành ‎

Price to Earnings is one of the key metrics use to value companies using multiples. The P/E ratio and other multiples are relative valuation metrics and they cannot be looked at in isolation.

One of the problems with the P/E metric is the fact that if we are in the peak of a business cycle, earnings are going be very high. And by definition, high earnings will lead to a low P/E ratio skewing our analysis.

In this post, we are going to learn how to normalize earnings so that the business cycle do not impact our P/E ratio analysis. At the end of it, we will be able to calculate P/E ratios using normalized earnings. Similarly to my prior posts, we will use Python to automate the process.

Photo by Pixabay on Pexels

Normalized Earnings and Price to Earnings (P/E)

Business cycles tend to repeat themselves over the long time. There is always a peak and a bottom of the cycle. Peaks and bottoms are not the best timing to compute P/E ratios. Ideally, we should account for this cyclicality when looking into the price earnings ratio. To do so, we use normalized earnings.

By adjusting earnings per share (EPS) for cyclicality, we avoid to have a distorted P/E ratio due to cyclicality. We have two different alternatives available to normalize EPS:

  • Average EPS over previous periods. With this method, we compute an average EPS using historical earnings (use the same number of periods as the duration of the business cycle). Then, we use the normalized EPS to compute the P/E ratio. The problem with this approach is that it does not account for the size/growth of the company. If a company is in a growing phase, EPS will grow no matter if the business cycle is peaking or in recession skewing our results. Therefore, normalizing eps using this method is only recommended for mature companies. For growing companies, we can use the ROE method described below.

  • Average Return on Equity (ROE). Through this approach, we normalize EPS using the historical ROE average. Then, we use the latest Book value per share in order to account for size growth.Business cycles can have different impacts in different companies. To normalize earnings per share, it is recommended to assess how long a business cycle may last. There is not a standard duration of business cycles as shown in the following Wikipedia table.

Calculating Normalized EPS with Python

Now that we know how to normalize EPS, we can start using Python to calculate PE ratios through normalized earnings. Lets have first a quick look at the formulas:

Normalize P/E using average EPS= P/E where E is the Average EPS of last n years

Normalize P/E using average ROE = P/E where E is the Average ROE of last n years * the latest BVPS

To calculate P/E ratio using normalized earnings, we will need below metrics:

  • Diluted EPS

  • Price to Book

  • Value Ratio

  • Return on Equity

In the code below, we using three different API end points to retrieve the required financial metrics. All API end points can be found in the official documentation.

The idea of below code is to store all our metrics into a Python dictionary, and then convert them into a Pandas DataFrame. A Pandas DataFrame will facilitate the calculation of the company normalized EPS. Note that we need to pass an API key within the api_key variable. The code can be reused for any other company.

We use the diluted EPS in order to account for any potential dilutions and retrieve the data for the last 8 years. In reality, the current business cycle is lasting than 8 years but we will keep it simple in this post.

import pandas as pd

import requests

api_key = 'your api key'

company = 'MSFT'

eps = requests.get(f'{company}?limit=12&apikey={api_key}').json()

eps = eps[:8]

analysis_data = {}

for item in eps:

analysis_data[item['date']] = {}

analysis_data[item['date']]['eps'] = item['epsdiluted']


key_metrics = requests.get(f'{company}?limit=10&apikey={api_key}').json()

key_metrics = key_metrics[:8]

for item in key_metrics:

analysis_data[item['date']]['BVPS'] = item['bookValuePerShare']

analysis_data[item['date']]['ROE'] = item['roe']

analysis_data[item['date']]['PE'] = item['peRatio']

normalized_EPS = pd.DataFrame(analysis_data)


After running the code above, we have the required metrics by year in the normalized EPS DataFrame.

Finally, we calculate the P/E ratios using the normalised earnings. In the code below, we use the two methods described in the prior section to do so:

normalize_mean = normalized_EPS.mean(axis=1)

eps_average = normalize_mean['eps']

roe_average = normalize_mean['ROE']

latest_BVPS = normalized_EPS.iloc[1:2,0][0]

price= requests.get(f'{company}?apikey={api_key}').json()

price = price[0]['price']

PEnormalized_average_eps = price/eps_average


normalized_eps_average_ROE = roe_average*latest_BVPS

PEnormalized_ROE_EPS = price/normalized_eps_average_ROE


The outcome of the code is the P/E ratio computed using normalised earnings.

Other Blogs

Nov 25, 2023 6:39 AM - Parth Sanghvi

DCF Valuation vs. Comparable Companies Analysis: Choosing the Right Valuation Method

Choosing the Right Valuation Method: DCF vs. Comparable Companies Analysis Introduction: Valuation methods play a pivotal role in determining the fair value of a company, aiding investors in making informed investment decisions. Two commonly used methods, DCF Valuation and Comparable Companies A...

blog post title

Dec 25, 2023 2:31 AM - Parth Sanghvi

Decoding the Discounted Cash Flow (DCF) Model: A Comprehensive Guide for Strategic Investment Analysis

Introduction: The Discounted Cash Flow (DCF) model stands as a cornerstone in investment analysis, offering a robust framework for estimating the intrinsic value of an investment. In this comprehensive guide, we delve into the fundamentals of DCF analysis, providing step-by-step instructions, key...

blog post title

Jan 4, 2024 1:56 AM - Parth Sanghvi

Optimizing DCF Model Accuracy: Advancements through Big Data and AI Integration

The Discounted Cash Flow (DCF) model remains a cornerstone in financial analysis, offering a strategic way to assess the intrinsic value of an investment. With advancements in technology, the integration of Big Data and Artificial Intelligence (AI) presents a transformative approach to enhance the p...

blog post title


Financial Modeling Prep API provides real time stock price, company financial statements, major index prices, stock historical data, forex real time rate and cryptocurrencies. Financial Modeling Prep stock price API is in real time, the company reports can be found in quarter or annual format, and goes back 30 years in history.
2017-2024 © Financial Modeling Prep