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

Posted

技术标签:

【中文标题】如何使用 R 下载盘中股市数据【英文标题】:How to download intraday stock market data with R 【发布时间】:2013-03-14 14:40:11 【问题描述】:

全部,

我希望每隔 15 到 60 分钟从 Yahoo 或 Google 下载一次股票数据,以获取尽可能多的历史数据。我想出了一个粗略的解决方案如下:

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 文件上的时间戳?

【问题讨论】:

在尝试使用 getURL 时授权失败。我自己一直在一些拍卖网站上使用它,并且我使用应用程序 Emacs 的功能来让代码按时间间隔运行。它甚至可以在您编程时为您编辑文本。不知道时间部分还没有解决吗? 【参考方案1】:

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

使用您的示例中的链接https://www.google.com/finance/getprices?i=900&amp;p=1000d&amp;f=d,o,h,l,c,v&amp;df=cpct&amp;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 日的价格水平。

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

【讨论】:

好问题。好答案!几天前,我意识到这个谷歌金融 API 不再工作了。因此,当我复制粘贴您的答案/问题的链接时,如果我在谷歌搜索字段中输入“AAPL”,我将被转发到标准谷歌搜索结果。有没有人有解决方案,或者我还没有找到一个新的网络链接?谢谢。【参考方案2】:

因此,下载和标准化数据最终比我想象的要麻烦得多——大约 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 数据非常巧妙地同步,要么完美地匹配了他们的谷歌财经档案。

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

想法或建议?

【讨论】:

Interactive Brokers 无需花费数千美元,您可以获得数千种股票、债券、期货、外汇、期权等的日内数据。请参阅IBrokers package 和我的twsInstrument package。其他想法:stat.ethz.ch/pipermail/r-sig-finance/2013q1/011417.html 这看起来不错。您需要一个 ibrokers 帐户来实施这些软件包,对吗?目前我在optionshouse,需要依靠我的解决方案在短期内刮掉谷歌。不过,对高分辨率数据的持续访问可能会提供另一种转换的动力。 是的,您需要一个 IB 账户。我认为每月大约需要 10 至 20 美元的维护费,但如果您在佣金上花费这么多,则可以免除该费用。 知道了,谢谢。在我与 IB 建立之前,似乎抓取 Google 或 Yahoo 数据是我最好的选择。这些是一些很好的指示。有 R 包允许用户与 IB 的数据流交互的事实非常酷......【参考方案3】:

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

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

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

【讨论】:

【参考方案4】:

对于时区偏移,尝试:

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

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

【讨论】:

这是一个已被接受的老问题。你能补充一下为什么你的答案更好/不同吗? 这是一个国际答案。无需在 as.POSIXct 函数中调整时区。 (通过添加 tz=Sys.timezone(location = TRUE))

以上是关于如何使用 R 下载盘中股市数据的主要内容,如果未能解决你的问题,请参考以下文章

百度网盘中的文件如何下载到电脑

我将如何使用 Processing、jQuery、Pure Data 或 Max/MSP 绘制“实时”股市数据?

如何在Win7安装U盘中加入USB3.0驱动的支持

如何线程中通信?

股市数据馈送如何工作?

如何在ubuntu启动盘中恢复win11的系统引导?