如何用R下载盘中股市数据

时间:2013-03-25 07:00:03

标签: r finance stockquotes quandl

全部,

我希望以15-60分钟的间隔从雅虎或谷歌下载股票数据,以获得尽可能多的历史记录。我想出了一个粗略的解决方案如下:

library(RCurl)
tmp <- getURL('https://www.google.com/finance/getprices?i=900&p=1000d&f=d,o,h,l,c,v&df=cpct&q=AAPL')
tmp <- strsplit(tmp,'\n')
tmp <- tmp[[1]]
tmp <- tmp[-c(1:8)]
tmp <- strsplit(tmp,',')
tmp <- do.call('rbind',tmp)
tmp <- apply(tmp,2,as.numeric)
tmp <- tmp[-apply(tmp,1,function(x) any(is.na(x))),]

鉴于我想要导入的数据量,我担心这可能是计算上昂贵的。我也不了解我的生活,了解雅虎和谷歌的时间戳是如何编码的。

所以我的问题是双重的 - 将一系列股票的数据快速提取到R中的简单,优雅的方法是什么?如何解释我将使用的Google / Yahoo文件的时间戳?

4 个答案:

答案 0 :(得分:22)

我会先尝试回答时间戳问题。请注意这是我的解释,我可能是错的。

使用示例https://www.google.com/finance/getprices?i=900&p=1000d&f=d,o,h,l,c,v&df=cpct&q=AAPL中的链接,我得到以下数据:

EXCHANGE%3DNASDAQ
MARKET_OPEN_MINUTE=570
MARKET_CLOSE_MINUTE=960
INTERVAL=900
COLUMNS=DATE,CLOSE,HIGH,LOW,OPEN,VOLUME
DATA=
TIMEZONE_OFFSET=-300
a1357828200,528.5999,528.62,528.14,528.55,129259
1,522.63,528.72,522,528.6499,2054578
2,523.11,523.69,520.75,522.77,1422586
3,520.48,523.11,519.6501,523.09,1130409
4,518.28,520.579,517.86,520.34,1215466
5,518.8501,519.48,517.33,517.94,832100
6,518.685,520.22,518.63,518.85,565411
7,516.55,519.2,516.55,518.64,617281
...
...

请注意第一列a1357828200的第一个值,我的直觉是这与POSIXct有关。因此快速检查:

> as.POSIXct(1357828200, origin = '1970-01-01', tz='EST')
[1] "2013-01-10 14:30:00 EST"

所以我的直觉似乎是正确的。但时间似乎已经过去了。现在我们在数据中还有一个信息。 TIMEZONE_OFFSET=-300。因此,如果我们将时间戳减去这个数量,我们应该得到:

as.POSIXct(1357828200-300*60, origin = '1970-01-01', tz='EST')
[1] "2013-01-10 09:30:00 EST"

请注意,我不知道您要求的日期数据。但快速检查谷歌财务显示,这些确实是2013年1月10日的价格水平。

enter image description here

第一列的剩余值似乎与第一行值有某种偏移。

答案 1 :(得分:3)

因此,下载和标准化数据最终比我想象的要多得多 - 约150行代码。问题在于,虽然Google为所有交易所交易的股票提供了过去50个培训日的数据,但日内的时间戳并未标准化:例如,指数“1”可能指的是第二个时间增量中的第一个在数据集的第一个交易日。更糟糕的是,仅以低交易量交易的股票只有记录交易的条目。对于像APPL这样的大批量股票没有问题,但对于小批量小盘股而言,这意味着如果不是大多数数据,你的系列将会丢失很多。这是有问题的,因为我需要所有的股票系列整齐地放在彼此之间进行我正在进行的分析。

幸运的是,数据仍然存在一般结构。使用此链接:

https://www.google.com/finance/getprices?i=1800&p=1000d&f=d,o,h,l,c,v&df=cpct&q=AAPL 

并在最后更改股票代码将以1/2小时的增量为您提供过去50天的交易日。由@geektrader非常有效地解码的POSIX时间戳以3周的间隔出现在时间戳列中。虽然时间戳索引并不总是以方便的1:1方式对应(我几乎怀疑这是谷歌的故意),但有一种模式。例如,对于半个小时的系列,我查看了连续三周增量的第一个交易日,统一的时间戳索引在1:15附近运行。这可能是1:13,1:14,2:15 - 这一切都取决于股票。我不确定第14和第15条是什么:我怀疑它们是每日摘要或非工作时间的交易信息。关键是你没有可以依赖的一致模式。遗憾的是,训练日的第一张邮票并不总是包含开场数据。最后一个条目和结束数据也是一样的。我发现知道实际代表交易数据的唯一方法是将数字与Google地图上的系列进行比较。经过几天的futiley试图弄清楚如何从数据中撬出1:1的映射模式,我决定采用“球场”策略。我删除了APPL的数据(非常大量的交易股票)并在每个交易日内设置其时间戳索引作为整个市场的参考值。所有的日子都有至少13个增量,相当于6.5个小时的交易日,但有些人有14个或15个。在这种情况下,我只是通过采取前13个指数来截断。从那里我使用while循环来基本上逐步浏览每个股票代码的下载数据,并将给定培训日内的时间戳索引与APPL时间戳进行比较。我保持重叠,填补缺失的数据,并切出不重叠的部分。

听起来像是一个简单的解决方案,但对于交易数据稀少的小批量股票,实际上有几十个特殊情况需要我加入并且要插入大量数据。对于其中一些我知道不正确的结果,我得到了一些非常奇怪的结果。然而,对于大批量,中型和大型股票而言,该解决方案非常出色:在大多数情况下,该系列与APPL数据非常巧妙地同步,并完美匹配其Google财经资料。

没有办法解决这个方法引入一些错误的问题,我仍然需要微调备用小型大写的方法。也就是说,相对于市场和股票的整体变动,将一系列转移半个小时或填补单个时间增量的间隙引入了非常小的误差。我相信我拥有的这个数据集“足够好”,可以让我对我所拥有的一些问题得到相关答案。从商业上获得这些东西需花费数千美元。

想法或建议?

答案 2 :(得分:1)

为什么不加载Quandl的数据? E.g。

library(Quandl)
Quandl('YAHOO/AAPL')

更新:抱歉,我刚刚意识到只有每日数据是通过Quandl获取的 - 但我在这里留下我的答案,因为Quandl在类似情况下很容易查询

答案 3 :(得分:0)

对于时区偏移,请尝试:

as.POSIXct(1357828200,origin =&#39; 1970-01-01&#39;,tz = Sys.timezone(location = TRUE))

(tz将根据您的位置自动调整)