我尝试着创造一个股票市场模拟器(也许最终会发展成一个预测AI),但是我在寻找数据方面遇到了困难。我正在寻找(希望是免费的)历史股票市场数据的来源。
理想情况下,它将是一个非常细粒度(秒或分钟间隔)的数据集,包含纳斯达克和纽约证券交易所(如果我有冒险精神,可能还包括其他)的每个符号的价格和交易量。有人知道这类信息的来源吗?
我发现这个问题表明雅虎提供CSV格式的历史数据,但我一直无法找到如何在粗略的检查网站链接得到它。
我也不喜欢在CSV文件中逐个下载数据的想法……我想雅虎会很生气,在我收到几千个请求后就把我关了。
我还发现了另一个问题,让我觉得我中了大奖,但不幸的是,OpenTick网站似乎已经关闭了它的大门……太糟糕了,因为我觉得这正是我想要的。
我还可以使用每天每个符号的开盘/收盘价格和成交量的数据,但我更喜欢所有的数据,如果我能得到的话。还有其他建议吗?
这个答案不再准确,因为雅虎feed已经不复存在
使用雅虎的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
人物介绍:
从雅虎你可以得到EOD(一天结束)的历史价格,或实时价格。EOD价格下载非常简单。有关如何获取数据和c#代码示例的解释,请参阅我的博客。
我正在编写一个实时数据提要“引擎”,它可以下载并将实时价格存储在数据库中。该引擎最初将能够从雅虎和Interactive Brokers下载历史价格,并能够将数据存储在您选择的数据库中:MS SQL, MySQL, SQLite等。它是开源的,但当我接近发布它的时候(几天内),我会在我的博客上发布更多的信息。
另一个选择是日食交易者…它允许您以低至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文件来填充数据集,然后我通过数据集更新我的实际数据库,它基本上可以匹配从雅虎返回的CSV文件的所有列直接到您的数据库(如果您的数据库不支持批量插入CSV数据,如SQLite)。否则,插入数据是一行程序…只需批量插入CSV到您的数据库。
你可以在这里阅读更多关于url格式的信息:http://www.gummy-stuff.org/Yahoo-data.htm
让我加上我的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。
雅虎是获得初步免费数据的最简单选择。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或其他值得信赖的数据供应商