11

I remember having seen that somewhere, I can't find it any more. Anyone knows how can I get all the list of stocks on Yahoo finance.

Or even all american stocks, maybe Russell 1000/2000/3000...

Charbel
  • 233
  • 1
  • 2
  • 6

10 Answers10

11

BATS has a nice downloadable file: http://batstrading.com/market_data/listed_symbols/

There's a CS and XML. They have 7,000 stocks in that list. Good stocks, not OTC.

Allen Maxwell
  • 171
  • 1
  • 3
  • that's a cool one, it doesn't have non US, or I couldn't find non-us. But I still accepted the answer since I only mentioned Russell index. Anything similar for the rest of the world? (UK, Australia ...) – Charbel May 25 '16 at 15:38
  • No that I've found. US Markets have the best data sources due to popularity. – Allen Maxwell May 26 '16 at 21:30
  • 3
    After downloading the csv I only have 359 symbols though – hipoglucido May 04 '20 at 17:42
8

For American stocks: if you are using Python 3, you can first, from a terminal, do

pip install get-all-tickers

then

from get_all_tickers import get_tickers as gt

list_of_tickers = gt.get_tickers()
# or if you want to save them to a CSV file
get.save_tickers()

Alternatively, you can clone the file from https://github.com/shilewenuw/get_all_tickers/blob/master/get_all_tickers/tickers.csv

Shile Wen
  • 101
  • 2
  • 4
4

You can get a list of tickers for free using Finnhub's API.

You just need to request a free API key.

Check out the following documentation: https://finnhub.io/docs/api#stock-symbols

#pip install finnhub-python
import pandas as pd
import finnhub

#list of available exchanges

df=pd.read_html("https://docs.google.com/spreadsheets/d/1I3pBxjfXB056-g_JYf_6o3Rns3BV2kMGG1nCatb91ls/edit#gid=0") df1=df[0] exc=df1.loc[:,"A"].dropna()

exclist=[] for i in exc: exclist.append(str(i)) exclist=exclist[1:] #take out "name" from the list

#retrieve tickers from every exchange available tickers=[] finnhub_client = finnhub.Client(api_key="c46qn9iad3iagvmhdk7g") for exchange in exclist: listofdicts=finnhub_client.stock_symbols(exchange) for dicts in listofdicts: tickers.append(dicts['symbol'])

print("You just got a list of %s tickers worldwide." % len(tickers), tickers)

1

Yahoo Closed its API, we are also downloading manually all the symbols for our use. Also we are sharing it wil all on https://github.com/stockdatalab/YAHOO-FINANCE-SCREENER-SYMBOLS-AND-HISTORICAL-DATA. you can download from above link.

Google Yahoo both not providing symbol list any more also Google providing historical data only for one year of any company.

1

You can try this - it pulls down 400000 tickers. https://github.com/mlapenna7/yh_symbol_universe

0

YQL seems to fail at queries with like '%AM%' and also there is no other way to get list of all stock symbols. but i think this can do the trick..

select * from yahoo.finance.industry where id in (1,2,3....260)

this will give you list of companies and there symbols. start with select * from yahoo.finance.industry where id in (112) and see if it works.

Waqas Memon
  • 101
  • 1
0

For common equities, you the find the list in here.

There are 69k stocks from 49 exchanges.

Also, these tickers comply with Yahoo Finance's standard.

Desmond830
  • 86
  • 2
0

Here is the code to scrape all symbols present in that yahoo-finance screener. You can simply create a screener here

I have modified the code a little bit because yahoo-finance was returning an empty 404 response when working with the python requests module. Similar to this issue / solution

Here is the complete working code.

import requests
import json
import time

Modify BASE_URL accordingly

BASE_URL = "https://finance.yahoo.com/screener/unsaved/79fce2f7-82fe-49ec-8098-88add84138ec?dependentField=sector&dependentValues=&offset=OFFSET&count=COUNT"

cnt = 100 offset = 0 flag = 1 temp = 10 name_to_symbol = [] total = 0

while flag > 0: url = BASE_URL.replace("OFFSET", str(offset)) url = url.replace("COUNT",str(cnt)) offset += cnt

response = requests.get(url, headers={'User-Agent': 'Custom'})
s = str(response.text)
jsonArrayStart = s.find('"results":{"rows"') + 18
jsonArrayEnd = jsonArrayStart + 1

while s[jsonArrayEnd] != ']':
    jsonArrayEnd += 1

jsonArrayString = s[jsonArrayStart: jsonArrayEnd+1]
jsonArray = json.loads(jsonArrayString)
if len(jsonArray) != cnt:
    flag = 0

total += len(jsonArray)
for obj in jsonArray:
    if 'longName' in obj:
        name_to_symbol.append([obj['symbol'], obj['longName']])
    elif 'shortName' in obj:
        name_to_symbol.append([obj['symbol'], obj['shortName']])
    else:
        name_to_symbol.append([obj['symbol'], obj['symbol']])
time.sleep(10)

name_to_symbol

P.S - Sorry for the late response. Also, I have rejected all the edits as they were irrelevant and I have fixed the code now. In future I would recommend commenting on the post instead of suggesting an improper edit

HTH

  • Thanks for the solution. It was working earlier but it now throws an error. Can you please fix it. I checked the json it returns now is not valid anymore. – utara007 Feb 18 '22 at 16:00
0

Here's the best link i've found

Best Link I've Found