我想从雅虎下载S& P 500,道琼斯工业平均指数和30年期国债的每日数据,将数据映射到适当的时区,并将它们与我自己的数据合并。我有几个问题。
我的第一个问题是让代码正确。从雅虎的网站上看,它们的代码如下:^ 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软件包下载道琼斯工业平均指数数据:因此,而不是雅虎不再提供的“^ 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()”中。此代码的一部分灵感来自R - Stock market data from csv to xts。我还发现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 一起使用(否则下载失败)。
非常感谢你的帮助。
答案 0 :(得分:5)
df
对象是从0001年开始的年度数据。因此,这可能不是您想要的。以下是我将如何获取和合并这些系列(或使用环境并仅调用getSymbols
)
library(quantmod)
do.call(cbind, lapply(c("^GSPC", "^TYX"), getSymbols, auto.assign=FALSE))