我想从雅虎下载标准普尔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?
Run Code Online (Sandbox Code Playgroud)
这是获取雅虎数据的代码:
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 )
}
Run Code Online (Sandbox Code Playgroud)
这是我的数据集的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")
Run Code Online (Sandbox Code Playgroud)
我想将df中的数据与z中的数据合并.我似乎无法让它发挥作用.
我是R的新手,非常愿意接受有关效率,最佳实践等方面的建议.谢谢.
编辑:解决方案
关于第一个问题:根据GSee的建议,可以使用quantmod软件包下载道琼斯工业平均数据:因此,不是雅虎不再提供的"^ DJI"代码,而是使用"DJIA"代码.请注意,"DJIA"代码中没有插入符号.
关于第二个问题,约书亚乌尔里希在评论中指出"日期没有时区,因为几天没有时间成分."
关于第三个问题:数据框似乎有损坏的日期,正如评论中的agstudy所指出的那样.
我的解决方案依赖于quantmod包和附带的zoo/xts包:
library(quantmod)
Run Code Online (Sandbox Code Playgroud)
这是我用来从我的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)
Run Code Online (Sandbox Code Playgroud)
csv文件中的日期以"19861231"格式存储在单个列中.获取正确日期的关键是将日期包装在"as.character()"中.此代码的一部分灵感来自R - 从csv到xts的股票市场数据.我还发现zoo/xts手册很有帮助.
然后我从这个数据集中提取日期范围:
date.start <- start(dtx)
date.end <- end(dtx)
Run Code Online (Sandbox Code Playgroud)
我将使用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
Run Code Online (Sandbox Code Playgroud)
另请注意,正如GSee在评论中指出的那样,选项auto.assign = FALSE不能与选项env = data一起使用(否则下载失败).
非常感谢你的帮助.
df你提供的对象是从0001年开始的年度数据.所以,这可能不是你想要的.这是我如何获取和合并这些系列(或使用环境,只进行一次调用getSymbols)
library(quantmod)
do.call(cbind, lapply(c("^GSPC", "^TYX"), getSymbols, auto.assign=FALSE))
Run Code Online (Sandbox Code Playgroud)