是否有人在时间序列数据集中计算历史平均日志回报?
数据集按个别安全性排序,并按时间为每个相应的安全性排序。我试图形成一个历史平均日志返回,即每个安全性的每个时间点,安全性从数据集中的第一次出现到目前为止的平均日志返回。
幸运的是,返回时间序列包含不同证券的回报之间的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)
任何想法如何提高速度都将受到高度赞赏!
答案 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)