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.02
与 user 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:将每日收益转换为每月收益的主要内容,如果未能解决你的问题,请参考以下文章
金融时间序列分析用R语言画简单收益率和对数收益率的ACF图?!