如何从Yahoo Finance获取完整的股票代码列表?

112

我已经无尽地在谷歌上搜索了一种方法,可以获得通过http://finance.yahoo.com提供的所有雅虎股票代码的完整(并每日更新)清单。

雅虎为全球许多交易所提供股票、期货等信息,我想要一个包含它们所有可用的股票代码的合并列表。我尝试使用YQL,但他们有一个“where symbol =(或 in)”子句限制,因此我无法从symbols选择*。

所以基本上,获取单个符号或多个符号的详细信息很容易,但我似乎找不到如何获取所有可用股票代码的清单。

请问有人能帮忙吗?


9
你有找到什么有用的信息吗?我找到了这个网站:http://www.eoddata.com/symbols.aspx - Codek
2
没问题。我只需要LSE的股票代码,所以上面的信息对我有帮助 - 我相信交易所中的符号在各大平台上都是一致的,比如雅虎财经/LSE/谷歌金融等等 - 除了雅虎财经后面要加上“.L”,而谷歌金融里则要写成LON。所有股票价格数据都能轻松获取,但就是找不到股票代码清单,这太荒谬了,我真的无法理解! - Codek
4
一个可以为您完成此操作的Python程序:https://github.com/Benny-/Yahoo-ticker-symbol-downloader - Andre Pena
这个脚本从维基百科上爬取股票代码:https://github.com/kevin91nl/scrape-ticker-symbols - www.data-blogger.com
1
以下软件包提供了一个很好的收藏:https://github.com/portfolioplus/pytickersymbols - SlashGordon
显示剩余2条评论
9个回答

48

3
谢谢Ian。但我需要雅虎的清单,因为他们在美国以外的地区也有股票代码,所以仅有纳斯达克的清单是不够的。 - rassom
5
非常好,谢谢。您也可以将“exchange”替换为“all”,以获取所有三个指数的股票代码。 - Darin Peterson
链接指向一个包含该列表的网站,但我没有看到下载CSV文件的选项。 - hipoglucido
1
我成功地从https://plextock.com/us-symbols?utm_source=so获取了所有可用的股票代码。 - IdoS

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上交易的东西。


1
不错。原始 YQL 语句:select * from yahoo.finance.industry where id in (select industry.id from yahoo.finance.sectors) - David Gilbertson
1
我相信上述查询返回的数据最终来自可以从此网址http://biz.yahoo.com/ic/ind_index.html访问到的链接(这些附加网址也可能有用:http://biz.yahoo.com/p/s_conameu.html,http://biz.yahoo.com/p/sum_conameu.html)。 - richardr
20
这似乎不再起作用了 :( - Andre Pena
1
我认为表"yahoo.finance.sectors"已被删除。但是仍有数据来源-一个网页。(实际上,如果您在https://developer.yahoo.com/yql/console/的YQL控制台中执行“select * from yahoo.finance.sectors”,则嵌入在返回值中的是指向网页http://biz.yahoo.com/ic/ind_index.html的链接。)因此,您需要编写一些代码来获取该页面,然后解析其中的数据。它将为您提供部门列表、这些部门中的行业以及行业ID(您可以通过行业ID的第一个数字创建一个部门ID)。 - Steve Greene
显示剩余2条评论

26

仅返回翻译后的文本:for the lazy like me: ftp.nasdaqtrader.com/SymbolDirectory ftp.nasdaqtrader.com/SymbolDirectory/nasdaqlisted.txt ftp.nasdaqtrader.com/SymbolDirectory/otherlisted.txt - 1mike12
nasdaqtraded.txt 是你需要的,它将这两个列表合并在一起。 - thistleknot

14
有一个不错的C#包装器,可以使用http://code.google.com/p/yahoo-finance-managed/上的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);
                }

            }
        }

它给了我大约75000个证券清单,只用了大约4分钟。


27
你能运行这段代码并将输出的副本放在Pastebin上吗?因为我们中有些人不使用C#。 - Jeroen Ooms
1
似乎字母顺序的结果不完整,许多符号被遗漏了。 - liang
我尝试运行这段代码,但不幸的是它没有返回任何结果。有什么想法吗? - lionheart
3
我认为这个不再有效。提到的包装器API发送请求到http://biz.yahoo.com/i/,该网址似乎已经更改(重新定向到finance.yahoo.com/q),并且不再包含XPath建议的表格。 - richardr

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个。您需要"Show All"链接的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


2
正如你所写的,用这种方法可能无法获取所有股票代码,而对于我的项目来说,要么是全部(完整列表),要么就不重要。但是非常感谢你详细的回答,GSee。非常感激!祝你有美好的一天 :-) - rassom

9

3
这个列表的更新程度如何? - Jeroen Ooms
1
这个列表似乎不完整,例如GOOG不在其中。 - user592419
这个列表的长度限制在3000个符号以内。它按字母顺序排列,所以对于美国而言,截止到FDEF位置。 其他市场的符号数量少于3000个似乎情况较好,例如香港。尽管如此,我不知道它有多完整/最新。 - fantabolous
3
似乎不完整且未得到维护。 - Jens A. Koch
链接已经失效。 - toshiro92

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',数据将显示在浏览器中。
您可以使用更多选项,每个筛选器元素都有一个选项。
到目前为止,这是最强大和方便的编程方式,可以获取我似乎很难获得的少量数据。而且,看起来这个网站除了实时或准实时行情外,可能是您所需的大部分内容的单一来源。

5
我会尽力进行翻译,请问需要翻译的内容是:"Every url I load is redirected to http://finviz.com/elite.ashx" 吗? - PUG
我不得不订阅Elite Trader服务,但这是值得的。谢谢。 - vlmercado
似乎这只是在推销某个产品,没有回答问题。任何人都可以购买这些信息。 - ChungaBunga

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个。


5500 可能只是美国股票符号(雅虎金融涵盖更多 - 全球范围内 - 如您在接受的答案中所见,他获得了约 75,000 个符号!:) ... 我还没有将接受的答案转换为 Ruby 的 .NET 方式(我也在使用 RoR),因此如果您使其正常工作,即找到更多符号,请告诉我。谢谢! :-) - rassom

1

我曾经采用的一种解决方法是遍历扇区(当时可以这样做...但最近我没有测试过)。

然而,如果您采用这种方式,最终会被阻止,因为每天 YQL 会被限制。

尽可能使用 CSV API 以避免此问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接