时间序列中的平均回报 - 在NA值之后重新启动 - rstudio

时间:2017-08-02 15:47:14

标签: r

是否有人在时间序列数据集中计算历史平均日志回报?

数据集按个别安全性排序,并按时间为每个相应的安全性排序。我试图形成一个历史平均日志返回,即每个安全性的每个时间点,安全性从数据集中的第一次出现到目前为止的平均日志返回。

幸运的是,返回时间序列包含不同证券的回报之间的NA。我的想法是计算出现在每个NA之后重新开始的历史平均值。

简单的 cumsum()可能不会这样做,因为必须删除NAs。

我想过使用 rollmean(),如果我只知道一种有效的方法来指定宽度'连续先前非NA的向量长度的参数。 鉴于我正在使用的数据集的大小,我基于Count how many consecutive values are true的当前方法花费了太多时间。 对于任何形式为x的x:[r(1)r(2)... r(N)],其中r(2)是句点2中的对数回报:

df <- data.frame(x, zcount = NA) 
df[1,2] = 0 #df$x[1]=NA by construction of the data set
for(i in 2:nrow(df)) 
df$zcount[i] <- ifelse(!is.na(df$x[i]), df$zcount[i-1]+1, 0)

任何想法如何提高速度都将受到高度赞赏!

1 个答案:

答案 0 :(得分:0)

您需要重塑data.frame以应用cumsum函数 在每个安全。方法如下:

首先,我将在100个月内生成100个证券的一些数据,我认为这些数据与您对数据集的描述相对应

securities <- 100
months <- 100
time <- seq.Date(as.Date("2010/1/1"), by = "months", length.out = months)
ID <- rep(paste0("sec", 1:months), each = securities)
returns <- rnorm(securities * months, mean = 0.08, sd = 2)

df <- data.frame(time, ID, returns)
head(df)
        time   ID    returns
1 2010-01-01 sec1 -3.0114466
2 2010-02-01 sec1 -1.7566112
3 2010-03-01 sec1  1.6615731
4 2010-04-01 sec1  0.9692533
5 2010-05-01 sec1  1.3075774
6 2010-06-01 sec1  0.6323768

现在,您必须重塑数据,以便每个安全列都包含它 返回,每行代表日期。

library(tidyr)
df_wide <- spread(df, ID, returns)

完成此操作后,您可以使用apply函数对现在代表每个安全性的每个列求和。或者使用cumsum功能。请注意数据对象df_wide[-1],它会删除time列。这是避免sum或cumsum函数抛出错误所必需的。

matrix_sum <- apply(df_wide[-1], 2, FUN = sum)

matrix_cumsum <- apply(df_wide[-1], 2, FUN = cumsum)

现在,如果您愿意,请将time列添加回data.frame

df_final <- data.frame(time = df_wide[,1], matrix_cumsum)