有时候需要计算同一个data frame中的多支股票的收益率,实现这一目的最鲁莽的做法是对列进行循环。这个方法有失美观且不够高效。显式循环是应用R语言的大忌之一,所以才有了*apply族函数的诞生,可是有时候,*apply函数也不是必要的。比如在计算多支股票收益率的时候,就可以用TTR包中的ROC函数代替。> require(quantmod)
> symbols < -c('FNMIX','DBLTX','AGG','^GSPC')
> getSymbols(symbols, src="yahoo", from="2012-01-01", to=Sys.Date())
[1] "FNMIX" "DBLTX" "AGG" "GSPC"
> y < - merge(Ad(FNMIX), Ad(DBLTX), Ad(AGG), Ad(GSPC))
> head(ROC(y))
FNMIX.Adjusted DBLTX.Adjusted AGG.Adjusted GSPC.Adjusted
2012-01-02 NA NA NA NA
2012-01-03 -0.001278773 0.000000000 -0.0013740670 0.000187914
2012-01-04 -0.001280410 0.000000000 0.0013740670 0.002939385
2012-01-05 -0.001282051 0.000922084 0.0008235348 -0.002540185
2012-01-08 -0.001283697 0.000000000 -0.0008235348 0.002259128
2012-01-09 -0.001285347 0.001841621 -0.0002746624 0.008846519如果你细看ROC函数的内容:> ROC
function (x, n = 1, type = c("continuous", "discrete"), na.pad = TRUE)
{
x < - try.xts(x, error = as.matrix)
type
if (is.xts(x)) {
if (type == "discrete") {
roc
}
if (type == "continuous") {
roc
}
reclass(roc, x)
}
else {
NAs
if (na.pad) {
NAs
}
if (type == "discrete") {
roc
1)
}
if (type == "continuous") {
roc
}
return(roc)
}
}
会发现ROC主要调用了base包中的log函数和diff函数。