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

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

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

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

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

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


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

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

我们使用TickData作为源。它们的价格合理,而且数据的分辨率低于秒级。


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

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

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

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


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

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

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


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

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


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

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

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

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

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


我以前的一个项目打算使用EODData的免费下载数据。


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

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

与滴答滴答的数据情况略有不同。如果只记录时间和销售额,那么所有美国股票每月大约需要30GB的数据。如果你想把买入价/卖出价的变化和交易一起存储,你可以期望每个月150GB。

我希望这能有所帮助。如果还有什么我能帮忙的,请告诉我。


这个答案不再准确,因为雅虎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


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


NASDAQ为每个符号提供10年的历史EOD数据

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

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


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

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

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


我使用eodData.com。它的价格相当公道。每个月只需30美元,你就可以获得美国所有交易所30天的1分钟、5分钟和60分钟的条形图,以及大多数其他交易所1年的EOD数据。


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

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

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


Mathematica现在也提供访问当前和历史股票价格,见 http://reference.wolfram.com/mathematica/ref/FinancialData.html ,如果你刚好有一本的话。


让我加上我的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或其他值得信赖的数据供应商


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

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