106

我已经无休止地在谷歌上搜索了一种通过http://finance.yahoo.com获得所有雅虎股票代码的完整(和每日更新)列表的方法

雅虎拥有全球许多交易所的股票、期货等信息,我想要一份可通过它们获得的所有股票代码的组合列表。我试过 YQL,但他们有一个“where symbol = (or in)”子句限制,所以我不能从符号中选择 *。

所以基本上,一次获取单个符号或多个符号的详细信息很容易,但我似乎无法找到如何获取所有可用代码的列表。

有人可以帮忙吗?

4

9 回答 9

46

我有一个类似的问题。雅虎不提供它,但您可以通过查看 nyse.com 列表上的 document.write 语句并找到 .js 文件来获得它,它们恰好将以给定字母开头的公司列表存储为 js 数组文字。您还可以在此处从 nasdaq.com 获得漂亮整洁的 csv 文件:http: //www.nasdaq.com/screening/companies-by-name.aspx? letter=0&exchange=nasdaq&render=download (将 exchange=nasdaq 替换为 exchange=nyse对于纽约证券交易所代码)。

于 2011-06-17T21:01:50.713 回答
44

我设法通过使用此 URL 做类似的事情:

http://query.yahooapis.com/v1/public/yql?q=select%20 *%20from%20yahoo.finance.industry%20where%20id%20in%20(select%20industry.id%20from%20yahoo.finance .sectors)&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys

它使用 Yahoo YQL API 下载完整的股票代码列表,包括股票名称、股票代码和行业 ID。它似乎没有任何股票代码修饰符。例如,对于 Rogers Communications Inc,它只下载 RCI,而不是 RCI-A.TO、RCI-B.TO 等。我还没有找到该信息的来源 - 如果有人知道自动下载的方法,我想听听。此外,最好找到一种方法来下载股票代码与其交易的交易所之间的某种关系,因为有些在多个交易所交易,或者我只想查看 TSX 上的东西或其他东西.

于 2013-05-03T13:29:18.337 回答
26

纳斯达克股票列表 ftp://ftp.nasdaqtrader.com/symboldirectory

nasdaqlisted.txt 和 otherlisted.txt 这两个文件是 | 管分离。这应该会给你一个很好的所有股票清单。

于 2012-11-05T03:35:17.420 回答
14

我可以帮助列出(美国和非美国)股票和 ETF 的股票代码。

雅虎提供了一个收益日历,列出了公布某一天收益的所有股票。这包括非美国股票。

例如,这里是今天的:http ://biz.yahoo.com/research/earncal/20120710.html

URL 的最后一部分是您想要收入日历的日期(格式为 YYYYMMDD)。您可以循环几天并刮掉那些日子报告收益的所有股票的符号。

不能保证雅虎拥有所有报告收益的股票的数据,特别是因为一些股票不再存在(破产、收购等),但这可能是一个不错的起点。

如果您熟悉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 列表: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 _ _

于 2012-07-10T20:26:51.830 回答
14

在http://code.google.com/p/yahoo-finance-managed/有一个不错的 Yahoo.Finance API 的 C# 包装器,可以帮助您到达那里。不幸的是,没有直接下载股票代码列表的方法,但以下通过迭代字母组来创建列表:

        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);
                }

            }
        }

它在大约 4 分钟内给了我一份大约 75,000 只证券的清单。

于 2012-11-03T01:31:40.323 回答
9

雅虎符号/股票代码/股票的完整列表可在以下网站下载(excel 格式)。http://www.myinvestorshub.com/yahoo_stock_list.php

列表更新至 2016 年 1 月:http: //investexcel.net/all-yahoo-finance-stock-tickers/

于 2012-12-27T17:59:55.163 回答
8

几天来我一直在研究这个,追随无尽的线索,这些线索接近但不完全是我所追求的。

我需要一个简单的“符号、部门、行业”列表。我正在使用 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”,数据将显示在浏览器中。

您可以使用更多选项,站点上的每个筛选器元素都有一个选项。

到目前为止,这是最强大和最方便的编程方式来获取我似乎无法轻松获取的几条数据。而且,看起来这个网站很可能是您可能需要的大部分内容的单一来源,而不是实时或近实时报价。

于 2013-07-03T03:29:00.507 回答
1

我有同样的问题,但我认为我有简单的解决方案(代码来自我的 RoR 应用程序):从 yahoo.finance.sectors 中提取行业 ID 并将其添加到数据库:

    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

提取所有带有行业 ID 符号的公司:

    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

连接地狱:

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。

于 2012-11-30T13:41:17.470 回答
1

我为此采取的一种解决方法是迭代扇区(当时你可以这样做......我最近没有测试过)。

但是,当你这样做时,你最终会被阻止,因为 YQL 每天都会受到限制。

尽可能使用 CSV API 来避免这种情况。

于 2012-05-20T22:54:41.613 回答