P/E Ratios Using Normalized Earnings

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

Sep 11, 2023 5:38 PM - Rajnish Katharotiya

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

Sep 11, 2023 - Rajnish Katharotiya

What is Price To Earnings Ratio and How to Calculate it using Python

Price-to-Earnings ratio is a relative valuation tool. It is used by investors to find great companies at low prices. In this post, we will build a Python script to calculate Price Earnings Ratio for comparable companies. Photo by Skitterphoto on Pexels Price Earnings Ratio and Comparable Compa...

blog post title

Oct 17, 2023 - Davit Kirakosyan

VMware Stock Drops 12% as China May Hold Up the Broadcom Acquisition

Shares of VMware (NYSE:VMW) witnessed a sharp drop of 12% intra-day today due to rising concerns about China's review of the company's significant sale deal to Broadcom. Consequently, Broadcom's shares also saw a dip of around 4%. Even though there aren’t any apparent problems with the proposed solu...

blog post title

Oct 17, 2023 - Davit Kirakosyan

Bank of America Stock Rises After Q3 Earnings Report

Shares of Bank of America (NYSE:BAC) rose more than 2% intra-day today after the company reported third-quarter results which surpassed expectations on both revenue and earnings fronts. The bank's net income experienced a 10% surge, reaching $7.8 billion, which translates to $0.90 per share. This ex...

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-2023 © Financial Modeling Prep