2011-12-19 64 views
1

我困扰于一个小的quantmod问题;如果任何人都可以建议调整我的代码,我真的很感激。我不知道这样的程序;也许这就是为什么我想念这个明显的原因由于getSymbols以字符串作为输入(例如“YHOO”),但是仅返回YHOO(不含引号)作为保存数据的xts对象,所以出现问题。此外,对于市场指数,雅虎在代码字符串中包含一个插入符号(例如“^ GSPC”),但quantmod将普通的GSPC作为数据对象返回。Quantmod将代码保存到循环或提供的文件中

我想下载并保存到单个二进制文件中的多个代理商的数据。这是为了创建一个可以从存储在磁盘上的数据起作用的工作环境,而不是必须要求互联网访问。

我试着写功能:

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") 

但是,它的错误出在保存命令(说 “对象‘获得(x)的’未找到”)。如果我不使用get(x),则save命令将仅将字符串名称保存为字符串,因此我无法使用该名称。没有其他版本,如save(noquote(x), file=paste(x, "hist.rda", sep="_"), ascii=FALSE)也可以。

我应该使用什么命令,以便使用与quantmod最初返回的相同对象名称保存股票代码数据?在我上面的代码中,我甚至没有试图解决另一个问题 - 如果它存在,从名称中剥离脱字符号。任何指向这一点的人都会非常感激。

回答

2

更新:下面的解决方案不能解决OP的问题(请参阅注释)。跳转后查看编辑。

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

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") 
+0

非常感谢Joshua。我试过这个。问题在于对象名称现在存储为y而不是XLB。所以,当我在循环中执行此操作时,所有代码都会保存为y,并且当我从循环中将它们从磁盘加载回来时,它们都是y。我需要重新加载和访问数据,就像我下载新鲜数据后一样。所以,当我进入XLB时需要数据。 – Tatha 2011-12-19 14:18:32

+0

非常感谢指向gsub命令的指针。 – Tatha 2011-12-19 14:19:25

+0

我没有使用quantmod,但手册似乎暗示'getSymbols'不会返回任何内容,只需将该项目加载到环境中即可。这就是为什么我在下面提出我的'lapply'版本的原因。如果我错了,请纠正我 - 我不想让人误入歧途。 – 2011-12-19 14:23:42

2

您可以验证您的通话getSymbols做类似summary(YHOO)成功了吗?你绝对不想写(save(get(x)),因为没有名为“get(x)”的对象。

我怀疑你的问题与正确使用lapply有关。这工作:

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

(这里当然你会使用buildhistsqrt

+0

是getSymbols成功,get(tckr [1])确实显示屏幕上的所有数据。但是,你说得对,它不是一个对象。在quantmod中,可以按照作者上面的建议,将getSymbols分配给一个对象。但是,后来我陷入了保存功能的命名要求。让我试着玩上面的双重代码:) – Tatha 2011-12-19 14:40:53

1

在下面,标志链是具有符号的载体。即

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文件。