R:将每日 returns 转换为每月 returns

R: Convert daily returns to monthly returns

我有一个每日 returns 的 xts,我想将其转换为每月 returns.

我可以找到大量线程将每日 价格 转换为期间 returns,但我需要每天进行转换 returns.

遵循 线程中的建议,效果很好,我注意到 returns 不是几何的,它们是算术的。

因此,我需要像 cumprod(x+1)^(365/12)-1 这样的东西。

但是,用那个替换 sum(cx) 是行不通的。

这是我的代码:

 # Generate data like the type I'm working with    
    testdata <- cbind(rnorm(100,0.0001,0.01),rnorm(100,0.0001,0.01))
    testdata <- as.xts(testdata, order.by = seq(Sys.Date()-99,Sys.Date(),1))


   myFun <- function(x) {
    # need coredata, so c.xts will not be dispatched
     cx <- coredata(x)
     Return = sum(cx)
     }

   MonthlyReturns <- NULL
   for (i in 1:ncol(testdata)){
     MonthlyReturns <- cbind(MonthlyReturns,period.apply(testdata[,i], endpoints(testdata[,i], "months"), 
     myFun))
   }

感谢任何帮助!

编辑 - 输出应与输入格式相同 - table 每月 returns 而不是每天。 xts 或数据框/矩阵。

编辑 - 对于那些对 returns 矩阵的起源感兴趣的人,我正在使用性能分析包中的 Return.annualized 函数,如图 here 所示。 (实际上,我已经使用 Return.cumulative 对其进行了修改,速度要快得多)。所以是的,虽然我确实有一个价格矩阵并且可以很容易地从中计算每月 returns,但我的每日 returns 矩阵中有其他列来自其他计算,因此我需要转换每日 returns,不是每日价格。

由于您希望每月累计每日 returns,我们可以使用 xtsapply.monthly 函数按月应用 PerformanceAnalyticsReturn.cumulative 函数].这给了你你想要的。不错的简单解决方案,无需编写自己的函数。

library(PerformanceAnalytics) # for Return.cumulative function
library(quantmod) # loads xts which has apply.monthly function 

MonthlyReturns <- apply.monthly(testdata, Return.cumulative)
MonthlyReturns
                  [,1]         [,2]
2020-01-31 -0.09507546 -0.090607862
2020-02-29  0.04056104  0.001859122
2020-03-31  0.01451002  0.117231568
2020-04-12  0.01502248  0.026660881

作为公认解决方案的替代方案,一种更快(> 5 倍)获得每月 returns 的方法是将 aggregate 函数与 cumprod 相结合。

 system.time(aggregate(testdata,as.yearmon,function(x) tail(cumprod(1 + x) -1,1)))
   user  system elapsed 
  0.021   0.002   0.023 
 system.time(apply.monthly(testdata, Return.cumulative))
   user  system elapsed 
  0.116   0.002   0.118 

数据:

testdata <- as.xts(cbind(rnorm(10000,0.0001,0.01),rnorm(100,0.0001,0.01)), order.by = seq(Sys.Date()-9999,Sys.Date(),1))