Skip to content

This is a database of 300.000 symbols containing Equities, ETFs, Funds, Indices, Currencies, Cryptocurrencies and Money Markets.

License

Notifications You must be signed in to change notification settings

JerBouma/FinanceDatabase

Repository files navigation

Logo

GitHub Sponsors Buy Me a Coffee Twitter LinkedIn Documentation Supported Python Versions PYPI Version PYPI Downloads

Call for Contributors to the FinanceDatabase
The FinanceDatabase serves the role of providing anyone with any type of financial product categorization entirely for free. To be able to achieve this, the FinanceDatabase relies on involvement from the community to add, edit and remove tickers over time. This is made easy enough that anyone, even with a lack of coding experience can contribute because of the usage of CSV files that can be manually edited with ease.
I'd like to invite you to go to the Contributing Guidelines to understand how you can help. Thank you!

As a private investor, the sheer amount of information that can be found on the internet is rather daunting. Trying to understand what type of companies or ETFs are available is incredibly challenging with there being millions of companies and derivatives available on the market. Sure, the most traded companies and ETFs can quickly be found simply because they are known to the public (for example, Microsoft, Tesla, S&P500 ETF or an All-World ETF). However, what else is out there is often unknown.

This database tries to solve that. It features 300.000 symbols containing Equities, ETFs, Funds, Indices, Currencies, Cryptocurrencies and Money Markets. It therefore allows you to obtain a broad overview of sectors, industries, types of investments and much more.

The aim of this database is explicitly not to provide up-to-date fundamentals or stock data as those can be obtained with ease (with the help of this database) by using the Finance Toolkit 🛠️. Instead, it gives insights into the products that exist in each country, industry and sector and gives the most essential information about each product. With this information, you can analyse specific areas of the financial world and/or find a product that is hard to find. See for examples on how you can combine this database, and the earlier mentioned packages the section Examples.

Some key statistics of the database:

Product Quantity Sectors Industries Countries Exchanges
Equities 158.429 12 63 111 83
ETFs 36.786 295 22 111 53
Funds 57.881 1541 52 111 34
Product Quantity Category
Currencies 2.556 175 Currencies
Cryptocurrencies 3.367 352 Cryptocurrencies
Indices 91.183 64 Exchanges
Money Markets 1.367 3 Exchanges

The Finance Database is used within or referenced by:

OpenBB Noteable AlgoTrading PyQuantNews Medium


Table of Contents

  1. Installation
  2. Basic Usage
    1. Quick Start
    2. Collecting information from the database
    3. Searching the database extensively
    4. Storing the database at a different location
  3. Examples
    1. Companies in the Netherlands
    2. Perform a Dupont Analysis on Railroad Companies
    3. Technical Analysis of Biotech ETFs
  4. Questions & Answers
  5. User Contributions
  6. Contact

Installation

Before installation, consider starring the project on GitHub which helps others find the project as well.

image

To install the FinanceDatabase it simply requires the following:

pip install financedatabase -U

Then within Python use:

import financedatabase as fd

Basic Usage

This section explains in detail how the database can be queried with the related financedatabase package, also see the Jupyter Notebook in which you can run the examples also demonstrated here. You can find this document here.

Quick Start

Same methods apply to all other asset classes as well. Columns may vary.

import financedatabase as fd

# Initialize the Equities database
equities = fd.Equities()

# Obtain all countries from the database
equities_countries = equities.options("country")

# Obtain all sectors from the database
equities_sectors = equities.options("sector")

# Obtain all industry groups from the database
equities_industry_groups = equities.options("industry_group")

# Obtain all industries from a country from the database
equities_germany_industries = equities.options("industry", country="Germany")

# Obtain a selection from the database
equities_united_states = equities.select(country="United States")

# Obtain a detailed selection from the database
equities_usa_machinery = equities.select(
    country="United States", industry="Machinery"
)

# Search specific fields from the database
equities_uk_biotech = equities.search(
    country="United Kingdom", summary="biotech", exchange="LSE"
)

# Search specific fields from the database with lists
equities_media_services = equities.search(
    industry="Interactive Media & Services",
    country="United States",
    market_cap=["Large Cap", "Mega Cap"]
)

# Use the tickers to obtain data via the Finance Toolkit
telecomunication_services = equities.search(
    industry="Diversified Telecommunication Services",
    country="United States",
    market_cap="Mega Cap",
    exclude_exchanges=True)

toolkit = telecomunication_services.to_toolkit(
    api_key="FINANCIAL_MODELING_PREP_KEY",
    start_date="2000-01-01",
    progress_bar=False
)

# For example, obtain the historical data
historical_data = toolkit.get_historical_data()

Scroll down below for a more elaborate explanation and detailed examples.

Collecting information from the database

Please see the Jupyter Notebook for an elaborate explanation of each asset class. This includes Equities, ETFs, Funds, Indices, Currencies, Cryptocurrencies and Money Markets.


Find code examples of all Asset Classes in the Jupyter Notebook here.


As an example for Equities, If you wish to collect data from all equities you can use the following:

import financedatabase as fd

# Initialize the Equities database
equities = fd.Equities()

# Obtain all data available excluding international exchanges
equities.select()

Which returns the following DataFrame:

symbol name currency sector industry_group industry exchange market country state city zipcode website market_cap isin cusip figi composite_figi shareclass_figi
A Agilent Technologies, Inc. USD Health Care Pharmaceuticals, Biotechnology & Life Sciences Biotechnology NYQ New York Stock Exchange United States CA Santa Clara 95051 http://www.agilent.com Large Cap US00846U1016 00846U101 BBG000C2V541 BBG000C2V3D6 BBG001SCTQY4
AA Alcoa Corporation USD Materials Materials Metals & Mining NYQ New York Stock Exchange United States PA Pittsburgh 15212-5858 http://www.alcoa.com Mid Cap US0138721065 13872106 BBG00B3T3HK5 BBG00B3T3HD3 BBG00B3T3HF1
AAALF Aareal Bank AG USD Financials Banks Banks PNK OTC Bulletin Board Germany nan Wiesbaden 65189 http://www.aareal-bank.com Small Cap US00254K1088 00254K108 nan nan nan
AAALY Aareal Bank AG USD Financials Banks Banks PNK OTC Bulletin Board Germany nan Wiesbaden 65189 http://www.aareal-bank.com Small Cap US00254K1088 00254K108 nan nan nan
AABB Asia Broadband, Inc. USD Materials Materials Metals & Mining PNK OTC Bulletin Board United States NV Las Vegas 89135 http://www.asiabroadbandinc.com Micro Cap nan nan nan nan nan

This returns approximately 20.000 different equities. Note that by default, only the American exchanges are selected. These are symbols like TSLA (Tesla) and MSFT (Microsoft) that tend to be recognized by a majority of data providers and therefore is the default. To disable this, you can set the exclude_exchanges argument to False which then results in approximately 155,000 different symbols.

Note that the summary column is taken out on purpose to keep it organized for markdown. The summary is however very handy when it comes to querying specific words as found with the following description given for Apple. All of this information is available when you query the database. Find a more elaborate explanation with help(equities.select).

As an example, we can use equities.options to obtain specific country, sector and industry options. For we can acquire all industries within the sector Basic Materials within the United States. This allows us to look at a specific industry in the United States in detail.

industry_options = equities.options(selection='industry', country="United States", sector="Materials")

Which returns:

array(['Chemicals', 'Construction Materials', 'Metals & Mining',
       'Paper & Forest Products'], dtype=object)

So with this information in hand, I can now query the industry Metals & Mining as follows:

metals_and_mining = equities.search(industry="Metals & Mining", country="United States", market_cap="Large Cap", exclude_exchanges=True)

metals_and_mining

This gives you a DataFrame with the following information:

symbol name currency sector industry_group industry exchange market country state city zipcode website market_cap isin cusip figi composite_figi shareclass_figi
FCX Freeport-McMoRan Inc. USD Materials Materials Metals & Mining NYQ New York Stock Exchange United States AZ Phoenix 85004-2189 http://fcx.com Large Cap US35671D8570 35671D857 BBG000BJDCQ6 BBG000BJDB15 BBG001S5R3F3
NEM Newmont Corporation USD Materials Materials Metals & Mining NYQ New York Stock Exchange United States CO Denver 80237 http://www.newmont.com Large Cap US6516391066 651639106 BBG000BPWYG4 BBG000BPWXK1 BBG001S5TKX3
NUE Nucor Corporation USD Materials Materials Metals & Mining NYQ New York Stock Exchange United States NC Charlotte 28211 http://www.nucor.com Large Cap US6703461052 670346105 BBG000BQ8MY5 BBG000BQ8KV2 BBG001S5TRV0
RS Reliance Steel & Aluminum Co. USD Materials Materials Metals & Mining NYQ New York Stock Exchange United States CA Los Angeles 90071 http://www.rsac.com Large Cap US7595091023 759509102 BBG000CJ2332 BBG000CJ2181 BBG001S81M27
SCCO Southern Copper Corporation USD Materials Materials Metals & Mining NYQ New York Stock Exchange United States AZ Phoenix 85014 http://www.southerncoppercorp.com Large Cap US84265V1052 84265V105 BBG000BSHKK0 BBG000BSHH72 BBG001S6ZM88
STLD Steel Dynamics, Inc. USD Materials Materials Metals & Mining NMS NASDAQ Global Select United States IN Fort Wayne 46804 http://www.steeldynamics.com Large Cap US8581191009 858119100 BBG000HH03N1 BBG000HGYNZ9 BBG001S98JK5

As you can imagine, looking at such a specific selection only yields a few results but picking the entire sector Materials would have returned 403 different companies (which excludes exchanges other than the United States).

To conclude, this information can then be send to the Finance Toolkit 🛠️ to obtain 130 financial metrics, historical and fundamental data with the to_toolkit function. This functionality can be used with any output as obtained from the Finance Database.

companies = metals_and_mining.to_toolkit(
    api_key="FINANCIAL_MODELING_PREP_KEY",
    start_date="2000-01-01",
    quarterly=False)

companies.get_quote()

This returns the following:

FCX NEM NUE RS SCCO STLD
Symbol FCX NEM NUE RS SCCO STLD
Price 38.755 40.3007 157.54 268.06 78.3 99.49
Beta 2.065006 0.394536 1.627593 0.923236 1.294605 1.523167
Average Volume 10431879 7104366 1315646 265598 1031395 1277711
Market Capitalization 55560715720 31998755800 39183663880 15696816226 60534353894 16479921560
Last Dividend 0.6000000000000001 1.6 2.04 4 4 1.7000000000000002
Range 26.03-46.73 37.45-55.41 102.86-182.68 168.25-295.98 42.42-87.59 69.12-136.46
Changes -1.435 -0.1693 2.87 4.41 -1.3599999999999999 1.38
Company Name Freeport-McMoRan Inc. Newmont Corporation Nucor Corporation Reliance Steel & Aluminum Co. Southern Copper Corporation Steel Dynamics, Inc.
Currency USD USD USD USD USD USD
CIK 831259 1164727 73309 861884 1001838 1022671
ISIN US35671D8570 US6516391066 US6703461052 US7595091023 US84265V1052 US8581191009
CUSIP 35671D857 651639106 670346105 759509102 84265V105 858119100
Exchange New York Stock Exchange New York Stock Exchange New York Stock Exchange New York Stock Exchange New York Stock Exchange NASDAQ Global Select
Exchange Short Name NYSE NYSE NYSE NYSE NYSE NASDAQ
Industry Copper Gold Steel Steel Copper Steel
Website https://fcx.com https://www.newmont.com https://www.nucor.com https://www.rsac.com https://www.southernperu.com https://stld.steeldynamics.com
CEO Mr. Richard C. Adkerson Mr. Thomas Ronald Palmer Mr. Leon J. Topalian Ms. Karla R. Lewis Mr. Oscar Gonzalez Rocha Mr. Mark D. Millett
Sector Basic Materials Basic Materials Basic Materials Basic Materials Basic Materials Basic Materials
Country US US US US US US
Full Time Employees 25600 14600 31400 14500 15018 12060
Phone 602 366 8100 303 863 7414 704 366 7000 213 687 7700 602 264 1375 260 969 3500
Address 333 North Central Avenue 6900 East Layton Avenue 1915 Rexford Road 350 South Grand Avenue 1440 East Missouri Avenue 7575 West Jefferson Boulevard
City Phoenix Denver Charlotte Los Angeles Phoenix Fort Wayne
State AZ CO NC CA AZ IN
ZIP Code 85004-2189 80237 28211 90071 85014 46804
DCF Difference 3.24601 2.08 9.70759 13.6802 13.4469 9.8176
DCF 41.574 51.24 157.162 213.01 61.1331 109.112
IPO Date 1995-07-10 1980-03-17 1980-03-17 1994-09-16 1996-01-05 1996-11-22

Searching the database extensively

All asset classes have the capability to search each column with search, for example equities.search(). Through how this functionality is developed you can define multiple columns and search throughoutly. For example:

# Collect all Equities Database
equities = fd.Equities()

# Search Multiple Columns
equities.search(summary='automotive', currency='USD', country='Germany')

Which returns a selection of the DataFrame that matches all criteria.

symbol name currency sector industry_group industry exchange market country state city zipcode website market_cap isin cusip figi composite_figi shareclass_figi
AFRMF Alphaform AG USD Industrials Capital Goods Machinery PNK OTC Bulletin Board Germany nan Feldkirchen 85622 nan Nano Cap nan nan nan nan nan
AUUMF Aumann AG USD Industrials Capital Goods Machinery PNK OTC Bulletin Board Germany nan Beelen 48361 http://www.aumann.com Micro Cap DE000A2DAM03 nan nan nan nan
BAMXF Bayerische Motoren Werke Aktiengesellschaft USD Consumer Discretionary Automobiles & Components Automobiles PNK OTC Bulletin Board Germany nan Munich 80788 http://www.bmwgroup.com Large Cap DE0005190037 nan nan nan nan
BASFY BASF SE USD Materials Materials Chemicals PNK OTC Bulletin Board Germany nan Ludwigshafen am Rhein 67056 http://www.basf.com Large Cap nan nan nan nan nan
BDRFF Beiersdorf Aktiengesellschaft USD Consumer Staples Household & Personal Products Household Products PNK OTC Bulletin Board Germany nan Hamburg 20245 http://www.beiersdorf.com Large Cap US07724U1034 07724U103 nan nan nan

Storing the database at a different location

If you wish to store the database at a different location (for example your own Fork) you can do so with the variable base_url which you can find in each of the asset classes. An example would be:

  • fd.Equities(base_url=<YOUR URL>)

You can also store the database locally and point to your local location with the variable base_url and by setting use_local_location to True. An example would be:

  • fd.Equities(base_url=<YOUR PATH>, use_local_location=True)

Examples

This section gives a few examples of the possibilities with this package. These are merely a few of the things you can do with the package. As you can obtain a wide range of symbols, pretty much any package that requires symbols should work.


Find a variety of How-To Guides for the FinanceDatabase here.


Companies in the Netherlands

I want to see how many public companies exist in each sector in the Netherlands. Here, I can obtain all stocks that are located in the Netherlands with country='Netherlands'. I also include all exchanges by setting exclude_exchanges=False. This will give me all stocks that are listed on all exchanges. This is relevant because some stocks are listed on exchanges that are not the American exchanges which the parameter defaults to. Find the related Jupyter Notebook with more examples here.

import financedatabase as fd

dutch_companies = equities.select(country='Netherlands', exclude_exchanges=False)

Which returns:

symbol name currency sector industry_group industry exchange market country state city zipcode website market_cap isin cusip figi composite_figi shareclass_figi
09B.F lastminute.com N.V. EUR Consumer Discretionary Consumer Services Hotels, Restaurants & Leisure FRA Frankfurt Stock Exchange Netherlands nan Amsterdam 1097 JB http://lmgroup.lastminute.com Small Cap nan nan nan nan nan
0DI7.L AFC Ajax NV EUR nan nan nan LSE London Stock Exchange (international) Netherlands nan Amsterdam 1101 AX http://www.ajax.nl Micro Cap NL0000018034 nan nan nan nan
0DLI.L Amsterdam Commodities N.V. EUR nan nan nan LSE London Stock Exchange (international) Netherlands nan Rotterdam 3011 DD http://www.acomo.nl Small Cap nan nan nan nan nan
0DQK.L Beter Bed Holding N.V. EUR nan nan nan LSE London Stock Exchange (international) Netherlands nan Uden 5405 AR http://www.beterbedholding.com Micro Cap NL0000339703 nan nan nan nan
0E2F.L Ctac N.V. EUR nan nan nan LSE London Stock Exchange (international) Netherlands nan 's-Hertogenbosch 5216 TZ http://www.ctac.nl Micro Cap NL0000345577 nan nan nan nan

This will return the same company multiple times. That makes sense, since a company can be listed on multiple exchanges. Filtering is applied by grouping by unique names and the sector.

unique_dutch_companies_per_sector = dutch_companies.groupby('sector').agg({'name': 'nunique'})

Now with this result, I can plot a pie chart to showcase the distribution of companies in each sector.

unique_dutch_companies_per_sector['name'].plot.pie(
    title='Number of companies per sector in the Netherlands',
    ylabel='',
)

This results in the following graph which gives an indication which sectors are dominant within The Netherlands. Of course this is a mere example and to truly understand the importance of certain companies for the Netherlands, you would need to know market cap of each sector as well including demographics.

FinanceDatabase

Perform a Dupont Analysis on Railroad Companies

A great use-case for the data found in the Finance Database is to do competitive analysis in which companies are compared that compete for the same market. For example, in case I want to look into the Railroad companies in the United States that are marked as "Large Cap", I can directly search for this with the Finance Database and use the Finance Toolkit 🛠️ to do further research. Find the related Jupyter Notebook with more examples here.

import financedatabase as fd

equities = fd.Equities()

railroad = equities.search(industry='Road & Rail',
                           country='United States',
                           market_cap='Large Cap',
                           exclude_exchanges=True)

This gives the following:

symbol name currency sector industry_group industry exchange market country state city zipcode website market_cap isin cusip figi composite_figi shareclass_figi
CSX CSX Corporation USD Industrials Transportation Road & Rail NMS NASDAQ Global Select United States FL Jacksonville 32202 http://www.csx.com Large Cap US1264081035 1.26408e 08 BBG000BGK1N1 BBG000BGJRC8 BBG001S5Q7Q3
KSU Kansas City Southern USD Industrials Transportation Road & Rail NYQ New York Stock Exchange United States MO Kansas City 64105 http://www.kcsouthern.com Large Cap nan nan nan nan nan
KSU-P Kansas City Southern USD Industrials Transportation Road & Rail NYQ New York Stock Exchange United States MO Kansas City 64105 http://www.kcsouthern.com Large Cap nan nan nan nan nan
NSC Norfolk Southern Corporation USD Industrials Transportation Road & Rail NYQ New York Stock Exchange United States VA Norfolk 23510-2191 http://www.norfolksouthern.com Large Cap US6558441084 6.55844e 08 BBG000BQ5GM4 BBG000BQ5DS5 BBG001S5TQJ6
UNP Union Pacific Corporation USD Industrials Transportation Road & Rail NYQ New York Stock Exchange United States NE Omaha 68179 http://www.up.com Large Cap US9078181081 9.07818e 08 BBG000BW3413 BBG000BW3299 BBG001S5X2M0
WAB Westinghouse Air Brake Technologies Corporation USD Industrials Transportation Road & Rail NYQ New York Stock Exchange United States PA Pittsburgh 15212 http://www.wabteccorp.com Large Cap US9297401088 9.2974e 08 BBG000BDDBD5 BBG000BDD940 BBG001S5XBT3

With this information in hand, I can now start collecting data with the FinanceToolkit package. This can be anything from balance sheet, cash flow and income statements to 100 financial ratios, technical indicators and more. Here I initialize the FinanceToolkit with the tickers as found in the Finance Database.

API_KEY = "YOUR_FMP_API_KEY"

companies = railroad.to_toolkit(api_key=API_KEY, start_date='2005-01-01')

Then, as a demonstration, I can obtain all balance sheet statements for all companies that are marked as Large Cap Railroad companies in the United States. To keep this concise, only the first company is shown.

companies.get_balance_sheet_statement().loc['CSX']

Which returns:

2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022
Cash and Cash Equivalents 3.09e 08 4.61e 08 3.68e 08 6.69e 08 1.029e 09 1.292e 09 7.83e 08 7.84e 08 5.92e 08 6.69e 08 6.28e 08 6.03e 08 4.01e 08 8.58e 08 9.58e 08 3.129e 09 2.239e 09 1.958e 09
Short Term Investments 2.93e 08 4.39e 08 3.46e 08 7.6e 07 6.1e 07 5.4e 07 5.23e 08 5.87e 08 4.87e 08 2.92e 08 8.1e 08 4.17e 08 1.8e 07 2.53e 08 9.96e 08 2e 06 7.7e 07 1.29e 08
Cash and Short Term Investments 6.02e 08 9e 08 7.14e 08 7.45e 08 1.09e 09 1.346e 09 1.306e 09 1.371e 09 1.079e 09 9.61e 08 1.438e 09 1.02e 09 4.19e 08 1.111e 09 1.954e 09 3.131e 09 2.316e 09 2.087e 09
Accounts Receivable 1.202e 09 1.174e 09 1.174e 09 1.107e 09 9.95e 08 9.93e 08 1.129e 09 9.62e 08 1.052e 09 1.129e 09 9.82e 08 9.38e 08 9.7e 08 1.01e 09 9.86e 08 9.12e 08 1.148e 09 1.313e 09
Inventory 1.99e 08 2.04e 08 2.4e 08 2.17e 08 2.03e 08 2.18e 08 2.4e 08 2.74e 08 2.52e 08 2.73e 08 3.5e 08 4.07e 08 3.72e 08 2.63e 08 2.61e 08 3.02e 08 3.39e 08 3.41e 08
Other Current Assets 1.44e 08 1.43e 08 1.09e 08 1.19e 08 1.24e 08 1.06e 08 7.8e 07 1.43e 09 1.523e 09 1.611e 09 1.528e 09 1.467e 09 1.496e 09 1.454e 09 1.324e 09 1.31e 09 1.557e 09 1.762e 09
Total Current Assets 2.372e 09 2.672e 09 2.491e 09 2.391e 09 2.57e 09 2.855e 09 2.935e 09 2.801e 09 2.602e 09 2.572e 09 2.966e 09 2.487e 09 1.915e 09 2.565e 09 3.278e 09 4.441e 09 3.873e 09 3.849e 09
Property, Plant and Equipment 2.0163e 10 2.0923e 10 2.178e 10 2.2688e 10 2.3213e 10 2.3799e 10 2.4974e 10 2.605e 10 2.7291e 10 2.8584e 10 3.0174e 10 3.115e 10 3.1764e 10 3.1998e 10 3.2168e 10 3.2444e 10 3.3015e 10 3.4242e 10
Goodwill 0 0 0 6.4e 07 6.4e 07 7e 07 6.4e 07 6.4e 07 6.4e 07 6.3e 07 6.3e 07 6.3e 07 6.3e 07 0 0 0 2.76e 08 3.19e 08
Intangible Assets 0 7.3e 07 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1.75e 08 1.83e 08
Long Term Investments 6.03e 08 6.07e 08 1.004e 09 1.015e 09 1.088e 09 1.134e 09 1.171e 09 1.206e 09 1.298e 09 1.356e 09 1.394e 09 1.459e 09 1.686e 09 1.779e 09 1.879e 09 1.985e 09 2.099e 09 2.292e 09
Tax Assets 0 0 2.54e 08 2.03e 08 -6.4e 07 4.74e 08 1.82e 08 1.19e 08 1.55e 08 1.41e 08 1.26e 08 9.596e 09 6.418e 09 6.69e 09 6.961e 09 7.168e 09 -4.51e 08 7.569e 09
Other Fixed Assets 1.094e 09 8.54e 08 2.59e 08 -7.3e 07 1.65e 08 -1.91e 08 1.47e 08 3.31e 08 3.72e 08 3.37e 08 3.16e 08 -9.341e 09 -6.107e 09 3.87e 08 9.32e 08 9.23e 08 1.544e 09 -6.542e 09
Fixed Assets 2.186e 10 2.2457e 10 2.3043e 10 2.3897e 10 2.4466e 10 2.5286e 10 2.6538e 10 2.777e 10 2.918e 10 3.0481e 10 3.2073e 10 3.2927e 10 3.3824e 10 3.4164e 10 3.4979e 10 3.5352e 10 3.6658e 10 3.8063e 10
Other Assets 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Total Assets 2.4232e 10 2.5129e 10 2.5534e 10 2.6288e 10 2.7036e 10 2.8141e 10 2.9473e 10 3.0571e 10 3.1782e 10 3.3053e 10 3.5039e 10 3.5414e 10 3.5739e 10 3.6729e 10 3.8257e 10 3.9793e 10 4.0531e 10 4.1912e 10
Accounts Payable 9.54e 08 9.74e 08 9.76e 08 9.73e 08 9.67e 08 1.046e 09 1.147e 09 1.014e 09 9.57e 08 8.45e 08 7.64e 08 8.06e 08 8.47e 08 9.49e 08 1.043e 09 8.09e 08 9.63e 08 1.13e 09
Short Term Debt 9.37e 08 6e 08 7.87e 08 3.2e 08 1.13e 08 6.13e 08 5.07e 08 7.8e 08 5.33e 08 2.28e 08 2e 07 3.31e 08 1.9e 07 1.8e 07 2.45e 08 4.01e 08 1.81e 08 1.51e 08
Tax Payables 1.02e 08 1.14e 08 1.13e 08 1.25e 08 1.12e 08 8.5e 07 1.29e 08 8.5e 07 9.1e 07 1.63e 08 1.08e 08 1.29e 08 1.57e 08 1.06e 08 6.9e 07 7.3e 07 1.34e 08 1.11e 08
Deferred Revenue 6.67e 08 6.09e 08 5.74e 08 5.9e 08 4.95e 08 -1.046e 09 -1.147e 09 -1.014e 09 -9.57e 08 -8.45e 08 -7.64e 08 -8.06e 08 -8.47e 08 1.06e 08 -1.043e 09 -8.09e 08 -9.63e 08 7.569e 09
Other Current Liabilities 4.21e 08 3.39e 08 3.34e 08 5.21e 08 2.9e 08 1.924e 09 2.18e 09 1.847e 09 1.891e 09 1.879e 09 1.932e 09 1.709e 09 1.875e 09 8.42e 08 1.906e 09 1.618e 09 2.052e 09 -6.379e 09
Total Current Liabilities 2.979e 09 2.522e 09 2.671e 09 2.404e 09 1.865e 09 2.537e 09 2.687e 09 2.627e 09 2.424e 09 2.107e 09 1.952e 09 2.04e 09 1.894e 09 1.915e 09 2.151e 09 2.019e 09 2.233e 09 2.471e 09
Long Term Debt 5.093e 09 5.362e 09 6.47e 09 7.512e 09 7.895e 09 8.051e 09 8.734e 09 9.052e 09 9.022e 09 9.514e 09 1.0683e 10 1.0962e 10 1.179e 10 1.4739e 10 1.5993e 10 1.6304e 10 1.6185e 10 1.7896e 10
Deferred Revenue Non Current 0 8.74e 08 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Deferred Tax Liabilities 6.082e 09 6.11e 09 6.096e 09 6.235e 09 6.585e 09 7.053e 09 7.601e 09 8.096e 09 8.662e 09 8.858e 09 9.305e 09 9.596e 09 6.418e 09 6.69e 09 6.961e 09 7.168e 09 7.383e 09 7.569e 09
Other Non Current Liabilities 2.124e 09 1.23e 09 1.612e 09 2.089e 09 1.831e 09 1.8e 09 1.983e 09 1.794e 09 1.17e 09 1.398e 09 1.431e 09 1.122e 09 9.16e 08 8.05e 08 1.289e 09 1.192e 09 1.23e 09 1.351e 09
Total Non Current Liabilities 1.3299e 10 1.3576e 10 1.4178e 10 1.5836e 10 1.6311e 10 1.6904e 10 1.8318e 10 1.8942e 10 1.8854e 10 1.977e 10 2.1419e 10 2.168e 10 1.9124e 10 2.2234e 10 2.4243e 10 2.4664e 10 2.4798e 10 2.6816e 10
Other Liabilities 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Capital Lease Obligations 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4.93e 08 4.55e 08 4.78e 08 4.88e 08
Total Liabilities 1.6278e 10 1.6098e 10 1.6849e 10 1.824e 10 1.8176e 10 1.9441e 10 2.1005e 10 2.1569e 10 2.1278e 10 2.1877e 10 2.3371e 10 2.372e 10 2.1018e 10 2.4149e 10 2.6394e 10 2.6683e 10 2.7031e 10 2.9287e 10
Preferred Stock 0 0 0 -1.824e 10 0 -2.801e 09 1.3e 07 1.4e 07 2.1e 07 2.4e 07 1.6e 07 1.5e 07 1.6e 07 1.7e 07 0 0 0 0
Common Stock 2.18e 08 4.38e 08 4.08e 08 3.91e 08 3.93e 08 3.7e 08 1.049e 09 1.02e 09 1.009e 09 9.92e 08 9.66e 08 9.28e 08 8.9e 08 8.18e 08 7.73e 08 7.63e 08 2.202e 09 2.066e 09
Retained Earnings 6.262e 09 7.427e 09 8.565e 09 8.398e 09 9.182e 09 9.087e 09 8.275e 09 8.876e 09 9.936e 09 1.0734e 10 1.1238e 10 1.1253e 10 1.4084e 10 1.2157e 10 1.1404e 10 1.2527e 10 1.163e 10 1.0363e 10
Accumulated Other Comprehensive Income -2.77e 08 -3.92e 08 -3.25e 08 -7.41e 08 -8.09e 08 -7.71e 08 -8.75e 08 -9.36e 08 -5.23e 08 -6.66e 08 -6.65e 08 -6.4e 08 -4.86e 08 -6.61e 08 -6.75e 08 -5.98e 08 -4.08e 08 -3.88e 08
Other Total Shareholder Equity 1.751e 09 1.469e 09 3.7e 07 1.824e 10 8e 07 2.815e 09 6e 06 2.8e 07 6.1e 07 9.2e 07 1.13e 08 1.38e 08 2.17e 08 2.49e 08 3.61e 08 4.18e 08 7.6e 07 5.84e 08
Total Shareholder Equity 7.954e 09 8.942e 09 8.685e 09 8.048e 09 8.846e 09 8.7e 09 8.468e 09 9.002e 09 1.0504e 10 1.1176e 10 1.1668e 10 1.1694e 10 1.4721e 10 1.258e 10 1.1863e 10 1.311e 10 1.35e 10 1.2625e 10
Total Equity 7.954e 09 8.942e 09 8.685e 09 8.048e 09 8.846e 09 8.7e 09 8.468e 09 9.002e 09 1.0504e 10 1.1176e 10 1.1668e 10 1.1694e 10 1.4721e 10 1.258e 10 1.1863e 10 1.311e 10 1.35e 10 1.2625e 10
Total Liabilities and Shareholder Equity 2.4232e 10 2.5129e 10 2.5534e 10 2.6288e 10 2.7036e 10 2.8155e 10 2.9486e 10 3.0585e 10 3.1803e 10 3.3077e 10 3.5055e 10 3.5429e 10 3.5755e 10 3.6746e 10 3.8272e 10 3.9802e 10 4.0541e 10 4.1922e 10
Minority Interest 0 8.9e 07 0 0 1.4e 07 1.4e 07 1.3e 07 1.4e 07 2.1e 07 2.4e 07 1.6e 07 1.5e 07 1.6e 07 1.7e 07 1.5e 07 9e 06 1e 07 1e 07
Total Liabilities and Equity 2.4232e 10 2.5129e 10 2.5534e 10 2.6288e 10 2.7036e 10 2.8155e 10 2.9486e 10 3.0585e 10 3.1803e 10 3.3077e 10 3.5055e 10 3.5429e 10 3.5755e 10 3.6746e 10 3.8272e 10 3.9802e 10 4.0541e 10 4.1922e 10
Total Investments 8.96e 08 1.046e 09 1.35e 09 1.091e 09 1.149e 09 1.188e 09 1.694e 09 1.793e 09 1.785e 09 1.648e 09 2.204e 09 1.876e 09 1.704e 09 2.032e 09 2.875e 09 1.987e 09 2.176e 09 2.421e 09
Total Debt 6.03e 09 5.962e 09 7.257e 09 7.832e 09 8.008e 09 8.664e 09 9.241e 09 9.832e 09 9.555e 09 9.742e 09 1.0703e 10 1.1293e 10 1.1809e 10 1.4757e 10 1.6238e 10 1.6705e 10 1.6366e 10 1.8047e 10
Net Debt 5.721e 09 5.501e 09 6.889e 09 7.163e 09 6.979e 09 7.372e 09 8.458e 09 9.048e 09 8.963e 09 9.073e 09 1.0075e 10 1.069e 10 1.1408e 10 1.3899e 10 1.528e 10 1.3576e 10 1.4127e 10 1.6089e 10

With the data from the FinanceToolkit, it is now possible to execute a Dupont analysis on all companies. This shows the power of being able to combine a large database with a toolkit that allows you to do proper financial research. Again, only the first company is selected to keep things compact.

companies.models.get_extended_dupont_analysis().loc['CSX']

Which returns:

2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022
Interest Burden Ratio 1.4961 1.1613 1.1677 1.2898 1.2976 1.2062 1.1835 1.1663 1.1886 1.1869 1.1421 1.2364 1.1671 1.1313 1.1504 1.2026 1.1299 1.1125
Tax Burden Ratio 0.7387 0.6127 0.5922 0.4931 0.5042 0.509 0.5331 0.5377 0.5367 0.5334 0.5491 0.5058 1.492 0.6796 0.6709 0.6339 0.6759 0.6917
Operating Profit Margin 0.1202 0.1925 0.1926 0.1907 0.1948 0.2394 0.2459 0.2521 0.243 0.2403 0.2657 0.2476 0.2754 0.3513 0.3616 0.3427 0.3954 0.3645
Asset Turnover nan 0.3876 0.3959 0.4344 0.3391 0.3855 0.4076 0.3916 0.3857 0.3908 0.3469 0.3142 0.3207 0.3381 0.3184 0.2712 0.3118 0.3603
Equity Multiplier nan 2.9215 2.8742 3.097 3.1564 3.1447 3.3559 3.437 3.1966 2.9905 2.9807 3.0157 2.6937 2.6544 3.0678 3.1254 3.0186 3.1557
Return on Equity nan 0.1551 0.1516 0.1632 0.1364 0.1782 0.2123 0.2128 0.1911 0.1778 0.1723 0.1467 0.4142 0.2424 0.2726 0.2214 0.2842 0.3189

It isn't too difficult to then plot a metric like Return on Equity (RoE) for all companies if you want to delve deeper. You can locate the rows directly from the DuPont Analysis but it is also possible to call the related function.

companies.ratios.get_return_on_equity().T.plot(
    title='Return on Equity (RoE) for Railroad Companies in the United States',
    figsize=(15, 5))

Which returns:

Return on Equity

Technical Analysis of Biotech ETFs

In this example I will show how you can use the FinanceDatabase to do a technical analysis of Biotech ETFs during the Coronacrisis. Let's find Health Care ETFs that mention something about 'Biotech' in their description. This would indicate they are related to Biotechnology. Find the related Jupyter Notebook with more examples here.

import financedatabase as fd

API_KEY = "YOUR_FMP_API_KEY"

etfs = fd.ETFs()

health_care_etfs_in_biotech = etfs.search(category='Health Care', summary='biotech', exclude_exchanges=True)

Which returns:

symbol name currency category_group category family exchange market
AGNG Global X Aging Population ETF USD Health Care Health Care Global X Funds NMS us_market
BBC Virtus LifeSci Biotech Clinical Trials ETF USD Health Care Health Care Virtus PCX us_market
BBH VanEck Vectors Biotech ETF USD Health Care Health Care VanEck Asset Management NMS us_market
BBP Virtus LifeSci Biotech Products ETF USD Health Care Health Care Virtus PCX us_market
CNCR Loncar Cancer Immunotherapy ETF USD Health Care Health Care Loncar Investments NGM us_market
FBT First Trust NYSE Arca Biotechnology Index Fund USD Health Care Health Care First Trust Advisors PCX us_market
IBB iShares Nasdaq Biotechnology ETF USD Health Care Health Care BlackRock Asset Management NMS us_market
IBBJ Defiance Nasdaq Junior Biotechnology ETF USD Health Care Health Care Defiance ETFs NGM us_market
IBBQ Invesco Nasdaq Biotechnology ETF USD Health Care Health Care Invesco Investment Management NMS us_market
IEIH iShares Evolved U.S. Innovative Healthcare ETF USD Health Care Health Care BlackRock Asset Management BTS us_market
PBE Invesco Dynamic Biotechnology & Genome ETF USD Health Care Health Care Invesco Investment Management PCX us_market
SBIO ALPS Medical Breakthroughs ETF USD Health Care Health Care ALPS ETF Trust PCX us_market
XBI SPDR S&P Biotech ETF USD Health Care Health Care State Street Global Advisors PCX us_market
XLV Health Care Select Sector SPDR Fund USD Health Care Health Care State Street Global Advisors PCX us_market

Next up is initializing the Finance Toolkit and obtaining historical data for the chosen tickers. Here a start and end date are also selected that match the period around the initial wave of the Coronacrisis. Then it's time to collect the historical data for each ETF found.

etfs_in_biotech = health_care_etfs_in_biotech.to_toolkit(api_key=API_KEY, start_date="2020-01-01", end_date="2020-06-01")

etfs_in_biotech.get_historical_data()

Which returns (note that this is a MultiIndex):

Date ('Open', 'AGNG') ('Open', 'BBC') ('Open', 'BBH') ('Open', 'BBP') ('Open', 'CNCR') ('Open', 'FBT') ('Open', 'IBB') ('Open', 'IEIH') ('Open', 'PBE') ('Open', 'SBIO') ('Open', 'XBI') ('Open', 'XLV') ('High', 'AGNG') ('High', 'BBC') ('High', 'BBH') ('High', 'BBP') ('High', 'CNCR') ('High', 'FBT') ('High', 'IBB') ('High', 'IEIH') ('High', 'PBE') ('High', 'SBIO') ('High', 'XBI') ('High', 'XLV') ('Low', 'AGNG') ('Low', 'BBC') ('Low', 'BBH') ('Low', 'BBP') ('Low', 'CNCR') ('Low', 'FBT') ('Low', 'IBB') ('Low', 'IEIH') ('Low', 'PBE') ('Low', 'SBIO') ('Low', 'XBI') ('Low', 'XLV') ('Close', 'AGNG') ('Close', 'BBC') ('Close', 'BBH') ('Close', 'BBP') ('Close', 'CNCR') ('Close', 'FBT') ('Close', 'IBB') ('Close', 'IEIH') ('Close', 'PBE') ('Close', 'SBIO') ('Close', 'XBI') ('Close', 'XLV') ('Adj Close', 'AGNG') ('Adj Close', 'BBC') ('Adj Close', 'BBH') ('Adj Close', 'BBP') ('Adj Close', 'CNCR') ('Adj Close', 'FBT') ('Adj Close', 'IBB') ('Adj Close', 'IEIH') ('Adj Close', 'PBE') ('Adj Close', 'SBIO') ('Adj Close', 'XBI') ('Adj Close', 'XLV') ('Volume', 'AGNG') ('Volume', 'BBC') ('Volume', 'BBH') ('Volume', 'BBP') ('Volume', 'CNCR') ('Volume', 'FBT') ('Volume', 'IBB') ('Volume', 'IEIH') ('Volume', 'PBE') ('Volume', 'SBIO') ('Volume', 'XBI') ('Volume', 'XLV') ('Dividends', 'AGNG') ('Dividends', 'BBC') ('Dividends', 'BBH') ('Dividends', 'BBP') ('Dividends', 'CNCR') ('Dividends', 'FBT') ('Dividends', 'IBB') ('Dividends', 'IEIH') ('Dividends', 'PBE') ('Dividends', 'SBIO') ('Dividends', 'XBI') ('Dividends', 'XLV') ('Return', 'AGNG') ('Return', 'BBC') ('Return', 'BBH') ('Return', 'BBP') ('Return', 'CNCR') ('Return', 'FBT') ('Return', 'IBB') ('Return', 'IEIH') ('Return', 'PBE') ('Return', 'SBIO') ('Return', 'XBI') ('Return', 'XLV') ('Volatility', 'AGNG') ('Volatility', 'BBC') ('Volatility', 'BBH') ('Volatility', 'BBP') ('Volatility', 'CNCR') ('Volatility', 'FBT') ('Volatility', 'IBB') ('Volatility', 'IEIH') ('Volatility', 'PBE') ('Volatility', 'SBIO') ('Volatility', 'XBI') ('Volatility', 'XLV') ('Excess Return', 'AGNG') ('Excess Return', 'BBC') ('Excess Return', 'BBH') ('Excess Return', 'BBP') ('Excess Return', 'CNCR') ('Excess Return', 'FBT') ('Excess Return', 'IBB') ('Excess Return', 'IEIH') ('Excess Return', 'PBE') ('Excess Return', 'SBIO') ('Excess Return', 'XBI') ('Excess Return', 'XLV') ('Excess Volatility', 'AGNG') ('Excess Volatility', 'BBC') ('Excess Volatility', 'BBH') ('Excess Volatility', 'BBP') ('Excess Volatility', 'CNCR') ('Excess Volatility', 'FBT') ('Excess Volatility', 'IBB') ('Excess Volatility', 'IEIH') ('Excess Volatility', 'PBE') ('Excess Volatility', 'SBIO') ('Excess Volatility', 'XBI') ('Excess Volatility', 'XLV') ('Cumulative Return', 'AGNG') ('Cumulative Return', 'BBC') ('Cumulative Return', 'BBH') ('Cumulative Return', 'BBP') ('Cumulative Return', 'CNCR') ('Cumulative Return', 'FBT') ('Cumulative Return', 'IBB') ('Cumulative Return', 'IEIH') ('Cumulative Return', 'PBE') ('Cumulative Return', 'SBIO') ('Cumulative Return', 'XBI') ('Cumulative Return', 'XLV')
2020-01-02 23.59 38.47 140.44 44.18 23.62 149.6 121.3 27.7942 56.27 42.79 95.82 102.17 23.74 38.47 140.44 44.18 23.62 149.6 121.75 27.948 56.27 42.79 96.03 102.29 23.56 37.01 138.96 42.85 23.17 147.14 118.94 27.7942 55.33 41.32 93.73 101.4 23.665 37.413 139.62 43.171 23.459 148.22 119.89 27.948 55.84 41.62 94.68 102.13 23.1607 37.413 138.222 43.171 21.6018 146.208 118.894 27.948 55.7882 41.62 94.4506 96.6373 2400 65300 15100 2900 5000 324900 2.8444e 06 2927 5400 94400 3.5886e 06 6.2774e 06 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.0243617 0.0355917 0.0250125 0.0301117 0.0336436 0.025867 0.0272492 0.0228432 0.0279196 0.0361503 0.032811 0.0268018 -0.0143432 -0.0356187 -0.0173654 -0.0270471 -0.0179894 -0.022162 -0.0239449 -0.019122 -0.018979 -0.0344102 -0.0233211 -0.0161495 0.0248774 0.0360896 0.0256092 0.0305088 0.0341735 0.0264006 0.0277755 0.0234134 0.0284401 0.0365299 0.0332703 0.0273135 1 1 1 1 1 1 1 1 1 1 1 1
2020-01-03 23.41 36.9 137.24 42.88 23.11 145.9 118.2 27.74 55.23 41.01 93.21 100.95 23.62 37.24 138.81 42.88 23.43 147.33 119.14 27.7626 55.63 41.5 94.18 101.82 23.18 34.6 137.24 42.714 23.11 145.29 117.77 27.6172 55.15 40.68 92.7 100.45 23.555 36.84 138 42.714 23.196 146.3 118.36 27.7255 55.42 40.96 93.36 101.24 23.053 36.84 136.618 42.714 21.3596 144.314 117.376 27.7255 55.3686 40.96 93.1338 95.7952 23700 107800 26900 400 7600 175100 5.4809e 06 1937 12400 91000 5.1106e 06 8.2475e 06 0 0 0 0 0 0 0 0 0 0 0 0 -0.00464814 -0.0153155 -0.0116029 -0.0105858 -0.0112111 -0.0129537 -0.0127615 -0.00796121 -0.00752148 -0.0158578 -0.0139417 -0.00871437 0.0243617 0.0355917 0.0250125 0.0301117 0.0336436 0.025867 0.0272492 0.0228432 0.0279196 0.0361503 0.032811 0.0268018 -0.0225481 -0.0332155 -0.0295029 -0.0284858 -0.0291111 -0.0308537 -0.0306615 -0.0258612 -0.0254215 -0.0337578 -0.0318417 -0.0266144 0.0248774 0.0360896 0.0256092 0.0305088 0.0341735 0.0264006 0.0277755 0.0234134 0.0284401 0.0365299 0.0332703 0.0273135 0.995352 0.984685 0.988397 0.989414 0.988789 0.987046 0.987238 0.992039 0.992479 0.984142 0.986058 0.991286
2020-01-06 23.242 36.57 137.05 42.3 23.1 145.47 117.69 27.76 55.26 40.54 92.76 100.78 23.61 36.81 139.32 43.025 23.45 147.89 119.18 27.8415 55.38 40.992 94.21 101.9 23.242 35.72 137.05 42.07 22.94 144.9 116.95 27.76 54.86 40.04 91.83 100.75 23.565 36.77 139.29 43.025 23.45 147.89 119.12 27.8415 55.38 40.99 94.17 101.87 23.0628 36.77 137.896 43.025 21.5935 145.882 118.13 27.8415 55.3286 40.99 93.9419 96.3913 1800 35300 15700 5100 10600 92600 2.1991e 06 248 8100 89100 3.3645e 06 6.4418e 06 0 0 0 0 0 0 0 0 0 0 0 0 0.000424587 -0.00190011 0.0093477 0.00728101 0.0109503 0.010868 0.00642103 0.00418384 -0.000721745 0.000732495 0.00867616 0.00622281 0.0243617 0.0355917 0.0250125 0.0301117 0.0336436 0.025867 0.0272492 0.0228432 0.0279196 0.0361503 0.032811 0.0268018 -0.0176754 -0.0200001 -0.0087523 -0.010819 -0.00714974 -0.00723197 -0.011679 -0.0139162 -0.0188217 -0.0173675 -0.00942384 -0.0118772 0.0248774 0.0360896 0.0256092 0.0305088 0.0341735 0.0264006 0.0277755 0.0234134 0.0284401 0.0365299 0.0332703 0.0273135 0.995774 0.982814 0.997636 0.996618 0.999616 0.997774 0.993578 0.996189 0.991762 0.984863 0.994613 0.997454
2020-01-07 23.69 36.85 138.87 42.796 23.51 147.76 119.16 27.8 55.2 41.29 94.49 101.59 23.81 37.29 139.69 43.142 23.661 148.6 119.64 27.85 55.2 41.362 94.73 101.76 23.64 36.44 138.86 42.585 23.34 146.72 117.96 27.8 54.95 40.31 92.98 101.1 23.651 37.068 139.42 43.142 23.632 148.37 119.15 27.8193 55.02 41.12 94.32 101.67 23.147 37.068 138.024 43.142 21.7611 146.356 118.16 27.8193 54.969 41.12 94.0915 96.202 10600 27200 7400 2500 26900 93100 1.7184e 06 2070 3400 61700 3.9548e 06 6.3353e 06 0 0 0 0 0 0 0 0 0 0 0 0 0.00364951 0.00810446 0.000933265 0.00271926 0.00776119 0.00324564 0.000251689 -0.000797335 -0.00650052 0.00317143 0.00159277 -0.00196339 0.0243617 0.0355917 0.0250125 0.0301117 0.0336436 0.025867 0.0272492 0.0228432 0.0279196 0.0361503 0.032811 0.0268018 -0.0146505 -0.0101955 -0.0173667 -0.0155807 -0.0105388 -0.0150544 -0.0180483 -0.0190973 -0.0248005 -0.0151286 -0.0167072 -0.0202634 0.0248774 0.0360896 0.0256092 0.0305088 0.0341735 0.0264006 0.0277755 0.0234134 0.0284401 0.0365299 0.0332703 0.0273135 0.999409 0.990779 0.998567 0.999328 1.00737 1.00101 0.993828 0.995395 0.985315 0.987987 0.996198 0.995496
2020-01-08 23.51 36.84 139.01 43.27 23.66 148.24 119.07 28.0052 54.83 41.17 94.23 101.72 23.823 37.431 141.01 43.937 24.19 150.56 120.88 28.0052 55.25 41.85 95.99 102.79 23.51 36.69 139.01 43.27 23.66 148.24 118.86 28.0052 54.83 40.951 93.89 101.68 23.763 37.43 140.12 43.818 24.11 150.07 120.22 28.0052 55.07 41.68 95.61 102.33 23.2566 37.43 138.717 43.818 22.2012 148.033 119.221 28.0052 55.0189 41.68 95.3784 96.8266 2200 87200 23000 2100 23400 66600 3.3882e 06 230 12000 49300 3.0882e 06 7.4947e 06 0 0 0 0 0 0 0 0 0 0 0 0 0.00473552 0.00976581 0.00502081 0.0156693 0.0202269 0.011458 0.00898025 0.00668238 0.000908676 0.0136187 0.0136769 0.00649166 0.0243617 0.0355917 0.0250125 0.0301117 0.0336436 0.025867 0.0272492 0.0228432 0.0279196 0.0361503 0.032811 0.0268018 -0.0139645 -0.00893419 -0.0136792 -0.00303074 0.00152691 -0.00724201 -0.00971975 -0.0120176 -0.0177913 -0.0050813 -0.00502309 -0.0122083 0.0248774 0.0360896 0.0256092 0.0305088 0.0341735 0.0264006 0.0277755 0.0234134 0.0284401 0.0365299 0.0332703 0.0273135 1.00414 1.00045 1.00358 1.01499 1.02775 1.01248 1.00275 1.00205 0.986211 1.00144 1.00982 1.00196

Then, let's calculate the Bollinger Bands for each ETF.

bollinger_bands = etfs_in_biotech.technicals.get_bollinger_bands()

Which returns (note that this is a MultiIndex):

Date ('Close', 'AGNG') ('Close', 'BBC') ('Close', 'BBH') ('Close', 'BBP') ('Close', 'CNCR') ('Close', 'FBT') ('Close', 'IBB') ('Close', 'IEIH') ('Close', 'PBE') ('Close', 'SBIO') ('Close', 'XBI') ('Close', 'XLV') ('Lower Band', 'AGNG') ('Lower Band', 'BBC') ('Lower Band', 'BBH') ('Lower Band', 'BBP') ('Lower Band', 'CNCR') ('Lower Band', 'FBT') ('Lower Band', 'IBB') ('Lower Band', 'IEIH') ('Lower Band', 'PBE') ('Lower Band', 'SBIO') ('Lower Band', 'XBI') ('Lower Band', 'XLV') ('Middle Band', 'AGNG') ('Middle Band', 'BBC') ('Middle Band', 'BBH') ('Middle Band', 'BBP') ('Middle Band', 'CNCR') ('Middle Band', 'FBT') ('Middle Band', 'IBB') ('Middle Band', 'IEIH') ('Middle Band', 'PBE') ('Middle Band', 'SBIO') ('Middle Band', 'XBI') ('Middle Band', 'XLV') ('Upper Band', 'AGNG') ('Upper Band', 'BBC') ('Upper Band', 'BBH') ('Upper Band', 'BBP') ('Upper Band', 'CNCR') ('Upper Band', 'FBT') ('Upper Band', 'IBB') ('Upper Band', 'IEIH') ('Upper Band', 'PBE') ('Upper Band', 'SBIO') ('Upper Band', 'XBI') ('Upper Band', 'XLV')
2020-01-02 23.1607 37.413 138.222 43.171 21.6018 146.208 118.894 27.948 55.7882 41.62 94.4506 96.6373 22.8653 35.44 136.692 42.8394 20.9387 144.953 118.097 27.6492 55.2137 41.6414 93.6136 94.3335 23.1337 37.7297 139.265 43.9656 21.7711 148.507 120.299 28.0172 55.988 42.7784 95.9705 96.0125 23.4021 40.0195 141.837 45.0918 22.6036 152.06 122.502 28.3852 56.7623 43.9154 98.3274 97.6915
2020-01-03 23.053 36.84 136.619 42.714 21.3596 144.314 117.376 27.7255 55.3686 40.96 93.1338 95.7952 22.9084 35.5338 136.455 42.6106 20.9476 144.258 117.511 27.5954 55.1277 41.156 93.1465 94.6536 23.145 37.7597 139.214 43.9066 21.7739 148.348 120.167 27.989 55.9616 42.6531 95.8665 96.1042 23.3815 39.9857 141.972 45.2026 22.6002 152.439 122.823 28.3826 56.7955 44.1502 98.5864 97.5548
2020-01-06 23.0628 36.77 137.895 43.025 21.5935 145.882 118.13 27.8415 55.3286 40.99 93.9419 96.3913 22.9012 35.679 136.329 42.4918 21.0242 143.947 117.204 27.5757 55.1102 40.7901 92.8938 95.1474 23.1413 37.8004 139.162 43.8646 21.7994 148.23 120.064 27.9694 55.9573 42.5292 95.7817 96.2431 23.3815 39.9219 141.995 45.2374 22.5746 152.512 122.923 28.3632 56.8044 44.2684 98.6695 97.3388
2020-01-07 23.147 37.068 138.024 43.142 21.7611 146.356 118.16 27.8193 54.969 41.12 94.0915 96.202 22.924 35.7637 136.179 42.3802 21.0897 143.686 116.878 27.5851 54.9026 40.5252 92.6191 95.2938 23.1513 37.8291 139.007 43.8016 21.8268 147.994 119.889 27.9727 55.8995 42.4004 95.6228 96.2957 23.3787 39.8946 141.834 45.223 22.5639 152.301 122.901 28.3602 56.8965 44.2756 98.6264 97.2975
2020-01-08 23.2566 37.43 138.717 43.818 22.2012 148.032 119.221 28.0052 55.0189 41.68 95.3784 96.8266 22.9437 35.8584 136.136 42.3848 21.1318 143.658 116.803 27.6124 54.7366 40.4473 92.5768 95.5192 23.1671 37.8677 138.958 43.806 21.8742 147.913 119.835 27.9873 55.8396 42.286 95.5601 96.4002 23.3905 39.877 141.78 45.2272 22.6166 152.167 122.867 28.3621 56.9425 44.1247 98.5433 97.2811

Then, it's time to visually depict the Bollinger Bands for each ETF during the early stages of the Coronacrisis.

from matplotlib import pyplot as plt

figure, axis = plt.subplots(4, 3)
figure.set_size_inches(15, 10)
row = 0
column = 0

for ticker in bollinger_bands.columns.get_level_values(1).unique():
    name = health_care_etfs_in_biotech.loc[health_care_etfs_in_biotech.index == ticker, 'name'].iloc[0]
    
    bollinger_bands.xs(ticker, level=1, axis=1).plot(
        ax=axis[row, column],
        xlabel='',
        title=name,
        legend=False
        )

    column  = 1
    if column == 3:
        row  = 1
        column = 0
        
figure.suptitle('Technical Analysis of Biotech ETFs during the Coronacrisis', fontweight='bold')

figure.tight_layout()

This leads to the following graph which gives an indication of whether Biotech ETFs were oversold or overbought and how this effect is neutralised (to some degree) in the months after. Read more about the Bollinger Bands here.

Coronacrisis

Questions & Answers

In this section you can find answers to commonly asked questions. In case the answer to your question is not here, consider creating an Issue.

  • How is the data obtained?
    • The data is an aggregation of a variety of sources. The rule that I hold with high regard is that all data needs to be entirely publicly available. Any data that requires API key access or requires a paid tier is never included in this database. Data that you are being charged for is often owned and maintained by the company you have a subscription at and therefore publicly sharing this information online is against their Terms of Service (ToS). However, data that is publicly available can freely be shared (read more about this subject here) especially since this database will never cost any money.
  • What categorization method is used?
    • The categorization for Equities is based on a loose approximation of GICS. No actual data is collected from this source and this database merely tries to reflect the sectors and industries as best as possible. This is completely done through manual curation. The actual datasets as curated by MSCI has not been used in the development of any part of this database and remain the most up to date, paid, solution. Other categorizations are entirely developed by the author and can freely be changed.
  • How can I contribute?
  • How can I find out which countries, sectors and/or industries exist within the database without needing to check the database manually?
    • For this you can use the options function from the package attached to this database. Furthermore, it is also possible to use equities = fd.Equities() and then use equities.options(selection='country') or specific further with equities.options(selection='sector', country='United States'). Please see this example
  • When I try collect data I notice that not all tickers return output, why is that?
    • Some tickers are merely holdings of companies and therefore do not really have any data attached to them. Therefore, it makes sense that not all tickers return data. If you are still in doubt, search the ticker on Google to see if there is really no data available. If you can't find anything about the ticker, consider updating the database by visiting the Contributing Guidelines.
  • How does the database handle changes to companies over time - like symbol/exchange migration, mergers, bankruptcies, or symbols getting reused?
    • For the American Exchanges, every Sunday the database automatically updates based on this repository. It also automatically checks if there were any market cap changes and converts assets accordingly. On purpose, most tickers are not removed even after becoming delisted. This is because it can be still of value for research to look into companies that no longer exist. When it comes to further automisation, this is what you usually pay a hefty fee for, think of Bloomberg at over $25.000 a year. Instead of requiring you to pay, this database is meant to be a community-driven project in which you help in identifying these companies. As news about migrations, mergers, bankruptcies and similar occur outside of the American exchanges it is up to the community to identify these and/or users to look into writing scripts that help with this. It is important to note that the vast majority of companies do not change as rapidly that this database becomes irrelevant before it is identified, e.g. a company like Facebook changing to META has already been updated. Furthermore, even though a company goes bankrupt, the old ticker is still relevant when it comes to historical data before the bankruptcy.

User Contributions

This section is meant to thank those that contributed to the project. Looking to contribute as well? Have a look here.

User Contribution
desaijimmy Made changes to Equities dataset including the Split of Daimler to Mercedes-Benz and Daimler Trucks
nindogo Introduced a variety of new equities from the Nairobi Securities Exchange and introduced the country Kenya into the dataset.
colin99d Helped in the conversion of the Finance Database package to Object-Orientated, making the code much more efficient.

Contact

If you have any questions about the FinanceDatabase or would like to share with me what you have been working on, feel free to reach out to me via:

f you'd like to support my efforts, either help me out via the Contributing Guidelines or Buy me a Coffee.

Star History Chart