从季度观察中计算年度回报

时间:2019-07-30 07:39:29

标签: r

我正在尝试根据两个收益系列计算年度化季度收益。

给定向量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表示不同资产类别收益的矩阵,将向量中每个资产类别的季度年化收益输出?

2 个答案:

答案 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,但我认为以下内容可能有用。 nrowNROW取代,以便与季度回报向量矩阵一起使用。

要查看区别:

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