1

我遇到了一个小的 quantmod 问题;如果有人可以建议对我的代码进行调整,我将不胜感激。我不知道这样的编程;也许这就是为什么我错过了显而易见的事情。问题的出现是因为getSymbols将字符串作为输入(例如“YHOO”),但只返回 YHOO(不带引号)作为保存数据的 xts 对象。此外,对于市场指数,Yahoo 在代码字符串中包含一个插入符号(例如“^GSPC”),但 quantmod 返回纯 GSPC 作为数据对象。

我正在尝试下载多个代码的数据并将其保存到单个二进制文件中。这是为了创建一个可以从存储在磁盘上的数据运行的工作环境,而不是必须访问互联网。

我尝试编写函数:

buildhist <- function(x,start,end) {
  getSymbols(x, from=start, to=end, adjust=TRUE)   
  save(get(x), file= paste(x, "hist.rda", sep="_"), ascii = FALSE)  
}

然后使用

require(quantmod)
tckr <- c("YHOO","XLB")
lapply(tckr,buildhist,start="1995-01-01",end="2011-11-30")

但是,它在保存命令时出错(说“找不到对象'get(x)'”)。如果我不使用get(x),该save命令只会将股票代码名称保存为字符串,所以我不能使用它。也没有其他版本,如save(noquote(x), file=paste(x, "hist.rda", sep="_"), ascii=FALSE)作品。

我应该使用什么命令,以便使用与 quantmod 最初返回的对象名称相同的对象名称保存代码数据?在我上面的代码中,我什至没有尝试解决另一个问题——如果存在的话,从名称中去除插入符号。对此的任何指示也将不胜感激。

4

3 回答 3

2

更新:下面的解决方案不能解决 OP 的问题(见评论)。跳转后查看编辑。

的默认值auto.assign=TRUE应该使getSymbols交互使用时更容易。在函数中auto.assign=FALSE使用时设置;getSymbols它会让事情变得更容易。

buildhist <- function(x,start,end) {
  y <- getSymbols(x, from=start, to=end, adjust=TRUE, auto.assign=FALSE)
  save(y, file= paste(x, "hist.rda", sep="_"), ascii = FALSE)  
}

您可以通过删除标点符号(包括插入符号)gsub。有关详细信息,请参见?gsub?regex

X <- gsub("[[:punct:]]","",x)  # remove all punctuation
X <- gsub("\\^","",x)          # remove just the carat

我没有测试我最初的答案。该解决方案应该有效。

buildhist <- function(x,start,end) {
  getSymbols(x, from=start, to=end, adjust=TRUE)
  X <- toupper(gsub("\\^","",x))  # what getSymbols.yahoo does
  save(list=X, file= paste(X, "hist.rda", sep="_"), ascii = FALSE)  
}

require(quantmod)
tckr <- c("^GSPC","YHOO","XLB")
lapply(tckr,buildhist,start="1995-01-01",end="2011-11-30")

如果您只使用少量符号的每日数据,您可以将它们全部加载到一个环境中并保存该环境。这可以为你省去很多麻烦。然后,您可以将环境加载到新会话中,附加它,然后将所有数据放在您的手指上。

myEnv <- new.env()
getSymbols(paste(tckr,sep=";"), start="1995-01-01", end="2011-11-30",
  env=myEnv, adjust=TRUE)
save(myEnv, file="myTickerData.rda")
于 2011-12-19T14:00:53.583 回答
2

您可以通过执行类似的操作来验证您的getSymbols通话是否成功summary(YHOO)?你肯定不想写(save(get(x)),因为没有名为“get(x)”的对象。

我怀疑您的问题与正确使用lapply. 这有效:

foo <- 5
oof <- 4
bar<-c("foo","oof")
lapply(lapply(bar,get),sqrt)

(当然你不会buildhist使用sqrt

于 2011-12-19T14:23:50.057 回答
2

在下面,SymbolList 是一个包含符号的向量。IE

SymbolList <- c("IBM","GOOG","YHOO")

使用 getSymbols 获取这些的历史数据

getSymbols(SymbolList)

定义一个函数并使用 do.call,

fun <- function(i) {return(adjustOHLC(get(SymbolList[i]),adjust = "split", use.Adjusted=TRUE))}
mydata <- do.call(merge, lapply(1:length(SymbolList), fun))

这将为您提供合并的数据,以及您可以使用的其他一些东西,即如果您只想要关闭值并调整拆分。

 fun <- function(i) {return(Cl(adjustOHLC(get(SymbolList[i]),adjust = "split", use.Adjusted=TRUE)))}

您可能还想转换为数据框。

mydata<-as.data.frame(mydata)

从那里您可以将其写入 csv 文件。

于 2012-01-02T00:53:56.280 回答