244

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

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

我发现这个问题表明雅虎以 CSV 格式提供历史数据,但我一直无法通过粗略检查链接的网站找到如何获取它。

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

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

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

4

18 回答 18

232

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

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

从免费服务下载数据的主要问题是您只能获得仍然存在的股票,这称为生存偏差,如果您查看许多股票可能会给您错误的结果,因为您只会包括那些使它如此远而不是那些被除名的。

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

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

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

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

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


编辑:上面的答案来自我自己的经验。加州理工学院关于可用数据馈送的这篇文章将提供更多见解,特别推荐QuantQuote

于 2013-06-23T17:01:49.950 回答
95

这个答案不再准确,因为雅虎提要已经不存在了

使用上面的 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
于 2010-01-28T03:34:47.283 回答
49

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

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

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

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

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

于 2009-06-22T10:51:54.167 回答
17

简介:
从 yahoo,您可以获得 EOD(一天结束)历史价格或实时价格。EOD 价格的下载非常简单。有关如何获取数据和 C# 代码示例的说明,请参阅我的博客。

我正在编写一个实时数据馈送“引擎”,它将实时价格下载并存储在数据库中。该引擎最初将能够从 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 文件的连接来填充 a DataSet,然后通过 更新我的实际数据库DataSet,它基本上可以将 Yahoo 返回的 CSV 文件中的所有列直接匹配到您的数据库(如果您的数据库不支持批量插入 CSV 数据,例如 SQLite)。否则,插入数据是单行的......只需将 CSV 批量插入到您的数据库中。

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

于 2010-04-24T17:27:36.823 回答
16

纳斯达克和纽交所上每一个交易品种的数据集以一秒或一分钟为间隔将是巨大的

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

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

于 2009-04-16T03:13:40.600 回答
9

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

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

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

于 2011-01-04T15:48:42.807 回答
8

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

数据以分钟、秒或刻度分辨率提供,链接到他们的历史股票数据

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

于 2012-09-14T16:15:23.353 回答
7

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

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

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

于 2009-04-16T03:10:04.663 回答
6

让我添加一个我刚刚发现的来源,在这里找到。

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

于 2014-09-21T01:37:38.367 回答
6

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

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

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

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

于 2009-12-30T09:25:34.740 回答
5

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

于 2012-12-29T13:34:20.060 回答
4

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

编辑:这个人做到了,也许你可以看看他的软件所做的调用。

于 2009-04-16T03:23:46.923 回答
4

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

我使用这个 wiki 页面下载了所有带有以下脚本的公司代码(我不是一个非常有才华的 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 或其他人这样的可信数据供应商

于 2013-11-15T08:05:46.183 回答
3

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

于 2012-08-10T00:13:54.060 回答
3

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

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

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

于 2011-06-04T08:36:28.967 回答
2

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

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

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

有关更多信息,请参阅报价历史

于 2009-04-16T03:12:04.130 回答
1

我以前的一个项目将使用从EODData可免费下载的数据。

于 2009-08-25T06:15:10.393 回答
1

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

于 2010-10-18T23:17:24.737 回答