历史股票数据来源

时间:2009-04-16 03:01:55

标签: artificial-intelligence simulation finance stocks

我正在尝试制作股票市场模拟器(可能最终会成长为预测AI),但我无法找到要使用的数据。我正在寻找一个(希望是免费的)历史股市数据来源。

理想情况下,它将是一个非常细粒度(第二或每分钟间隔)的数据集,其中包含纳斯达克和纽约证券交易所(如果我喜欢冒险)的每个符号的价格和数量。有谁知道这些信息的来源?

我发现this question表示雅虎提供了CSV格式的历史数据,但我一直无法了解如何粗略检查链接的网站。

我也不喜欢在CSV文件中逐个下载数据的想法......我想雅虎会在最初的几千个请求之后感到不安并关闭我。

我还发现another question让我觉得我中了大奖,但不幸的是,OpenTick网站似乎已经关门了......太糟糕了,因为我认为它们正是我想要的。< / p>

我还能够使用每天只打开/关闭价格和每个符号的数量的数据,但如果我能得到它,我会更喜欢所有数据。还有其他建议吗?

18 个答案:

答案 0 :(得分:219)

让我加上我的2美分,我的工作是为对冲基金获得良好和干净的数据,我见过很多数据源和历史数据提供商。这主要是关于美国股票数据。

首先,如果你有一些钱不打扰从雅虎下载数据,直接从 CSI data 获取日终数据,这是雅虎获得他们的EOD的地方数据以及AFAIK。他们有一个API,您可以在其中将数据提取到您想要的任何格式。我认为每年的数据订阅价格只有100美元。

从免费服务下载数据的主要问题是,您只能获得仍然存在的股票,这称为Survivorship Bias,如果您查看许多股票,可能会给您错误的结果,因为您只会包含到目前为止的那些,而不是被除名的那些。

为了解决一些日内数据,我会研究 IQFeed ,它们提供了几个API来提取历史数据,尽管它们主要是实时源的装备。但是这里有很多选择,一些经纪人甚至通过他们的API提供历史数据下载,所以只需选择你的毒药。

但通常所有这些数据都不是很干净,一旦你真正开始测试,你就会看到某些股票缺失或者显示为两个不同的符号,或者股票拆分没有得到适当考虑等等。然后你意识到历史股息数据也是必需的,因此您开始在圈子中运行,从100个不同的数据源修补数据等等。因此,从“折扣”数据源开始,但是只要您运行更全面的回溯测试,您可能会遇到问题,具体取决于您的操作。如果你只是看一下,比如S&amp; P 500股票,这不会是一个问题,而且“便宜”的日内交易会做。

你找不到的是免费的日内数据。我的意思是你可能会找到一些例子,我确信有5年的MSFT嘀嗒数据存在,但这不会让你走得太远。

然后,如果你需要真实的东西(二级订单,所有滴答,因为它们在所有交易所发生),一个“负担得起”,但很好的选择是 Nanex 。它们实际上会向您发送带有数TB数据的驱动器。如果我记得每年约3万美元4K的数据。相信我,一旦你了解获得好的日内数据有多难,你就不会认为这是非常多的钱。

不要劝阻你,但要获得好的数据是很难的,事实上许多对冲基金和银行花费数十万美元一个月来获取他们可以信任的数据。再一次,你可以从某个地方开始,然后从那里开始,但在上下文中看到它有点好。


编辑:上面的答案来自我自己的经验。关于可用数据Feed的This write-up from Caltech会提供更多见解,特别推荐 QuantQuote

答案 1 :(得分:93)

当YAHOO饲料已经存在时,这个答案不再准确

使用上面的Yahoo 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

答案 2 :(得分:43)

我知道你想要“免费”,但如果我是你,我会认真考虑从csidata.com获取大约300美元/年的数据。

这是雅虎用来提供数据的。

它带有一个不错的API,而且(据我所知)数据非常干净。

订阅时,您可以获得10年的历史记录,之后每晚都会进行更新。

他们还会照顾各种令人讨厌的事情,比如拆分和分红。如果你还没有发现数据清理的快乐,你就不会意识到你需要多少,直到你的ATS(自动交易系统)第一次认为某些股票真的很便宜,只是因为它分裂2 :1,你没注意到。

答案 3 :(得分:15)

<强>说明:
从雅虎,您可以获得EOD(一天结束)历史价格或实时价格。 EOD价格下载非常简单。有关如何获取数据和C#代码示例的说明,请参阅my blog

我正在编写一个实时数据源“引擎”,可以将实时价格下载并存储在数据库中。该引擎最初将能够从Yahoo和Interactive Brokers下载历史价格,它将能够将数据存储在您选择的数据库中:MS SQL,MySQL,SQLite等。它是开源的,但我会发布更多当我接近发布它时(几天之内)我的博客上的信息。

另一个选项是eclipse trader ...它允许您以最低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文件来填充DataSet然后我通过DataSet更新我的实际数据库,它基本上可以匹配所有的CSV文件中的列直接从Yahoo返回到您的数据库(如果您的数据库不支持批量插入CSV数据,如SQLite)。否则,插入数据是一行的......只需将CSV批量插入数据库即可。

您可以在此处详细了解网址的格式:http://www.gummy-stuff.org/Yahoo-data.htm

答案 4 :(得分:14)

纳斯达克和纽约证券交易所在第二或每分钟间隔的每个符号的数据集将大量

假设两家交易所共有4000家公司上市(由于纳斯达克上市有over 3200 companies,这可能是非常低的一面)。对于第二个时间间隔的数据,假设一天中有6.5个交易小时,那么每个公司每天可以获得23400个数据点,或者那一天的总数约为93,600,000个数据点。假设一年有200个交易日,那一年只有18,720,000,000个数据点。

也许你想先从较小的一套开始?

答案 5 :(得分:9)

纳斯达克为每个符号提供10年的历史EOD数据

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

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

答案 6 :(得分:8)

对于生存偏差免费数据,我发现唯一可靠的来源是QuantQuote(http://quantquote.com

数据以分钟,秒或刻度线分辨,链接到historical stock data

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

答案 7 :(得分:7)

不幸的是,很难获得免费的历史自动收报机数据。既然opentick死了,我也不知道其他任何提供者。

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

我们使用TickData作为源代码。他们的价格合理,数据有次低分辨率。

答案 8 :(得分:6)

让我添加一个我刚发现的来源,找到here

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

答案 9 :(得分:6)

我们已经从Kibot.com购买了12年的日内数据,并对质量非常满意。

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

随着滴答滴答数据情况略有不同。如果您仅记录时间和销售额,那么对于所有美国股票而言,这将是每月约30GB的数据。如果您想将出价/询价变更与交易一起存储,您可以预期每月约150GB。

我希望这会有所帮助。如果还有其他任何我可以帮到你的事,请告诉我。

答案 10 :(得分:5)

现在,Mathematica还提供对当前和历史股票价格的访问,请参阅 http://reference.wolfram.com/mathematica/ref/FinancialData.html ,如果你碰巧有它的副本。

答案 11 :(得分:4)

您可以使用yahoo获取每日数据(更易于管理的数据集),但您必须构建网址。见link。你没有提出很多小请求,你正在减少大量请求。很多免费软件使用这个,所以他们不应该让你失望。

编辑:This家伙这样做,也许你可以查看他的软件所做的调用。

答案 12 :(得分:4)

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

我使用this wiki page使用以下脚本下载所有公司代码(我不是一个非常有才华的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或其他人)

答案 13 :(得分:3)

为什么不用布朗运动模拟假股市?

这样做有很多资源。易于实施。

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

答案 14 :(得分:3)

我使用的是eodData.com。它的价格相当不错。每月30美元,您可以获得所有美国交易所的30天1,5和60分钟的酒吧以及大多数其他交易所1年的EOD数据。

答案 15 :(得分:2)

我抓取finance.google.com(报价) - 或finance.yahoo.com。

这些都将返回世界上大多数交易所的html页面,包括历史。然后,只需解析HTML即可提取所需内容。

我过去做过这个,取得了巨大的成功。或者,如果您不介意使用Perl - CPAN上有几个模块已经为您完成了这项工作 - 即从Google / Yahoo中提取引号。

有关详情,请参阅Quote History

答案 16 :(得分:1)

查看Mergent Historical Securities Data API - http://www.mergent.com/servius

答案 17 :(得分:1)

我以前的一个项目将使用来自EODData的免费下载数据。