Как получить полный список символов тикера от Yahoo Finance? - программирование
Подтвердить что ты не робот

Как получить полный список символов тикера от Yahoo Finance?

Я бесконечно googled для метода получения полного (и ежедневно обновленного) списка всех символов тикера Yahoo, доступных через http://finance.yahoo.com

Yahoo имеет информацию для акций, фьючерсов и т.д. для большого количества обменов по всему миру, и мне бы хотелось, чтобы с ними был объединен список всех символов тикера. Я пробовал YQL, но у них есть ограничение "where symbol = (или in)", поэтому я не могу выбрать * из символов.

В принципе, получение подробной информации для одного символа или нескольких символов за один раз легко, но я просто не могу понять, как получить список всех доступных тикеров.

Может ли кто-нибудь помочь, пожалуйста?

4b9b3361

Ответ 1

Существует хорошая С#-оболочка для API Yahoo.Finance в http://code.google.com/p/yahoo-finance-managed/, которая доставит вас туда. К сожалению, нет прямого способа загрузить список тикеров, но следующее создает список, итерируя через алфавитные группы:

        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 минуты.

Ответ 2

Мне удалось сделать что-то подобное, используя этот URL-адрес:

http://query.yahooapis.com/v1/public/yql?q=select%20 * %20% %20yahoo.finance.industry %20 где %20id %20in %20 (выберите %20industry.id %20 из %20yahoo.finance.sectors) & ENV = магазин% 3A% 2F% 2Fdatatables.org% 2Falltableswithkeys

Он загружает полный список символов акций, используя API Yahoo YQL, включая имя запаса, символ запаса и идентификатор отрасли. Кажется, у него нет каких-либо модификаторов символа акций. Например. для Rogers Communications Inc, он загружает только RCI, а не RCI-A.TO, RCI-B.TO и т.д. Я еще не нашел источник этой информации - если кто-нибудь знает, как автоматизировать загрузку, Мне нравится это слышать. Кроме того, было бы неплохо найти способ загрузить какую-то связь между символом акции и обменом, на котором он торгует, поскольку некоторые из них торгуются на нескольких биржах, или, может быть, я только хочу посмотреть на вещи в TSX или что-то еще.

Ответ 3

У меня была аналогичная проблема. yahoo не предлагает его, но вы можете получить его, просмотрев инструкции document.write в списке nyse.com и найдя файл .js, где они просто хранят список компаний, начинающихся с данного письма, как массив js буквальный. вы также можете получить красивые tsv файлы с nasdaq.com здесь: http://www.nasdaq.com/screening/companies-by-name.aspx?letter=0&exchange=nasdaq&render=download (замените exchange = nasdaq с помощью exchange = nyse для символов nyse).

Ответ 4

Списки акций NASDAQ ftp://ftp.nasdaqtrader.com/symboldirectory

2 файла nasdaqlisted.txt и otherlisted.txt являются | Труба разделена. Это должно дать вам хороший список всех акций.

Ответ 5

Я могу помочь со списком символов тикера для (U.S. и не-U.S.) акций и для ETF.

Yahoo предоставляет Календарь заработка, в котором перечислены все акции, которые объявляют заработок за данный день. Это включает неамериканские акции.

Например, вот сегодня: http://biz.yahoo.com/research/earncal/20120710.html

Последняя часть URL - это дата (в формате YYYYMMDD), для которой вы хотите Календарь заработка. Вы можете пройти через несколько дней и очистить символы всех акций, которые сообщили о доходах в те дни.

Нет никакой гарантии, что у yahoo есть данные для всех акций, которые сообщают о доходах, особенно, поскольку некоторые акции больше не существуют (банкротство, приобретение и т.д.), но это, вероятно, достойная отправная точка.

Если вы знакомы с R, вы можете использовать qmao package для этого. (См. этот пост) если у вас возникли проблемы с его установкой.

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

Теперь вы можете извлечь Tickers из таблицы на этой странице

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,

И, для индексов США и не-U.S, вы можете очистить эти страницы

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

Ответ 6

Я изучал это в течение нескольких дней, следуя бесконечным выводам, которые были близки, но не совсем, к тому, что я был после.

Моя потребность в простом списке "symbol, sector, industry". Я работаю на Java и не хочу использовать собственный код платформы.

Похоже, что большинство других данных, таких как цитаты и т.д., легко доступны.

Наконец, последовало предложение посмотреть "finviz.com". Похоже на билет. Попробуйте использовать следующее:

http://finviz.com/export.ashx?v=111&t=aapl,cat&o=ticker Это возвращается как строки, csv style, с строкой заголовка, упорядоченной символом тикера. Вы можете продолжать добавлять тикеры. В коде вы можете прочитать поток. Или вы можете позволить браузеру спросить, следует ли открывать или сохранять файл.

http://finviz.com/export.ashx?v=111&&o=ticker Такой же стиль csv, но тянет все доступные символы (много, через глобальные обмены)

Замените "экспорт" на "screener", и данные будут отображаться в браузере.

Есть еще много вариантов, которые вы можете использовать, по одному для каждого элемента screener на сайте.

До сих пор это самый мощный и удобный программный способ получить несколько фрагментов данных, которые я иначе не мог бы легко получить. И, похоже, этот сайт вполне может быть единственным источником большинства из того, что вам может понадобиться, кроме цитат реального или почти реального времени.

Ответ 8

Одним из способов решения этой проблемы было перебрать сектора (которые в то время вы могли бы сделать... Я не тестировал это недавно).

В конечном итоге вы получаете блокировку, когда делаете это так, потому что YQL получает дросселирование в день.

Используйте CSV API, когда это возможно, чтобы избежать этого.

Ответ 9

У меня была такая же проблема, но я думаю, что у меня есть простое решение (код из моего приложения RoR): Извлеките промышленные идентификаторы из yahoo.finance.sectors и добавьте их в db:

    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

Извините за беспорядок, но это первая тестовая версия для моего проекта, и мне это было очень быстро. Для моего приложения есть несколько помощников и другие вещи, извините за это. Но у меня есть вопрос: есть у вас много символов? У меня 5500.

Ответ 10

Ну, после некоторого копания yahoo не предлагает никаких "списков" со всеми тикерами. Однако этот сайт дает массу информации. Возможно, вы можете найти то, что ищете здесь? http://www.gummy-stuff.org/Yahoo-data.htm

Изменить: сайт не работает из-за проблем с авторскими правами.