R:使用apply.fromstart计算收益和标准差

R:使用apply.fromstart计算收益和标准差,r,performanceanalytics,R,Performanceanalytics,我想找出一个人在一段时间内的总回报以及他的回报的标准差。我在PerformanceAnalytics包中找到了一个函数,apply.fromstart,它看起来非常有前途。然而,我很难实施它 以下是我所拥有的: 包含各种数据的数据帧,包括每个时段的返回: 小时数据 Time Position 2014-08-01 01:00:00 1.01 2014-08-01 02:00:00 0.99 2014-08-01 03:00

我想找出一个人在一段时间内的总回报以及他的回报的标准差。我在
PerformanceAnalytics
包中找到了一个函数,
apply.fromstart
,它看起来非常有前途。然而,我很难实施它

以下是我所拥有的: 包含各种数据的数据帧,包括每个时段的返回:
小时数据

        Time            Position  
2014-08-01 01:00:00      1.01    
2014-08-01 02:00:00      0.99  
2014-08-01 03:00:00      1.01  
2014-08-01 04:00:00      1.02  
我想找出每个时期的总回报,如下所示:

Period                TotalReturn
2014-08-01 01:00:00      1.01    
2014-08-01 02:00:00      1.01*0.99
2014-08-01 03:00:00      1.01*.099*1.01
2014-08-01 04:00:00      1.01*.099*1.01*1.02
我的代码当前为:
apply.fromstart(hourlyData[,2,drop=FALSE],FUN=“*”,width=1)

我还想找出他的回报的标准差。我的这部分代码如下:
apply.fromstart(hourlyData[,2,drop=FALSE],FUN=“sd”,width=1)

hourlyData$Position
的数据类型为“zoo”

我收到以下错误:
在zoo中(NA,order.by=as.Date(time(R)):
如果“order.by”中的索引项不唯一,则“zoo”对象的某些方法不起作用

我已经检查过了,我的行名称中没有重复项

以下是运行dput(hourlyData)的结果:


使用非常有效的矢量化基R函数
cumprod
获得第一个所需的结果。而第二个结果可以使用一个简单的
*apply
循环实现(效率较低)

如果你想继续学习
zoo
课程,请

cumprod(hourlyData$Position)
#         1         2         3         4         5         6 
# 1.0000000 0.9929392 0.9224669 0.9754125 1.0673348 1.1547867
否则

cumprod(as.numeric(hourlyData$Position))
## [1] 1.0000000 0.9929392 0.9224669 0.9754125 1.0673348 1.1547867
对于
sd
(由@akrun提议)(使用
vapply
代替
sapply
,以“挤压”其最大性能)


你能不能只使用
Reduce(
*
,hourlyData$Position)
cumprod(as.numeric(hourlyData$Position))
如@akrun
sapply(seq_len(nrow(hourlyData)),function(i)sd(hourlyData$Position[1:i])
btw,只要
cumprod(hourlyData$Position)
完美,您就可以在运行
cumprod
时保持您的
zoo
课程,非常感谢!如果你愿意,给这个问题添加一个答案,这样我就可以接受了。再次感谢@David Arenburg,您可以查看累积标准偏差的“非*
apply
calculation”(似乎很快)。
cumprod(as.numeric(hourlyData$Position))
## [1] 1.0000000 0.9929392 0.9224669 0.9754125 1.0673348 1.1547867
vapply(seq_len(nrow(hourlyData)), function(i) sd(hourlyData$Position[1:i]), FUN.VALUE = double(1))
# [1] NA 0.004992723 0.039097989 0.052519398 0.063598345 0.063156702