21

全部,

我希望每隔 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

4 回答 4

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 日的价格水平。

在此处输入图像描述

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

于 2013-03-25T07:24:33.793 回答
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 

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

听起来很简单,但对于交易数据稀少的小批量股票,我不得不考虑数十种特殊情况,并且需要插入大量数据。对于其中一些我知道不正确的结果,我得到了一些非常奇怪的结果。然而,对于大盘股、中盘股和大盘股来说,该解决方案的效果非常好:在大多数情况下,该系列要么与 APPL 数据非常巧妙地同步,要么完美地匹配了他们的谷歌财经档案。

这种方法会引入一些错误,这是无法避免的,我仍然需要对备用小型股的方法进行微调。也就是说,相对于市场和股票的整体走势,将系列移动半小时或填补单个时间增量会引入非常少量的错误。我相信我拥有的这个数据集“足够好”,可以让我获得一些问题的相关答案。将这些东西商业化要花费数千美元。

想法或建议?

于 2013-03-28T18:43:16.773 回答
1

为什么不从Quandl加载数据?例如

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

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

于 2013-03-25T08:33:35.333 回答
0

对于时区偏移,请尝试:

as.POSIXct(1357828200, origin = '1970-01-01', tz=Sys.timezone(location = TRUE))

(tz会根据你的位置自动调整)

于 2016-05-03T07:57:22.657 回答