Analyzing Financial Statements with Python
In this blog post, we’ll explore how to analyze company financials using DuPont Analysis and Python. We’ll retrieve financial data using the AlphaVantage API, parse the data, and calculate key financial ratios to evaluate a company’s performance. To get started, let’s take a look at the code and understand the python for financial analysis and different functions and classes.
import json
import requests
def pretty_print(data: dict):
print(json.dumps(data, indent=4))
We begin by importing the necessary libraries, json
and requests
. The pretty_print
function will help us display the JSON data in a more readable format later on.
Retrieving Data from the API
api_key = 'YOUR KEY HERE'
def retrieve_data(function: str, symbol: str, api_key: str) -> dict:
"""
Retrieves data from AlphaVantage's open API.
Documentation located at: https://www.alphavantage.co/documentation
"""
# query from API
url = f'https://www.alphavantage.co/query?function={function}&symbol={symbol}&apikey={api_key}'
response = requests.get(url)
# read output
data = response.text
# parse output
parsed = json.loads(data)
return parsed
The retrieve_data
function connects to the AlphaVantage API and retrieves financial data based on the given parameters: function
, symbol
, and api_key
. You can find more information on the API and its documentation here.
Getting Latest and Second Latest Balance Sheet and Income Statement
def get_latest_balance_sheet(symbol: str, api_key: str) -> dict:
"""
Retrieves latest balance sheet of company specified in symbol.
"""
balance_sheets = retrieve_data('BALANCE_SHEET', symbol, api_key)['annualReports']
latest_balance_sheet = balance_sheets[0]
return latest_balance_sheet
def get_second_latest_balance_sheet(symbol: str, api_key: str) -> dict:
"""
Retrieves second latest balance sheet of company specified in symbol.
"""
balance_sheets = retrieve_data('BALANCE_SHEET', symbol, api_key)['annualReports']
second_latest_balance_sheet = balance_sheets[1]
return second_latest_balance_sheet
def get_latest_income_statement(symbol: str, api_key: str) -> dict:
"""
Retrieves latest income statement of company specified in symbol.
"""
income_statements = retrieve_data('INCOME_STATEMENT', symbol, api_key)['annualReports']
latest_income_statement = income_statements[0]
return latest_income_statement
We then create three functions, get_latest_balance_sheet
, get_second_latest_balance_sheet
, and get_latest_income_statement
, to retrieve the latest and second latest balance sheet and income statement for a given company.
Financial Statement Analyzer Class
class FinancialStatementAnalyzer:
def __init__(self, balance_sheet: dict, prior_balance_sheet: dict, income_statement: dict):
self.balance_sheet = balance_sheet
self.prior_balance_sheet = prior_balance_sheet
self.income_statement = income_statement
# ... (methods for calculating net_profit_margin, asset_turnover, equity_multiplier, and roe)
We create a FinancialStatementAnalyzer
class to calculate the key financial ratios needed for DuPont Analysis: net profit margin, asset turnover, equity multiplier, and return on equity (ROE).
Performing DuPont Analysis
import time
stocks = ['ZM', 'FB', 'GOOGL', 'BABA', 'XOM', 'GE', 'LMT', 'LLY', 'PG',]
# simple DuPont analysis
print('DuPont Analysis')
for stock in stocks:
latest_bs = get_latest_balance_sheet(stock, api_key)
prior_bs = get_second_latest_balance_sheet(stock, api_key)
latest_is = get_latest_income_statement(stock, api_key)
analyzer = FinancialStatementAnalyzer(latest_bs, prior_bs, latest_is)
# print ROE and DuPont analysis ratios
print(f'{stock}\tProfit Margin: {analyzer.net_profit_margin()}\tAsset Turnover: {analyzer.asset_turnover()}\t\
Equity Multiplier: {analyzer.equity_multiplier()}\tROE: {analyzer.roe()}')
time.sleep(60)
Now that we have our FinancialStatementAnalyzer
class set up, we can perform DuPont Analysis on a list of stocks. In the code above, we create a list of stock symbols, loop through them, and retrieve the necessary financial data using our previously defined functions. Then, we instantiate a FinancialStatementAnalyzer
object for each stock, calculate the financial ratios, and print the results.
Since AlphaVantage API has limitations on the number of requests per minute, we use time.sleep(60)
to wait for one minute between requests, ensuring that we stay within the allowed limit.
Conclusion
In this blog post, we demonstrated how to analyze company financials using DuPont Analysis and Python. We used the AlphaVantage API to retrieve financial data, parsed the data, and calculated key financial ratios to evaluate a company’s performance. This approach allows us to quickly and efficiently analyze multiple companies and gain valuable insights into their financial health.