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,我们可以使用 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
作为公认解决方案的替代方案,一种更快(> 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))
我有一个每日 returns 的 xts,我想将其转换为每月 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,我们可以使用 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
作为公认解决方案的替代方案,一种更快(> 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))