2

我想从雅虎下载标准普尔 500 指数、道琼斯指数和 30 年期国债的每日数据,将数据映射到适当的时区,并将它们与我自己的数据合并。我有几个问题。

  1. 我的第一个问题是让代码正确。在 yahoo 的网站上,代码看起来是:^GSPC、^DJI 和 ^TYX。但是,^DJI 失败。知道为什么吗?

  2. 我的第二个问题是我想将时区限制为 GMT(我想确保我的所有数据都在同一个时钟上,GMT 似乎是一个中立的选择),但我无法让它工作。

  3. 我的第三个问题是我想将雅虎数据与我自己的数据合并,这些数据是通过其他方式获得的,并以不同的格式提供。这也是每日数据。

这是我尝试将数据限制在 GMT 时区。在我的 R 脚本顶部执行。

Sys.setenv(TZ = "GMT")
# > Sys.getenv("TZ")
# [1] "GMT"
# the TZ variable is properly set
# but does not affect the time zone in zoo objects, why?

这是我获取雅虎数据的代码:

library("tseries")
library("xts")

date.start <- "1999-12-31"
date.end <- "2013-01-01"

# tickers <- c("GSPC","TYX","DJI")
# DJI Fails, why?
# http://finance.yahoo.com/q?s=%5EDJI
tickers <- c("GSPC","TYX") # proceed without DJI

z <- zoo()
index(z) <- as.Date(format(time(z)),tz="")

for ( i in 1:length(tickers) ) 
  { 
     cat("Downloading ", i, " out of ", length(tickers) , "\n")
     x <- try(get.hist.quote(
         instrument = paste0("^",tickers[i])
         , start = date.start
         , end = date.end
         , quote = "AdjClose"
         , provider = "yahoo"
         , origin = "1970-01-01"
         , compression = "d"
         , retclass = "zoo" 
         , quiet = FALSE )
       , silent = FALSE )
     print(x[1:4]) # check that it's not empty
     colnames(x) <- tickers[i]
     z <- try( merge(z,x), silent = TRUE )
}

这是我的数据集的 dput(head(df)):

df <- structure(list(A = c(-0.011489000171423, -0.00020300000323914, 
0.0430639982223511, 0.0201549995690584, 0.0372899994254112, -0.0183669999241829
), B = c(0.00110999995376915, -0.000153000000864267, 0.0497750006616116, 
0.0337960012257099, 0.014121999964118, 0.0127800004556775), date = c(9861, 
9862, 9863, 9866, 9867, 9868)), .Names = c("A", "B", "date"
), row.names = c("0001-01-01", "0002-01-01", "0003-01-01", "0004-01-01", 
"0005-01-01", "0006-01-01"), class = "data.frame")

我想将 df 中的数据与 z 中的数据合并。我似乎无法让它工作。

我是 R 新手,非常愿意听取您关于效率、最佳实践等方面的建议。谢谢。

编辑:解决方案

  1. 关于第一个问题:按照 GSee 的建议,可以使用 quantmod 包下载道琼斯工业平均指数数据:因此,不要使用 yahoo 不再提供的“^DJI”代码,而是使用“DJIA”代码。请注意,“DJIA”代码中没有插入符号。

  2. 关于第二个问题,Joshua Ulrich 在评论中指出“日期没有时区,因为日子没有时间分量。”

  3. 关于第三个问题:正如 agstudy 在评论中指出的那样,数据框的日期似乎已损坏。

我的解决方案依赖于 quantmod 包和附加的 zoo/xts 包:

library(quantmod)

这是我用来从 csv 文件中获取正确日期的代码:

toDate <- function(x){ as.Date(as.character(x), format("%Y%m%d")) }
dtz <- read.zoo("myData.csv"
  , header = TRUE
  , sep = ","
  , FUN = toDate
)
dtx <- as.xts(dtz)

csv 文件中的日期以“19861231”格式存储在单个列中。获得正确日期的关键是将日期包装在“as.character()”中。此代码的一部分灵感来自从 csv 到 xts 的 R-Stock 市场数据。我还发现 zoo/xts 手册很有帮助。

然后我从这个数据集中提取日期范围:

date.start <- start(dtx)
date.end <- end(dtx)

我会将这些日期与 quantmod 的 getSymbols 函数一起使用,以便我下载的其他数据将涵盖同一时期。

这是我用来获取所有三个代码的代码。

tickers <- c("^GSPC","^TYX","DJIA")
data <- new.env() # the data environment will store the data
do.call(cbind, lapply( tickers
    , getSymbols
    , from = date.start
    , to = date.end
    , env = data # data saved inside an environment
    )
  )
ls(data)  # see what's inside the data environment
data$GSPC  # access a particular ticker

另请注意,正如 GSee 在评论中指出的那样,选项auto.assign=FALSE不能与选项env=data结合使用(否则下载失败)。

非常感谢您的帮助。

4

1 回答 1

5
  1. 雅虎不提供 ^DJI 的历史数据。目前,您似乎可以使用股票代码“DJIA”获得相同的数据,但您的里程可能会有所不同。
  2. 在这种情况下它确实有效,因为您只处理日期
  3. 您提供的df对象是从 0001 年开始的年度数据。所以,这可能不是您想要的。

这是我如何获取和合并这些系列(或使用环境并且只调用一次getSymbols

library(quantmod)
do.call(cbind, lapply(c("^GSPC", "^TYX"), getSymbols, auto.assign=FALSE))
于 2013-03-26T16:46:48.983 回答