Я'бесконечно гуглил в поисках метода получения полного (и ежедневно обновляемого) списка всех символов тикеров Yahoo, доступных через http://finance.yahoo.com.
Yahoo имеет информацию по акциям, фьючерсам и т.д. для многих бирж по всему миру, и я хотел бы получить объединенный список всех тикерных символов, доступных через них. Я пробовал использовать YQL, но у них есть ограничение "where symbol = (or in)", поэтому я не могу выбрать * из символов.
В общем, получить подробную информацию по одному или нескольким символам за один раз легко, но я не могу найти, как получить список всех доступных тикеров.
Кто-нибудь может помочь, пожалуйста?
У меня была похожая проблема. yahoo не предлагает ее, но вы можете получить ее, просмотрев document.write statements на nyse.com's list и найдя .js файл, где они просто случайно хранят список компаний, начинающихся на заданную букву, как литерал массива js. вы также можете получить хорошие аккуратные csv файлы с nasdaq.com здесь: http://www.nasdaq.com/screening/companies-by-name.aspx?letter=0&exchange=nasdaq&render=download (замените exchange=nasdaq на exchange=nyse для символов nyse).
Мне удалось сделать нечто подобное, используя этот URL:
Он загружает полный список символов акций, используя Yahoo YQL API, включая название акции, символ акции и идентификатор отрасли. Что в нем, похоже, отсутствует, так это модификаторы символов акций. Например, для Rogers Communications Inc он загружает только RCI, а не RCI-A.TO, RCI-B.TO и т.д. Я пока не нашел источника этой информации - если кто-то знает способ автоматизировать загрузку этой информации, я хотел бы услышать это. Кроме того, было бы неплохо найти способ загрузить какую-то связь между символом акции и биржей, на которой она торгуется, поскольку некоторые акции торгуются на нескольких биржах, или, может быть, я хочу посмотреть только акции на TSX или что-то еще.
Списки акций NASDAQ ftp://ftp.nasdaqtrader.com/symboldirectory
Два файла nasdaqlisted.txt и otherlisted.txt разделены трубкой. Это должно дать вам хороший список всех акций.
Возможно, я смогу помочь со списком тикерных символов для (американских и неамериканских) акций и ETF.
Yahoo предоставляет календарь доходов, в котором перечислены все акции, объявившие о доходах в данный день. о доходах на определенный день. Сюда входят и неамериканские акции.
Например, вот сегодняшний: http://biz.yahoo.com/research/earncal/20120710.html.
Последняя часть URL - это дата (в формате YYYYMMDD), для которой вам нужен Календарь заработков. Вы можете просмотреть несколько дней и найти символы всех акций, которые сообщили о доходах в эти дни.
Нет никакой гарантии, что yahoo имеет данные по всем акциям, которые сообщают о доходах, тем более что некоторые акции больше не существуют (банкротство, приобретение и т.д.), но это, вероятно, достойная отправная точка.
Если вы знакомы с R
, вы можете использовать программу
пакет qmao, чтобы сделать это.
(См. этот пост)
если у вас возникнут проблемы с его установкой.
ec <- getEarningsCalendar(from="2011-01-01", to="2012-07-01") #this may take a while
s <- unique(ec$Symbol)
length(s)
#[1] 12223
head(s, 20) #look at the first 20 Symbols
# [1] "CVGW" "ANGO" "CAMP" "LNDC" "MOS" "NEOG" "SONC"
# [8] "TISI" "SHLM" "FDO" "FC" "JPST.PK" "RECN" "RELL"
#[15] "RT" "UNF" "WOR" "WSCI" "ZEP" "AEHR"
Сюда не входят ETF, фьючерсы, опционы, облигации, форекс или взаимные фонды.
Вы можете получить список ETF от yahoo здесь: http://finance.yahoo.com/etf/browser/mkt. Здесь показаны только первые 20. Вам нужен URL-адрес ссылки "Показать все" внизу страницы. внизу этой страницы. Вы можете соскоблить страницу, чтобы узнать, сколько ETF, а затем построить URL.
L <- readLines("http://finance.yahoo.com/etf/browser/mkt")
# Sorry for the ugly regex
n <- gsub("^(\\w+)\\s?(.*)$", "\\1",
gsub("(.*)(Showing 1 - 20 of )(.*)", "\\3",
L[grep("Showing 1 - 20", L)]))
URL <- paste0("http://finance.yahoo.com/etf/browser/mkt?c=0&k=5&f=0&o=d&cs=1&ce=", n)
#http://finance.yahoo.com/etf/browser/mkt?c=0&k=5&f=0&o=d&cs=1&ce=1442
Теперь вы можете извлечь тикеры из таблицы на этой странице
library(XML)
tbl <- readHTMLTable(URL, stringsAsFactors=FALSE)
dat <- tbl[[tail(grep("Ticker", tbl), 1)]][-1, ]
colnames(dat) <- dat[1, ]
dat <- dat[-1, ]
etfs <- dat$Ticker # All ETF tickers from yahoo
length(etfs)
#[1] 1442
head(etfs)
#[1] "DGAZ" "TAGS" "GASX" "KOLD" "DWTI" "RTSA"
Вот и вся помощь, которую я могу предложить, но вы можете сделать что-то подобное, чтобы получить некоторые из предлагаемых ими фьючерсов, соскабливая эти страницы (Это только американские фьючерсы)
http://finance.yahoo.com/indices?e=futures, http://finance.yahoo.com/futures?t=energy, http://finance.yahoo.com/futures?t=metals, http://finance.yahoo.com/futures?t=grains, http://finance.yahoo.com/futures?t=livestock, http://finance.yahoo.com/futures?t=softs, http://finance.yahoo.com/futures?t=indices,
А для американских и неамериканских индексов вы можете найти следующие страницы
http://finance.yahoo.com/intlindices?e=americas, http://finance.yahoo.com/intlindices?e=asia, http://finance.yahoo.com/intlindices?e=europe, http://finance.yahoo.com/intlindices?e=africa, http://finance.yahoo.com/indices?e=dow_jones, http://finance.yahoo.com/indices?e=new_york, http://finance.yahoo.com/indices?e=nasdaq, http://finance.yahoo.com/indices?e=sp, http://finance.yahoo.com/indices?e=other, http://finance.yahoo.com/indices?e=treasury, http://finance.yahoo.com/indices?e=commodities
На сайте http://code.google.com/p/yahoo-finance-managed/ есть хорошая обертка C# для Yahoo.Finance API, которая поможет вам в этом. К сожалению, нет прямого способа загрузить список тикеров, но следующий способ создает список путем итерации по алфавитным группам:
AlphabeticIDIndexDownload dl1 = new AlphabeticIDIndexDownload();
dl1.Settings.TopIndex = null;
Response<AlphabeticIDIndexResult> resp1 = dl1.Download();
writeStream.WriteLine("Id|Isin|Name|Exchange|Type|Industry");
foreach (var alphabeticalIndex in resp1.Result.Items)
{
AlphabeticalTopIndex topIndex = (AlphabeticalTopIndex) alphabeticalIndex;
dl1.Settings.TopIndex = topIndex;
Response<AlphabeticIDIndexResult> resp2 = dl1.Download();
foreach (var index in resp2.Result.Items)
{
IDSearchDownload dl2 = new IDSearchDownload();
Response<IDSearchResult> resp3 = dl2.Download(index);
int i = 0;
foreach (var item in resp3.Result.Items)
{
writeStream.WriteLine(item.ID + "|" + item.ISIN + "|" + item.Name + "|" + item.Exchange + "|" + item.Type + "|" + item.Industry);
}
}
}
Это дало мне список из примерно 75 000 ценных бумаг примерно за 4 минуты.
Я исследовал это в течение нескольких дней, следуя бесконечным ссылкам, которые были близки, но не совсем, к тому, что мне нужно.
Мне нужен простой список "символ, сектор, отрасль". Я работаю на Java и не хочу использовать нативный код платформы.
Кажется, что большинство других данных, таких как котировки и т.д., легко доступны.
Наконец, последовал предложению посмотреть на 'finviz.com'. Похоже, это как раз то, что нужно. Попробуйте использовать следующее:
http://finviz.com/export.ashx?v=111&t=aapl,cat&o=ticker Это возвращается в виде строк, в стиле csv, со строкой заголовка, упорядоченной по символу тикера. Вы можете продолжать добавлять тикеры. В коде вы можете читать поток. Или вы можете позволить браузеру спросить вас, открыть или сохранить файл.
http://finviz.com/export.ashx?v=111&&o=ticker Тот же стиль csv, но извлекает все доступные символы (много, по всем мировым биржам).
Замените 'export' на 'screener', и данные появятся в браузере.
Есть еще много вариантов, которые вы можете использовать, по одному для каждого элемента скринера на сайте.
Пока что это самый мощный и удобный программный способ получить те немногие данные, которые я не мог получить другим способом. И, похоже, этот сайт вполне может стать единым источником большинства данных, которые могут понадобиться вам, кроме котировок в реальном или близком к реальному времени.
Полный список из Yahoo символы/тикеры/запасы доступна для скачивания(в формате Excel) на сайте. http://www.myinvestorshub.com/yahoo_stock_list.php
Список обновлен в январе 2016: http://investexcel.net/all-yahoo-finance-stock-tickers/
У меня была такая же проблема, но я думаю, что есть простое решение(код из моего приложения Рор): Экстракт идентификаторы промышленности от Yahoo.финансы.секторов и добавить его в БД:
select = "select * from yahoo.finance.sectors"
generate_query select
@data.each do |data|
data["industry"].each do |ind|
unless ind.kind_of?(Array)
unless ind["id"].nil?
id = ind["id"].to_i
if id > 0
Industry.where(id: id).first_or_create(name: ind["name"]).update_attribute(:name, ind["name"])
end
end
end
end
end
Извлечь все компании по транспортировке со своими символами с кодами промышленности:
ids = Industry.all.map{|ind| "'#{ind.id.to_s}'" }.join(",")
select = "select * from yahoo.finance.industry where id in"
generate_query select, ids
@data.each do |ts|
unless ts.kind_of?(Array) || ts["company"].nil?
if ts["company"].count == 2 && ts["company"].first[0] == "name"
t = ts["company"]
Ticket.find_or_create_by_symbol(symbol: t["symbol"], name: t["name"] ).update_attribute(:name, t["name"])
else
ts["company"].each do |t|
Ticket.find_or_create_by_symbol(symbol: t["symbol"], name: t["name"] ).update_attribute(:name, t["name"])
end
end
end
end
end
Hellper связи:
def generate_query(select, ids = nil)
if params[:form] || params[:action] == "sectors" || params[:controller] == "tickets"
if params[:action] == "sectors" || params[:controller] == "tickets"
if ids.nil?
query= select
else
query= "#{select} (#{ids})"
end
else
if params[:form][:ids]
@conditions = params_parse params[:form][:ids]
query = "#{select} (#{@conditions})"
end
end
yql_execut(query)
end
end
def yql_execut(query)
# TODO: OAuth ACCESS (http://developer.yahoo.com/yql/guide/authorization.html)
base_url = "http://query.yahooapis.com/v1/public/yql?&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys&q="
dirty_data = JSON.parse(HTTParty.get(base_url + URI.encode(query)).body)
if dirty_data["query"]["results"] == nil
@data, @count, @table_head = nil
else
@data = dirty_data["query"]["results"].to_a[0][1].to_a
@count = dirty_data["query"]["count"]
if @count == 1
@table_head = @data.map{|h| h[0].capitalize}
else
@table_head = @data.to_a.first.to_a.map{|h| h[0].capitalize}
end
end
end
Извините за беспорядок, но это первая тестовая версия для моего проекта, и мне нужно было очень быстро. Есть некоторые variabels помощники и другие вещи для моего приложения, извините за это. Но у меня вопрос: Есть много символов у вас есть? У меня 5500.
Одним из вариантов решения этой проблемы был итерационный перебор секторов (что в то время можно было делать... в последнее время я это не проверял).
Однако в конечном итоге вы получите блокировку, если будете делать это таким образом, так как YQL получает дневной дроссель.
Используйте CSV API, когда это возможно, чтобы избежать этого.