我尝试着创造一个股票市场模拟器(也许最终会发展成一个预测AI),但是我在寻找数据方面遇到了困难。我正在寻找(希望是免费的)历史股票市场数据的来源。
理想情况下,它将是一个非常细粒度(秒或分钟间隔)的数据集,包含纳斯达克和纽约证券交易所(如果我有冒险精神,可能还包括其他)的每个符号的价格和交易量。有人知道这类信息的来源吗?
我发现这个问题表明雅虎提供CSV格式的历史数据,但我一直无法找到如何在粗略的检查网站链接得到它。
我也不喜欢在CSV文件中逐个下载数据的想法……我想雅虎会很生气,在我收到几千个请求后就把我关了。
我还发现了另一个问题,让我觉得我中了大奖,但不幸的是,OpenTick网站似乎已经关闭了它的大门……太糟糕了,因为我觉得这正是我想要的。
我还可以使用每天每个符号的开盘/收盘价格和成交量的数据,但我更喜欢所有的数据,如果我能得到的话。还有其他建议吗?
人物介绍:
从雅虎你可以得到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
雅虎是获得初步免费数据的最简单选择。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或其他值得信赖的数据供应商