【问题标题】:source of historical stock data [closed]历史股票数据的来源[关闭]
【发布时间】:2010-10-19 18:27:12
【问题描述】:

我正在尝试制作一个股市模拟器(也许最终会成长为一个预测 AI),但我无法找到要使用的数据。我正在寻找历史股票市场数据的(希望是免费的)来源。

理想情况下,这将是一个非常细粒度(秒或分钟间隔)的数据集,其中包含 NASDAQ 和 NYSE(如果我喜欢冒险的话,可能还有其他)上每个代码的价格和交易量。有谁知道此类信息的来源?

我找到了this question,这表明雅虎提供 CSV 格式的历史数据,但我无法通过粗略检查链接的网站找到如何获取它。

我也不喜欢在 CSV 文件中零碎下载数据的想法……我想雅虎会在最初的几千个请求后感到不安并关闭我。

我还发现了another question,这让我觉得我中了大奖,但不幸的是,OpenTick 网站似乎已经关门了……太糟糕了,因为我认为它们正是我想要的。

我还可以使用每个交易品种每天的开盘/收盘价和交易量数据,但如果我能获得所有数据,我会更喜欢这些数据。还有其他建议吗?

【问题讨论】:

  • @rmeador,无论您提出多少请求,雅虎都不会关闭您,但 Google 会关闭您。我已经能够在大约 5-6 小时内从雅虎下载大约 4GB 的 EOD 历史价格而不会被关闭。大约 7,000 只股票的所有 EOD 历史价格自它们加入市场以来。有关更多信息和示例源代码,请参阅我的答案。
  • 我觉得 EOD 数据信息量不足。如果您想要逐笔报价和交易,我相信polygon.io 是最便宜的。

标签: artificial-intelligence simulation finance stocks


【解决方案1】:

让我加上我的 2 美分,我的工作是为对冲基金获取良好且干净的数据,我见过很多数据馈送和历史数据提供者。这主要是关于美股数据。

首先,如果你有一些钱,不要费心从雅虎下载数据,直接从 CSI data 获取日终数据,这是雅虎获取 EOD 数据的地方好吧,AFAIK。他们有一个 API,您可以在其中将数据提取为您想要的任何格式。我认为每年订阅数据只需 100 美元。

从免费服务下载数据的主要问题是您只能获得仍然存在的股票,这称为Survivorship Bias,如果您查看许多股票可能会给您错误的结果,因为您只会包含那些股票到目前为止,它并没有被除名。

为了处理一些日内数据,我会查看 IQFeed,它们提供了几个 API 来提取历史数据,尽管它们主要是用于实时提要。但是这里有很多选择,一些经纪人甚至通过他们的 API 提供历史数据下载,所以选择你的毒药。

但通常所有这些数据都不是很干净,一旦你真正开始回溯测试,你会发现某些股票丢失或显示为两个不同的符号,或者股票拆分没有正确考虑等等。然后你意识到也需要历史股息数据,因此您开始循环运行,将来自 100 个不同数据源的数据拼凑在一起,等等。因此,从“折扣”数据馈送开始就可以了,但是一旦您运行更全面的回溯测试,您可能会遇到问题,具体取决于您所做的事情。如果您只看一下标准普尔 500 指数的股票,这将不是什么大问题,“便宜”的盘中数据就可以了。

您不会找到免费的盘中数据。我的意思是你可能会找到一些例子,我敢肯定在某个地方有 5 年的 MSFT 刻度数据浮动,但这不会让你走得太远。

然后,如果您需要真正的东西(二级订单簿,所有交易所发生的所有报价),一个“负担得起的”,但很好的选择是 Nanex。他们实际上会为您提供一个包含数 TB 数据的驱动器。如果我没记错的话,它每年的数据约为 3k-4K 美元。但是请相信我,一旦您了解获得良好的盘中数据有多难,您就不会认为这是一笔巨款。

不是要气馁,而是要获得好的数据很难,事实上,许多对冲基金和银行花费数十万美元每个月来获得他们可以信任的数据。同样,您可以从某个地方开始,然后从那里开始,但最好在上下文中看到它。


编辑:上面的答案来自我自己的经验。 This write-up from Caltech关于可用数据馈送将提供更多见解,特别推荐QuantQuote

【讨论】:

  • +1 用于指出数据的 3 个级别(hist、intra、level II)和对其他人的答案(完整性、清洁度、存储大小、数据集...)有洞察力的 cmets
  • CSI 很棒,但仅供参考,退市股票现在是一项优质服务,不再包含在基本套餐中。仅供参考。
  • CSI 很棒,但价格昂贵。如果您使用 Unfair Advantage,您将被绑定到他们的应用程序。每天用它来更新你的历史很无聊。如果你想通过 CSI 从 http 或 ftp 下载,你必须每月支付大约 200 欧元。抱歉,太贵了。
  • @davidh,CSI Unfair Advantage 有一个 ActiveX API,您可以在其中自动导出订阅的所有数据。编写一个强大的导出器工具大约需要一天的时间...如果您知道与 CSI 质量相同且更便宜的替代品,请随时发布替代品!
  • 关于 QuantQuote 的注意事项:他们会在购买后 48 小时内审核/处理您的订单。以防您认为您可以立即访问。
【解决方案2】:

此答案不再准确,因为 YAHOO 提要已不存在

使用上述 Yahoo 的 CSV 方法,您还可以获取历史数据! 您可以对以下示例进行逆向工程:

http://ichart.finance.yahoo.com/table.csv?s=YHOO&d=0&e=28&f=2010&g=d&a=3&b=12&c=1996&ignore=.csv

基本上:

sn = TICKER
a = fromMonth-1
b = fromDay (two digits)
c = fromYear
d = toMonth-1
e = toDay (two digits)
f = toYear
g = d for day, m for month, y for yearly

完整的参数列表:

a   Ask
a2  Average Daily Volume
a5  Ask Size
b   Bid
b2  Ask (Real-time)
b3  Bid (Real-time)
b4  Book Value
b6  Bid Size
c   Change & Percent Change
c1  Change
c3  Commission
c6  Change (Real-time)
c8  After Hours Change (Real-time)
d   Dividend/Share
d1  Last Trade Date
d2  Trade Date
e   Earnings/Share
e1  Error Indication (returned for symbol changed / invalid)
e7  EPS Estimate Current Year
e8  EPS Estimate Next Year
e9  EPS Estimate Next Quarter
f6  Float Shares
g   Day's Low
h   Day's High
j   52-week Low
k   52-week High
g1  Holdings Gain Percent
g3  Annualized Gain
g4  Holdings Gain
g5  Holdings Gain Percent (Real-time)
g6  Holdings Gain (Real-time)
i   More Info
i5  Order Book (Real-time)
j1  Market Capitalization
j3  Market Cap (Real-time)
j4  EBITDA
j5  Change From 52-week Low
j6  Percent Change From 52-week Low
k1  Last Trade (Real-time) With Time
k2  Change Percent (Real-time)
k3  Last Trade Size
k4  Change From 52-week High
k5  Percent Change From 52-week High
l   Last Trade (With Time)
l1  Last Trade (Price Only)
l2  High Limit
l3  Low Limit
m   Day's Range
m2  Day's Range (Real-time)
m3  50-day Moving Average
m4  200-day Moving Average
m5  Change From 200-day Moving Average
m6  Percent Change From 200-day Moving Average
m7  Change From 50-day Moving Average
m8  Percent Change From 50-day Moving Average
n   Name
n4  Notes
o   Open
p   Previous Close
p1  Price Paid
p2  Change in Percent
p5  Price/Sales
p6  Price/Book
q   Ex-Dividend Date
r   P/E Ratio
r1  Dividend Pay Date
r2  P/E Ratio (Real-time)
r5  PEG Ratio
r6  Price/EPS Estimate Current Year
r7  Price/EPS Estimate Next Year
s   Symbol
s1  Shares Owned
s7  Short Ratio
t1  Last Trade Time
t6  Trade Links
t7  Ticker Trend
t8  1 yr Target Price
v   Volume
v1  Holdings Value
v7  Holdings Value (Real-time)
w   52-week Range
w1  Day's Value Change
w4  Day's Value Change (Real-time)
x   Stock Exchange
y   Dividend Yield

【讨论】:

  • This page 有一个表格特殊标签,可以在 URL 中使用。
  • 从雅虎或任何在线服务获取数据的一个大问题是,您不会获得退市股票,因此您很快就会遇到幸存者偏差。最好听从 Eric H. 或我的建议,直接进入 CSI。
  • 此页面曾经有一个表格特殊标签,可以在 URL 中使用...“雅虎认为您使用和分发该工具以及位于...的内容构成违反服务条款第 6、12 和 18 条(以及其他条款)会引起不公平竞争,并诱使他人违反服务条款。...通过干扰这些合同和业务关系,您可能会造成损害其他用户获得雅虎财经网站所提供服务的好处的能力”。对雅虎表示不满
  • 我从我的笔记中添加了剩余的开关,这些开关曾经在那个网页上找到。在此处展示这些似乎并不违反此处的 ToS:policies.yahoo.com/us/en/yahoo/terms/product-atos/apiforydn/… 雅虎一定对该网站上也提供的 Excel 数据工具感到不安。
  • 此数据馈送已不存在。
【解决方案3】:

我知道你想要“免费”,但如果我是你,我会认真考虑以大约 300 美元/年的价格从 csidata.com 获取数据。

这是雅虎用来提供数据的。

它带有一个不错的 API,而且数据(据我所知)非常干净。

订阅后您将获得 10 年的历史记录,然后每晚更新一次。

他们还为您处理各种令人讨厌的事情,例如分股和分红。如果你还没有发现数据清理的乐趣,你不会意识到你有多么需要这个,直到你的 ATS(自动交易系统)第一次认为某些股票真的很便宜,只是因为它分裂了 2 :1 而你没有注意到。

【讨论】:

  • 他们的 API 支持哪些语言?
  • 他们有一个 ActiveX API,您可以使用 c++ 代码或 C# 或 Windows 中的任何内容调用它来获取您的数据。
  • 有趣。分拆和分红处理与雅虎有何不同?
  • @MatthewLock 我不是 100% 同意这一点,但我认为雅虎使用了不同的“企业事件”数据提供者,然后只使用由企业事件调整的原始 CSI 数据。这篇有点老的文章给出了一些见解:amibroker.org/userkb/2007/09/23/yahoos-data-providers
  • CSI 很棒,但仅供参考,退市股票现在是一项优质服务,不再包含在基本套餐中。仅供参考。
【解决方案4】:

简介:
您可以从雅虎获得 EOD(日终)历史价格或实时价格。 EOD 价格的下载非常简单。有关如何获取数据和 C# 代码示例的说明,请参阅 my blog

我正在编写一个实时数据馈送“引擎”,用于下载实时价格并将其存储在数据库中。该引擎最初将能够从 Yahoo 和 Interactive Brokers 下载历史价格,并将能够将数据存储在您选择的数据库中:MS SQL、MySQL、SQLite 等。它是开源的,但我会发布更多当我接近发布时(几天内)在我的博客上发布信息。

另一个选项是eclipse trader... 它允许您以低至 1 分钟的粒度记录历史数据,并将价格本地存储在文本文件中。它基本上会延迟 15 分钟从雅虎下载实时数据。由于我想要一个更强大的解决方案,并且我正在开展一个需要数据的大型学校项目,因此我决定编写自己的数据馈送引擎(我在上面提到过)。

示例代码:
以下是演示如何下载实时数据的示例 C# 代码:

public void Start()
{
    string url = "http://finance.yahoo.com/d/quotes.csv?s=MSFT+GOOG&f=snl1d1t1ohgdr";
    //Get page showing the table with the chosen indices
    HttpWebRequest request = null;
    IDatabase database =
        DatabaseFactory.CreateDatabase(
        DatabaseFactory.DatabaseType.SQLite);

    //csv content
    try
    {
        while (true)
        {
            using (Stream file = File.Create("quotes.csv"))
            {
                request = (HttpWebRequest)WebRequest.CreateDefault(new Uri(url));
                request.Timeout = 30000;
                using (var response = (HttpWebResponse)request.GetResponse())
                using (Stream input = response.GetResponseStream())
                {
                    CopyStream(input, file);
                }
            }
            Console.WriteLine("------------------------------------------------");
            database.InsertData(Directory.GetCurrentDirectory() + "/quotes.csv");

            File.Delete("quotes.csv");
            Thread.Sleep(10000); // 10 seconds
        }
    }
    catch (Exception exc)
    {
        Console.WriteLine(exc.ToString());
        Console.ReadKey();
    }
}

数据库:
在数据库方面,我使用OleDb 连接到CSV 文件来填充DataSet,然后我通过DataSet 更新我的实际数据库,它基本上可以匹配返回的CSV 文件中的所有列从 Yahoo 直接到您的数据库(如果您的数据库不支持批量插入 CSV 数据,例如 SQLite)。否则,插入数据是单行的......只需将 CSV 批量插入到您的数据库中。

您可以在此处阅读有关 url 格式的更多信息:http://www.gummy-stuff.org/Yahoo-data.htm

【讨论】:

  • 史诗我希望我早点找到这个。
  • 真的像你建议的那样提供实时数据吗?从页面上看,确实有这个参数“k1”,但是上次查看,还是有延迟。
  • @Antony 大多数时候都会有某种延迟,所以这取决于你对延迟的容忍度。雅虎确实说他们提供实时数据,但它肯定不是所有的股票代码。非实时代码最多延迟 15 分钟。即使您在交易所获得了同地服务器,仍然会有“一些延迟”。那么你愿意容忍什么样的延迟呢?
  • 不可靠。告诉我,为什么现在这不起作用:real-chart.finance.yahoo.com/… used from finance.yahoo.com/q/…
【解决方案5】:

纳斯达克和纽约证券交易所每一个交易品种每秒钟或一分钟的数据集将是大量

假设共有 4000 家公司在两个交易所上市(这可能属于非常低的水平,因为有 over 3200 companies 在纳斯达克上市)。对于第二个间隔的数据,假设一天有 6.5 个交易小时,这将为您提供每家公司每天 23400 个数据点,或者那一天总共有大约 93,600,000 个数据点。假设一年有 200 个交易日,那么仅一年就有大约 18,720,000,000 个数据点。

也许您想先从较小的集合开始?

【讨论】:

  • 我的操作假设是大多数公司不会每秒都被交易,因此数据点的数量会明显减少。也许这是一个糟糕的假设。尽管如此,我还是预测每年大约 10 GB...
  • 在 3 张 DVD 上提供了大约 10 个符号的几个月的股票数据。数据也是压缩文本。
  • @rmeador 确实如此,但有些股票的日交易量远远超过一天中的秒数,这意味着它们每秒交易不止一次 - 并非所有交易都保证相同价钱。因此,您必须决定是否对间隔价格或交易价格感兴趣
  • 如果你想要整个事情,例如,所有交易所的二级报价等,它以 suuuuper 压缩格式(约 5GB 每个交易日)一年有几 TB。如果您只存储分钟数据,那么它真的很少,10 年的所有库存大约 10GB...
【解决方案6】:

纳斯达克为每个交易品种提供 10 年的 EOD 历史数据

http://www.nasdaq.com/aspx/historical_quotes.aspx?symbol=AAPL&selected=AAPL

您可以自动化下载这些数据的过程。

【讨论】:

  • 不错的来源。他们改变了请求系统,所以现在所有的请求都是用JS处理的(例如nasdaq.com/symbol/aapl/historical)。有没有办法让它自动化?
  • 是的,可以自动化。您需要使用诸如 Telerik 之类的嗅探器并查看如何获取数据(通过 POST)。只要你发送正确的 post 变量,你应该得到数据。
  • 这个还能用吗?它是否包含任何日内数据?
【解决方案7】:

对于无幸存者偏差数据,我发现的唯一可靠来源是 QuantQuote (http://quantquote.com)

数据以分钟、秒或刻度为单位,链接到他们的historical stock data

上面有关于 kibot 的建议。在从他们那里购买之前,我会做一个快速的谷歌搜索,你会发现很多帖子 like this 带有关于 kibot 数据质量问题的警告。这也说明了他们所谓的无幸存者偏差 sp500 在 14 年内只有 570 个符号。这几乎是不可能的,sp500 每个改变 1-2 个符号....

【讨论】:

  • kibot 只有 3 个免费符号。剩下的要付钱!他只是在做广告
  • quantquote 的免费每日数据没有记录:csv 文件中没有列标题,也没有任何文档。
  • 有文档,格式和他们的分钟分辨率数据集基本一致。
  • quantquote.com 的数据有很多错误
  • 自 1998 年以来,他们为 IBM 提供免费的每分钟数据。这对我来说已经足够好了。我只需要一个符号来测试压缩:kibot.com/buy.aspx
【解决方案8】:

不幸的是,免费的历史股票数据很难获得。现在 opentick 已经死了,我不知道还有其他提供者。

在前世,我曾在一家拥有自动交易系统的对冲基金工作,我们大量使用历史数据。

我们使用 TickData 作为我们的来源。他们的价格合理,而且数据具有亚秒级分辨率。

【讨论】:

    【解决方案9】:

    我们从Kibot.com 购买了 12 年的盘中数据,对质量非常满意。

    关于存储要求:所有美国股票(超过 8000 个品种)的 12 年 1 分钟数据约为 100GB。

    与逐笔报价数据情况略有不同。如果您只记录时间和销售额,那么对于所有美国股票来说,这将是每月大约 30GB 的数据。如果您想将出价/要价更改与交易一起存储,您可以预计每月大约 150GB。

    我希望这会有所帮助。如果还有什么可以帮助您的,请告诉我。

    【讨论】:

    • 对 KiBot @boe100 仍然满意?
    • @boe100 他们有调整价格和未调整价格吗?他们有 beta 和 delta 吗?
    • 调整数据和未调整数据均可用。可以使用 HTTP API 更新您的数据或每天从 FTP 服务器下载新档案。不计算 beta 或 delta。
    • @boe100 你能分享你的数据吗?
    • @Tomasz 哈哈,你的评论让我很开心:D
    【解决方案10】:

    让我添加一个我刚刚发现的来源,找到here

    它有大量 csv 格式的历史股票数据,由 Andy Pavlo 收集,根据他的主页,他是“卡内基梅隆大学计算机科学系的助理教授”。

    【讨论】:

    【解决方案11】:

    如今,Mathematica 还提供对当前和历史股票价格的访问,请参阅 http://reference.wolfram.com/mathematica/ref/FinancialData.html ,如果你碰巧有它的副本。

    【讨论】:

    • 最小时间步长为day
    • 谢谢你让我知道 - 这确实不是很好......
    【解决方案12】:

    您可以使用 yahoo 获取每日数据(更易于管理的数据集),但您必须构建 url。请参阅此link。你没有提出很多小请求,而是提出了更少的大请求。许多免费软件都使用它,所以它们不应该让你失望。

    编辑:This 家伙做到了,也许你可以看看他的软件发出的调用。

    【讨论】:

    • 起初我认为该链接看起来很有希望,但我似乎无法找到如何指定历史数据......看起来它都是实时的。我错过了什么吗?
    • 你是对的。我已经添加了另一个人的链接,该链接使用具有历史意义的软件,所以我知道这是可能的。也许看看他的软件发出的调用。
    【解决方案13】:

    Yahoo 是获取初步免费数据的最简单选择。 eckesicle 的答案中描述的链接可以很容易地在 python 代码中使用,但你首先需要所有的代码。我会在这个例子中使用纽约证券交易所,但这也可以用于不同的交易所。

    我使用this wiki page 下载了所有带有以下脚本的公司代码(我不是一个很有才华的 Python 专家,如果这段代码效率不高,请见谅):

    import string
    import urllib2
    from bs4 import BeautifulSoup
    
    global f
    
    def download_page(url):
        aurl = urllib2.urlopen(url)
        soup = BeautifulSoup(aurl.read())
    
        print url
    
        for row in soup('table')[1]('tr'):
            tds = row('td')
            if (len(tds) > 0):
                f.write(tds[1].string + '\n')
    
    
    f = open('stock_names.txt', 'w')
    
    url_part1 = 'http://en.wikipedia.org/wiki/Companies_listed_on_the_New_York_Stock_Exchange_'
    url = url_part1 + '(0-9)'
    download_page(url)
    
    for letter in string.uppercase[:26]:
        url_part2 = letter
        url = url_part1 + '(' + letter + ')'
    
        download_page(url)
    
    f.close()
    

    为了下载每个代码,我使用了另一个非常相似的脚本:

    import string
    import urllib2
    from bs4 import BeautifulSoup
    
    
    global f
    
    url_part1 = 'http://ichart.finance.yahoo.com/table.csv?s='
    url_part2 = '&d=0&e=28&f=2010&g=d&a=3&b=12&c=1996&ignore=.csv'
    
    print "Starting"
    
    f = open('stock_names.txt', 'r')
    file_content = f.readlines()
    count = 1;
    print "About %d tickers will be downloaded" % len(file_content)
    
    for ticker in file_content:
        ticker = ticker.strip()
        url = url_part1 + ticker + url_part2
        
        try:
            # This will cause exception on a 404
            response = urllib2.urlopen(url)
    
            print "Downloading ticker %s (%d out of %d)" % (ticker, count, len(file_content))
    
            count = count + 1
            history_file = open('C:\\Users\\Nitay\\Desktop\\Historical Data\\' + ticker + '.csv', 'w')
            history_file.write(response.read())
            history_file.close()
    
        except Exception, e:
            pass
    
    f.close()
    

    请注意,这种方法的主要缺点是不同的公司可以使用不同的数据 - 在请求的日期(新列出的)没有数据的公司将为您提供 404 页面。

    另外请记住,此方法仅适用于初步数据 - 如果您真的想测试您的算法,您应该支付一点费用并使用 CSIData 或其他可信数据供应商

    【讨论】:

    • 在全局命名空间中放置一个全局声明是不必要的,不过还是很好的响应。
    • 服务停止...
    【解决方案14】:

    为什么不用布朗运动来模拟一个假股票市场呢?

    有足够的资源来做这件事。易于实施。

    http://introcs.cs.princeton.edu/java/98simulation/

    【讨论】:

    • :-) 为了让它更真实,你需要创建Fractional Brownian motion,即使这样也不是很真实,对于最真实的虚假市场数据,你还需要一个分形时间维度......不得不说它变得相当复杂。最好只购买真实的市场数据...
    • 股票走势不是对数正态也无济于事:)
    【解决方案15】:

    我使用 eodData.com。它的价格相当合理。每月 30 美元,您可以获得 30 天的所有美国交易所的 1.5 和 60 分钟柱状图,以及大多数其他交易所的 1 年 EOD 数据。

    【讨论】:

      【解决方案16】:

      我会抓取 Finance.google.com(获取报价) - 或 Finance.yahoo.com。

      这两个都将为世界各地的大多数交易所返回 html 页面,包括历史。然后,只需解析 HTML 以提取您需要的内容。

      我过去曾这样做过,并取得了巨大的成功。或者,如果您不介意使用 Perl - CPAN 上有几个模块可以为您完成这项工作 - 即从 Google/Yahoo 中提取引号。

      欲了解更多信息,请参阅Quote History

      【讨论】:

      • +1 对抗 perl 模块,它们使获取数据变得超级容易
      【解决方案17】:

      我以前的一个项目打算使用来自EODData 的免费下载数据。

      【讨论】:

        【解决方案18】:

        看看 Mergent 历史证券数据 API - http://www.mergent.com/servius

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-10
          • 2014-09-25
          • 1970-01-01
          • 1970-01-01
          • 2016-08-13
          • 1970-01-01
          • 1970-01-01
          • 2022-01-16
          相关资源
          最近更新 更多