This is a database of 180.000+ symbols containing Equities, ETFs, Funds, Indices, Futures, Options, Currencies, Cryptocurrencies and Money Markets.

Overview

Finance Database

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 amd 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 180.000+ symbols containing Equities, ETFs, Funds, Indices, Futures, Options, 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 FundamentalAnalysis or yfinance. 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 84.091 16 262 109 79
ETFs 15.892 268* 88* 100** 44
Funds 34.947 857* 416* 100** 25
Product Quantity Exchanges
Indices 24.548 62
Currencies 2.529 2
Cryptocurrencies 3.624 1
Options 13.819 1
Futures 1.173 7
Money Markets 1.384 2

* These numbers refer to families (iShares, Vanguard) and categories (World Stock, Real Estate) respectively.
** This is an estimation. Obtaining the country distribution can only be done by collecting data on the underlying or by manual search.

Usage

To access the database you can download the entire repository, but I strongly recommend making use of the package closely attached to the database. It allows you to select specific json files as well as search through collected data with a specific query.

You can install the package with the following steps:

  1. pip install FinanceDatabase
    • Alternatively, download the 'Searcher' directory.
  2. (within Python) import FinanceDatabase as fd

The package has the following functions:

  • show_options(product, equities_selection=None) - gives all available options from the functions below per product (i.e. Equities, Funds) which then can be used to collect data. You can select a sub selection of equities by entering 'countries', 'sectors' or 'industries' for equities_selection.
  • select_cryptocurrencies(cryptocurrency=None) - with no input gives all cryptocurrencies, with input gives the cryptocurrency of choice.
  • select_currencies(currency=None) - with no input gives all currencies, with input gives the currency of choice.
  • select_etfs(category=None) - with no input gives all etfs, with input gives all etfs of a specific category.
  • select_equities(country=None, sector=None, industry=None) - with no input gives all equities, with input gives all equities of a country, sector, industry or a combination of the three.
  • select_funds(category=None) - with no input gives all funds, with input gives all funds of a specific category.
  • select_indices(market=None) - with no input gives all indices, with input gives all indices of a specific market which usually refers to indices in a specific country (like de_market gives DAX).
  • select_other(product) - gives either all Futures, all Moneymarkets or all Options.
  • search_products(database, query, search='summary', case_sensitive=False, new_database=None) - with input from the above functions, this function searches for specific values (i.e. the query 'sustainable') in one of the keys of the dictionary (which is by default the summary). It also has the option to enable case-sensitive searching which is off by default.

For additional information about each function you can use the build-in help function of Python. For example help(show_options) returns a general description, the possible input parameters and what is returned as output.

For users of the broker DeGiro, you are able to find data on the tickers found in the Commission Free ETFs list by selecting either core_selection_degiro_filled (all data) or core_selection_degiro_filtered (filtered by summary) as category when using the function select_etfs.

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, and it only uses yfinance. As you can obtain a wide range of symbols, pretty much any package that requires symbols should work.

United States' Airlines

If I wish to obtain all companies within the United States listed under 'Airlines' I can write the following code:

import FinanceDatabase as fd

airlines_us = fd.select_equities(country='United States', industry='Airlines')

Then, I can use packages like yfinance to quickly collect data from Yahoo Finance for each symbol in the industry like this:

from yfinance.utils import get_json
from yfinance import download

airlines_us_fundamentals = {}
for symbol in airlines_us:
    airlines_us_fundamentals[symbol] = get_json("https://finance.yahoo.com/quote/" + symbol)

airlines_us_stock_data = download(list(airlines_us))

With a few lines of code, I have collected all data from a specific industry within the United States. From here on you can compare pretty much any key statistic, fundamental- and stock data. For example, let's plot a simple bar chart that gives insights in the Quick Ratios (indicator of the overall financial strength or weakness of a company):

import matplotlib.pyplot as plt

for symbol in airlines_us_fundamentals:
    quick_ratio = airlines_us_fundamentals[symbol]['financialData']['quickRatio']
    long_name = airlines_us_fundamentals[symbol]['quoteType']['longName']

    if quick_ratio is None:
        continue

    plt.barh(long_name, quick_ratio)

plt.tight_layout()
plt.show()

Which results in the graph displayed below (as of the 3rd of February 2021). From this graph you can identify companies that currently lack enough assets to cover their liabilities (quick ratio < 1), and those that do have enough assets (quick ratio > 1). Both too low and too high could make you wonder whether the company adequately manages its assets.

FinanceDatabase

Semiconductors ETFs

If I wish to obtain all ETFs that have something to do with 'semiconductors' I can use the search function which can be used the following way:

import FinanceDatabase as fd

all_etfs = fd.select_etfs()
semiconductor_etfs = fd.search_products(all_etfs, 'semiconductor')

The variable semiconductor_etfs returns all etfs that have the word 'semiconductor' in their summary which usually also corresponds to the fact they are targeted around semiconductors. Next, I collect data:

semiconductor_etfs_fundamentals = {}
for symbol in semiconductor_etfs:
    semiconductor_etfs_fundamentals[symbol] = get_json("https://finance.yahoo.com/quote/" + symbol)

And lastly, I have a look at the YTD returns (as of the 3rd of February 2021) of each ETF to better understand the products that are available (for example levered products or specific bear and bull products):

for symbol in semiconductor_etfs_fundamentals:
    ytd_return = semiconductor_etfs_fundamentals[symbol]['fundPerformance']['trailingReturns']['ytd']
    long_name = semiconductor_etfs_fundamentals[symbol]['quoteType']['longName']

    if ytd_return is None:
        continue

    plt.barh(long_name, ytd_return)

plt.tight_layout()
plt.xticks([-1, -0.5, 0, 0.5, 1], ['-100%', '-50%', '0%', '50%', '100%'])
plt.show()

This results in the following graph which gives some insights in the available semiconductor ETFs. Then with the large amount of fundamentals data you can figure out how each ETF differs and what might be worthwhile to invest in.

FinanceDatabase

Q&A

  • How did you get your data?
  • Is there support for ?
    • Yes, most likely there is as the database includes 109 countries. Please check here.
  • When I collect data via yfinance 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.
  • How frequently does the Database get updated?
    • I aim at doing this every few months. The database does not have to get updated frequently because the data collected is only general information. For example, a Sector name hardly changes and companies do not tend to move to another country every few months. Therefore, the data should stay up to date for several months. I you wish to contribute to updating the database then that is much appreciated. Please check the Methodology for guidance on how.
  • Do your sector and industry names use the same naming convention as GIC sector?
    • Not entirely but very similar, it's based on Yahoo Finance's sectors and industries. See industries and sectors. Perhaps a future adjustment could be to make them aligned with GICS.

Contribution

Projects are bound to have (small) errors and can always be improved. Therefore, I highly encourage you to submit issues and create pull requests to improve the package.

The last update to the database is the 3rd of February 2021. I always accept Pull Requests every few months to keep the database up to date. Extending the amount of tickers and data is also much appreciated.

Comments
  • Error by:  core_selection = fd.select_etfs(

    Error by: core_selection = fd.select_etfs("core_selection_degiro_filtered")

    Hi,

    As I run the code: ... core_selection = fd.select_etfs("core_selection_degiro_filtered") ... I got error as follow: `JSONDecodeError Traceback (most recent call last) ~\anaconda3\lib\site-packages\FinanceDatabase\json_picker.py in select_etfs(category) 105 request = requests.get(json_file) --> 106 json_data = json.loads(request.text) 107 except json.decoder.JSONDecodeError:

    ~\anaconda3\lib\json_init_.py in loads(s, encoding, cls, object_hook, parse_float, parse_int, parse_constant, object_pairs_hook, **kw) 347 parse_constant is None and object_pairs_hook is None and not kw): --> 348 return _default_decoder.decode(s) 349 if cls is None:

    ~\anaconda3\lib\json\decoder.py in decode(self, s, _w) 339 if end != len(s): --> 340 raise JSONDecodeError("Extra data", s, end) 341 return obj

    JSONDecodeError: Extra data: line 1 column 4 (char 3)

    During handling of the above exception, another exception occurred:

    ValueError Traceback (most recent call last) in ----> 1 core_selection = fd.select_etfs("core_selection_degiro_filtered") 2 # core_selection = fd.select_etfs("") 3 # core_selection

    ~\anaconda3\lib\site-packages\FinanceDatabase\json_picker.py in select_etfs(category) 106 json_data = json.loads(request.text) 107 except json.decoder.JSONDecodeError: --> 108 raise ValueError(f"Not able to find any data for {category}.") 109 else: 110 try:

    ValueError: Not able to find any data for core_selection_degiro_filtered.`

    opened by thomas2004ch 6
  • Display Industry set

    Display Industry set

    Hi,

    Thank you very much for this great module, I had been trying to do something similar for some time.

    I have been trying to query your database for the equity data for a specific industry and I have found out that it can be difficult to know which industries are available without looking into the json files at FinanceDatabase/Database/Categories/.

    Have I missed something here and there is already a function to display the industries ?

    If not, do you think that it would be a good idea to add a feature that would list the available industries or other sets of values that are available for the different arguments?

    As a solution, I would consider something that would just read the existing json files and display their contents as set objects.

    Maybe just a summary of the database structure would be ideal as it would encompass everything and seems like the most helpful feature overall.

    Thank you.

    PS: I'm keen to help with the implementation if it helps.

    opened by ProgrammingDao 4
  • Hosting the database .json files locally

    Hosting the database .json files locally

    Describe the solution you'd like The library always reaches out to the Internet to get the database .json files. This is not ideal for performance or for a program that might not have an Internet connection.

    I'd like a way to host the database files on my own local machine or intranet, and specify my own base URL for the .json database files. Perhaps it could be an optional parameter called base_url for the select_ series of methods in FinanceDatabase. I suppose the given base URL would just integrate and override the URLs you have hard-coded in json_picker.py.

    Describe alternatives you've considered Copying the files to my local machine and manually editing json_picker.py to use it.

    enhancement 
    opened by jstesta 3
  • ValueError: Not able to find the options for equities

    ValueError: Not able to find the options for equities

    Describe the bug Was trying to view all available equities, but I am getting a ValueError which follows a JSONDecodeError (see screenshot).

    To Reproduce Steps to reproduce the behavior: ` import FinanceDatabase as fd

    equities = fd.show_options('equities') print(equities) `

    Expected behavior show all available equities

    Screenshots grafik

    Desktop (please complete the following information):

    • OS: OSX El Capitan
    bug 
    opened by ALee008 3
  • some ETF symbols have non-alphabetic characters

    some ETF symbols have non-alphabetic characters

    Describe the bug some ETF symbols have non alphabetic characters

    To Reproduce Steps to reproduce the behavior: ` import financedatabase as fd

    res = fd.select_etfs()

    for k,v in res.items(): if k.isalpha() is False: print(k) `

    Screenshots

    image

    opened by HamidM6 2
  • Industry the company associated with

    Industry the company associated with

    Hi JerBouma,

    Thanks for this wonderful package. Very useful resource indeed. I was wondering is it possible to provide symbol of a company ans fish out the industry/sector that its associated with ? Some companies have mix of products that it woule be listed in two different Industry. It would be useful to get the associated industry given the symbol. Thanks

    opened by rajanprabu 2
  • add domain, state in the Equities

    add domain, state in the Equities

    Is your feature request related to a problem? Please describe. It would be nice to add domain like apple.com and the state: California, and zip code if possible

    enhancement 
    opened by shuaiwang88 2
  • Can't  import the package

    Can't import the package

    Describe the bug

    import FinanceDatabase as fd

    Traceback (most recent call last): File "<pyshell#5>", line 1, in import FinanceDatabase as fd File "C:\Python27\lib\site-packages\FinanceDatabase_init_.py", line 2, in from .json_picker import select_cryptocurrencies File "C:\Python27\lib\site-packages\FinanceDatabase\json_picker.py", line 41 raise ValueError(f"Not able to find any data for {cryptocurrency}.") ^ SyntaxError: invalid syntax

    Using Python 2.7

    Is it possible that json_picker .py has a 400 invalid URL?

    def select_cryptocurrencies(cryptocurrency=None, base_url="https://raw.githubusercontent.com/JerBouma/FinanceDatabase/master/" "Database/Cryptocurrencies/", use_local_location=False, all_cryptocurrencies_json="_Cryptocurrencies"):

    Or is this a me issue? lol

    Thanks!

    opened by medici89 2
  • AttributeError is raised when calling select_etfs() with no parameter given

    AttributeError is raised when calling select_etfs() with no parameter given

    Describe the bug AttributeError is raised when calling select_etfs() with no parameter given.

    Expected behavior Method returns all ETFs.

    Actual behavior The following error is raised:

    Traceback (most recent call last): File "..snip..\lib\site-packages\FinanceDatabase\json_picker.py", line 113, in select_etfs json_data = json.loads(request.text).decode("UTF-8") AttributeError: 'dict' object has no attribute 'decode'

    Additional context Version 0.1.9

    bug 
    opened by jstesta 2
  • No module named 'requests'

    No module named 'requests'

    After pip installing FinanceDatabase I attempt to import it in my python file, but I get this error: Traceback (most recent call last): File "/Users/usrname/PycharmProjects/stockScreener/main.py", line 1, in import FinanceDatabase as fd File "/Users/usrname/.virtualenvs/stockScreener/lib/python3.8/site-packages/FinanceDatabase/init.py", line 2, in from .json_picker import select_cryptocurrencies File "/Users/usrname/.virtualenvs/stockScreener/lib/python3.8/site-packages/FinanceDatabase/json_picker.py", line 1, in import requests ModuleNotFoundError: No module named 'requests'

    opened by kuba-wolf 2
  • industry field anomalies

    industry field anomalies

    https://github.com/JerBouma/FinanceDatabase/raw/master/Database/Equities/Countries/United%20States/United%20States.json

    "industry" field contains the following anomaly:

    
    "Banks\u2014Diversified",
    "Banks\u2014Regional",
    "Beverages\u2014Brewers",
    "Beverages\u2014Non-Alcoholic",
    "Beverages\u2014Wineries & Distilleries",
    
    "Drug Manufacturers\u2014General",
    "Drug Manufacturers\u2014Specialty & Generic",
    "Insurance\u2014Diversified",
    "Insurance\u2014Life",
    "Insurance\u2014Property & Casualty",
    "Insurance\u2014Reinsurance",
    "Insurance\u2014Specialty",
    "Real Estate\u2014Development",
    "Real Estate\u2014Diversified",
    
    

    these could use some normalization "Aerospace & Defense", "Aerospace/Defense - Major Diversified", "Aerospace/Defense Products & Services",

    It's a lot faster to work on offline database, cheers!

    opened by mrx23dot 2
  • Download ETF data by countries

    Download ETF data by countries

    Just an expectation for enhancement. I am currently working on analyzing ETFs issued in North America region (roughly America). While it is possible to download these data via selenium, I wish you could add another country option in the function "select_etfs" as well as the function "select_equities". I would appreciate it if you could consider this.

    opened by Soga-no-Tojiko 0
  • add product names

    add product names

    Here is an example where we extract products from summary field. Uses NLP to detect nouns, matches nouns to a product database. Requires some work to build up the DB, I added most common 3K items.

    Company description can be scraped from different places to have wide range of products. After we have products we can easily find precise competitors.

    Extracted products for MSFT ['console', 'server', 'software', 'tablet', 'window', 'windows', 'xbox'] Post filtering can be added.

    If anyone has time please pick this up. Install instruction on top. Would make sense to start with SP500, nasdaq, then rest of the symbols. products.zip

    enhancement 
    opened by mrx23dot 2
Releases(1.0.0)
Owner
Jeroen Bouma
With a MSc in Quantitative Finance and a Bachelor of Economics (BEc), my ambition is to continuously improve in the fields of Programming and Quant Finance
Jeroen Bouma
Standalone PyQGIS application for executing custom scripts without a QGIS GUI.

PyQGIS Standalone Script Executer Standalone PyQGIS application that is able to run a custom script, in this case Proximity.py without the need of a G

6 Sep 23, 2022
Team Curie is a group of people working together to achieve a common aim

Team Curie is a group of people working together to achieve a common aim. We are enthusiasts!.... We are setting the pace!.... We offer encouragement and motivation....And we believe TeamWork makes t

4 Aug 07, 2021
Agora-token-helper - Some help tools for AgoraToken

Agora Token Helper Support AgoraToken version 001 - 006. But for security reason

Tools I'm building in order to help my investments decisions

b3-tools Tools I'm building in order to help my investments decisions. Based in the REITs I've in my personal portifolio I ran a script that scrapy th

Rafael Cassau 2 Jan 21, 2022
pythonOS: An operating system kernel made in python and assembly

pythonOS An operating system kernel made in python and assembly Wait what? It uses a custom compiler called snek that implements a part of python3.9 (

Abbix 69 Dec 23, 2022
Repls goes to sleep due to inactivity, but to keep it awake, simply host a webserver and ping it.

Repls goes to sleep due to inactivity, but to keep it awake, simply host a webserver and ping it. This repo will help you make a webserver with a bit of console controls.

2 Mar 01, 2022
Gerador de dafaces

🎴 DefaceGenerator Obs: esse script foi criado com a intenção de ajudar pessoas iniciantes no hacking que ainda não conseguem criar suas próprias defa

LordShinigami 3 Jan 09, 2022
Edorado93 - Unraveling a Rockstar! -- Too much? Fine, Unraveling a humble programmer then?

Hi, I'm Sachin Malhotra ( ⛄ 💻 🎃 🍺 ) Let me set the records straight. Roger Federer is the GOAT and I will not hear otherwise! Now that we have that

Sachin Malhotra 7 Dec 25, 2022
a really simple bot that send you memes from reddit to whatsapp

a really simple bot that send you memes from reddit to whatsapp want to use use it? install the dependencies with pip3 install -r requirements.txt the

pai 10 Nov 28, 2021
Hera is a Python framework for constructing and submitting Argo Workflows.

Hera is an Argo Workflows Python SDK. Hera aims to make workflow construction and submission easy and accessible to everyone! Hera abstracts away workflow setup details while still maintaining a cons

argoproj-labs 241 Jan 02, 2023
Project5 Data processing system

Project5-Data-processing-system User just needed to copy both these file to a folder and open Project5.py using cmd or using any python ide. It is to

1 Nov 23, 2021
Set up a sidechain for the XRPL quickly and easily

Sidechain Launch Kit Introduction This directory contains python scripts to tests and explore side chains. This document walks through the steps to se

Xpring Engineering 15 Dec 08, 2022
🐍 This snake helps you reconnect the Web, with RSS feeds!

This snake helps you reconnect the Web, with RSS feeds! RSSerpent is an open-source software that create RSS feeds for websites that do not provide an

211 Dec 08, 2022
Rename and categorize your DMOJ solutions

DMOJ Downloader What is this for? DMOJ lets you download the code for all your solutions, however the files are just named as numbers

Evan Wild 1 Dec 04, 2022
A git extension for seeing your Cloud Build deployment

A git extension for seeing your Cloud Build deployment

Katie McLaughlin 13 May 10, 2022
Export transactions for an algorand wallet to a CSV file

algorand_txn_csv_exporter - (Algorand transaction CSV exporter) This script will export transactions for an algorand wallet to a CSV file. It is inten

TeneoPython01 5 Jun 19, 2022
MatroSka Mod Compiler for ts4scripts

MMC Current Version: 0.2 MatroSka Mod Compiler for .ts4script files Requirements Have Python 3.7 installed and set as default. Running from Source pip

MatroSka 1 Dec 13, 2021
Web interface for browsing, search and filtering recent arxiv submissions

Web interface for browsing, search and filtering recent arxiv submissions

Andrej 4.8k Jan 08, 2023
Library for Memory Trace Statistics in Python

Memory Search Library for Memory Trace Statistics in Python The library uses tracemalloc as a core module, which is why it is only available for Pytho

Memory Search 1 Dec 20, 2021
Superset custom path for python

It is a common requirement to have superset running under a base url, (https://mydomain.at/analytics/ instead of https://mydomain.at/). I created the

9 Dec 14, 2022