我尝试着创造一个股票市场模拟器(也许最终会发展成一个预测AI),但是我在寻找数据方面遇到了困难。我正在寻找(希望是免费的)历史股票市场数据的来源。
理想情况下,它将是一个非常细粒度(秒或分钟间隔)的数据集,包含纳斯达克和纽约证券交易所(如果我有冒险精神,可能还包括其他)的每个符号的价格和交易量。有人知道这类信息的来源吗?
我发现这个问题表明雅虎提供CSV格式的历史数据,但我一直无法找到如何在粗略的检查网站链接得到它。
我也不喜欢在CSV文件中逐个下载数据的想法……我想雅虎会很生气,在我收到几千个请求后就把我关了。
我还发现了另一个问题,让我觉得我中了大奖,但不幸的是,OpenTick网站似乎已经关闭了它的大门……太糟糕了,因为我觉得这正是我想要的。
我还可以使用每天每个符号的开盘/收盘价格和成交量的数据,但我更喜欢所有的数据,如果我能得到的话。还有其他建议吗?
雅虎是获得初步免费数据的最简单选择。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或其他值得信赖的数据供应商
让我加上我的2美分,我的工作是为对冲基金获得良好和干净的数据,我看过相当多的数据提要和历史数据提供商。这主要与美国股市数据有关。
首先,如果你有钱,不要从雅虎下载数据,直接从CSI数据中获取数据,这是雅虎获得EOD数据以及AFAIK的地方。他们有一个API,你可以把数据提取成你想要的任何格式。我想每年的数据订阅费用大概是100美元。
从免费服务下载数据的主要问题是,你只得到仍然存在的股票,这被称为生存偏差,如果你看很多股票,可能会给你错误的结果,因为你只包括迄今为止仍然存在的股票,而不是那些已经退市的股票。
为了处理一些盘中数据,我会去IQFeed看看,他们提供了几个api来提取历史数据,尽管他们主要是一个实时feed的设备。但是这里有相当多的选择,一些代理甚至通过他们的api提供历史数据下载,所以选择你喜欢的。
BUT usually all of this data is not very clean, once you really start back testing you'll see that certain stocks are missing or appear as two different symbols, or stock splits are not properly accounted for, etc. And then you realize that historical dividend data is need as well and so you start running in circles, patching data together from 100 different data sources and so on. So to start with a "discount" data feed will do, but as soon as you run more comprehensive backtests you might run into problems depending on what you do. If you just look at, let's say, the S&P 500 stocks this will not be so much a problem though and a "cheap" intraday feed will do.
但你找不到免费的盘中数据。我的意思是你可能会找到一些例子,我确定在某个地方有5年的微软滴答数据,但这不会让你走得太远。
然后,如果你需要真正的东西(二级订单簿,所有交易都发生过),一个“负担得起的”,但很好的选择是Nanex。他们实际上会给你一个装有tb数据的驱动器。如果我没记错的话,每年大约需要3000 - 4k美元的数据。但相信我,一旦你明白获得好的盘中数据有多难,你就不会认为这是一大笔钱。
并不是要打击你的信心,但要获得好的数据是很难的,事实上,很难到许多对冲基金和银行每月花费数十万美元来获得他们可以信任的数据。同样,你可以从某个地方开始,然后从那里开始,但最好能在上下文中看到它。
编辑:上面的答案来自我自己的经历。这篇来自加州理工学院的关于可用数据来源的文章将提供更多的见解,特别推荐QuantQuote。