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:
Before installation, consider starring the project on GitHub which helps others find the project as well.
To install the FinanceDatabase it simply requires the following:
pip install financedatabase -U
Then within Python use:
import financedatabase as fd
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.
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.
Please see the Jupyter Notebook for an elaborate explanation of each asset class. This includes Equities, ETFs, Funds, Indices, Currencies, Cryptocurrencies and Money Markets.
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 |
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 |
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)
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.
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.
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:
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.
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?
- Please see the Contributing Guidelines. Thank you!
- 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 useequities = fd.Equities()
and then useequities.options(selection='country')
or specific further withequities.options(selection='sector', country='United States')
. Please see this example
- For this you can use the
- 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.
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. |
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:
- Website: https://jeroenbouma.com/
- Twitter: https://twitter.com/JerBouma
- LinkedIn: https://www.linkedin.com/in/boumajeroen/
- Email: jer.bouma@gmail.com
- Discord: add me on Discord
JerBouma
f you'd like to support my efforts, either help me out via the Contributing Guidelines or Buy me a Coffee.