我正在尝试根据两个收益系列计算年度化季度收益。
给定向量r_a,这非常简单:
r_a <- c(.05, .02, .03, .08, .1, .04, .06, .08)
r_a <- t(t(r_a)) # I just need to transpose the vector
(prod(1+r_a)^(4/nrow(r_a)))-1 # This returns [1] 0.2491168
但是,如果我想基于矩阵格式的多个收益序列,将多个年化收益的向量作为矩阵,则此方法无效:
r_a <- c(.05, .02, .03, .08, .1, .04, .06, .08)
r_b <- c(.1, .1, .1, .1, .1, .1, .1, .12)
mat_ab <- cbind(r_a, r_b)
我该如何编写代码,以使给定具有cols表示不同资产类别收益的矩阵,将向量中每个资产类别的季度年化收益输出?
答案 0 :(得分:3)
我们可以使用
apply(mat_ab, 2, function(col_j){
col_j <- as.matrix(col_j)
(prod(1+col_j)^(4/nrow(col_j)))-1
})
# r_a r_b
0.2491168 0.4773500
此外,如您所见,您的代码使用矩阵对象:
r_a <- c(.05, .02, .03, .08, .1, .04, .06, .08)
r_a <- t(t(r_a))
class(r_a)
# [1] "matrix"
答案 1 :(得分:1)
尽管有accepted answer,但我认为以下内容可能有用。 nrow
被NROW
取代,以便与季度回报向量和矩阵一起使用。
要查看区别:
nrow(1:10)
#NULL
NROW(1:10)
#[1] 10
函数变为
annualized <- function(x, MARGIN = 2){
f <- function(y) (prod(1 + y)^(4/NROW(y))) - 1
if(is.null(dim(x)))
f(x)
else
apply(x, MARGIN = MARGIN, f)
}
r_a <- c(.05, .02, .03, .08, .1, .04, .06, .08)
r_b <- c(.1, .1, .1, .1, .1, .1, .1, .12)
mat_ab <- cbind(r_a, r_b)
annualized(r_a)
#[1] 0.2491168
annualized(mat_ab)
# r_a r_b
#0.2491168 0.4773500