我想从雅虎下载标准普尔 500 指数、道琼斯指数和 30 年期国债的每日数据,将数据映射到适当的时区,并将它们与我自己的数据合并。我有几个问题。
我的第一个问题是让代码正确。在 yahoo 的网站上,代码看起来是:^GSPC、^DJI 和 ^TYX。但是,^DJI 失败。知道为什么吗?
我的第二个问题是我想将时区限制为 GMT(我想确保我的所有数据都在同一个时钟上,GMT 似乎是一个中立的选择),但我无法让它工作。
我的第三个问题是我想将雅虎数据与我自己的数据合并,这些数据是通过其他方式获得的,并以不同的格式提供。这也是每日数据。
这是我尝试将数据限制在 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 新手,非常愿意听取您关于效率、最佳实践等方面的建议。谢谢。
编辑:解决方案
关于第一个问题:按照 GSee 的建议,可以使用 quantmod 包下载道琼斯工业平均指数数据:因此,不要使用 yahoo 不再提供的“^DJI”代码,而是使用“DJIA”代码。请注意,“DJIA”代码中没有插入符号。
关于第二个问题,Joshua Ulrich 在评论中指出“日期没有时区,因为日子没有时间分量。”
关于第三个问题:正如 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结合使用(否则下载失败)。
非常感谢您的帮助。