R:将每日收益转换为每月收益

Posted

技术标签:

【中文标题】R:将每日收益转换为每月收益【英文标题】:R: Convert daily returns to monthly returns 【发布时间】:2020-07-22 01:14:58 【问题描述】:

我有一个 xts 的每日回报,我想将其转换为每月回报。

我可以找到大量线程将每日价格转换为期间收益,但我需要转换每日收益

遵循this 线程中的建议,效果很好,我注意到返回不是几何的,而是算术的。

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

但是,将 sum(cx) 替换为 that 不起作用。

这是我的代码:

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

任何帮助表示赞赏!

编辑 - 输出应该与输入的格式相同 - 每月回报表而不是每日回报表。 xts 或数据框/矩阵。

编辑 - 对于那些对返回矩阵的来源感兴趣的人,我正在使用 Performance Analytics 包中的 Return.annualized 函数,如 here 所示。 (实际上,我已经使用Return.cumulative 对其进行了修改,速度要快得多)。所以是的,虽然我确实有一个价格矩阵并且可以从中轻松计算每月回报,但我的每日回报矩阵中有其他计算的额外列,因此我需要转换每日回报,而不是每日价格。

【问题讨论】:

您能分享一下您希望输出的样子吗? 更新了原帖。基本上输出应该与输入相同,除了按月而不是按天。 为了澄清returns,这已经根据basis计算?我想 dput() 在这里会很有用。 【参考方案1】:

作为公认解决方案的替代方案,获得每月回报的更快方法(> 5 倍)是将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))

【讨论】:

太棒了,谢谢!这比我的特定数据快 2.5 倍 - 每一点都有帮助! 在我的笔记本电脑上运行了 7 次,哈哈。 (外星人 M17)user system elapsed 0.02 0.00 0.02user system elapsed 0.14 0.00 0.14【参考方案2】:

由于您想要每月累积每日收益,我们可以使用xts 中的apply.monthly 函数每月应用PerformanceAnalytics 中的Return.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

【讨论】:

嘿,我真是个笨蛋!我在其他地方使用过这个功能,所以不知道为什么我也没有想到在这里使用它......谢谢!

以上是关于R:将每日收益转换为每月收益的主要内容,如果未能解决你的问题,请参考以下文章

用时间序列模型严肃证明A股收益率是0

金融时间序列分析用R语言画简单收益率和对数收益率的ACF图?!

夏季每日一题打卡day3 —— AcWing 3499. 序列最大收益

使用 Pandas DataFrame 计算每日收益

干货:如何建立自己的操作系统!!

Python中的约束逻辑回归(结果变量)