我尝试着创造一个股票市场模拟器(也许最终会发展成一个预测AI),但是我在寻找数据方面遇到了困难。我正在寻找(希望是免费的)历史股票市场数据的来源。

理想情况下,它将是一个非常细粒度(秒或分钟间隔)的数据集,包含纳斯达克和纽约证券交易所(如果我有冒险精神,可能还包括其他)的每个符号的价格和交易量。有人知道这类信息的来源吗?

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

我也不喜欢在CSV文件中逐个下载数据的想法……我想雅虎会很生气,在我收到几千个请求后就把我关了。

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

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


当前回答

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

雅虎就是用它来提供数据的。

它提供了一个不错的API,数据(据我所知)非常干净。

当你订阅时,你会得到10年的历史,然后每晚更新。

他们还为你处理各种棘手的事情,比如分割和股息。如果你还没有发现数据清理的乐趣,你不会意识到你有多需要它,直到你的自动交易系统(ATS)第一次认为某只股票真的非常非常便宜,只是因为它以2:1的比例分割,而你没有注意到。

其他回答

以秒或分钟为间隔的纳斯达克和纽约证券交易所的每个符号的数据集将是巨大的。

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

也许你想先从一个小点的集合开始?

你可以使用yahoo来获取日常数据(一个更易于管理的数据集),但你必须对url进行结构化。请看这个链接。你提出的不是很多小请求,而是更少的大请求。很多免费软件都使用这个功能,所以他们不应该关闭你。

编辑:这家伙做到了,也许你可以看看他的软件拨打的电话。

我会爬到finance.google.com(寻找报价)——或者finance.yahoo.com。

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

我以前就这样做过,而且非常成功。或者,如果你不介意使用Perl——CPAN上有几个模块已经为你完成了这项工作——即从谷歌/Yahoo提取报价。

有关更多信息,请参阅引用历史

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

我使用这个维基页面下载了以下脚本(我不是一个很有天赋的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或其他值得信赖的数据供应商

对于无生存偏差的数据,我找到的唯一可靠来源是QuantQuote (http://quantquote.com)

数据以分钟、秒或滴答的分辨率,链接到他们的历史股票数据。

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