横截面相关性的时间序列平均值

Time-series average of cross-sectional correlations

我有一个如下所示的面板数据集:

head(panel_data)

        date      symbol   close  rv   rv_plus rv_minus rskew rkurt  Mkt.RF  SMB   HML
    1 1999-11-19    a      25.4  19.3    6.76    12.6  -0.791  4.36  -0.11  0.35  -0.5 
    2 1999-11-22    a      26.8  10.1    6.44    3.69   0.675  5.38   0.02  0.22  -0.92
    3 1999-11-23    a      25.2  8.97    2.56    6.41  -1.04   4.00  -1.29  0.08   0.3 
    4 1999-11-24    a      25.6  5.81    2.86    2.96  -0.505  5.45   0.87  0.08  -0.89
    5 1999-11-26    a      25.6  2.78    1.53    1.25   0.617  5.60   0.23  0.92  -0.2 
    6 1999-11-29    a      26.1  5.07    2.76    2.30  -0.236  7.27  -0.6   0.570 -0.14

其中变量符号表示不同的股票。我想计算变量 rskew 和 rkurt 之间横截面相关性的时间序列平均值。这意味着我需要计算每个时间点所有不同股票的 rskew 和 rkurt 之间的相关性,然后计算时间序列平均值。

我尝试使用 zoo 包中的 rollapply 函数来实现,但是由于所有日期不同股票的数量并不相同,我不能简单地定义 width 作为一个整数。这是我尝试的样本 width of 20:

panel_data <- panel_data %>%
  group_by(date) %>%
  mutate(cor_skew_kurt = rollapply(data = panel_data[7:8],
                         width=20,
                         FUN=cor,
                         align="right",
                         na.rm=TRUE,
                         fill=NA)) %>%
  ungroup

有没有办法做到这一点而不必为每个日期组定义固定的 width

或者我应该使用不同的方法来做到这一点?

[已编辑] 你可以尝试 运行 下面的代码吗?我重新创建了一个模拟您的问题的示例。如果我正确理解了你的问题,这段代码至少应该让你找到正确的解决方案,因为它解决了时间 window 长度不等的问题。

###################
#Recreating an example dataset with unequal dates across stocks
seed(1)
date6 <- c('1999-11-19','1999-11-22','1999-11-23','1999-11-24','1999-11-26','1999-11-29')
date5 <- c('1999-11-19','1999-11-22','1999-11-23','1999-11-24','1999-11-26')
date4 <- c('1999-11-19','1999-11-22','1999-11-23','1999-11-24')
cor_skew_kurt <- c(rep(NaN,21))
symbol <- c(rep('a',6),rep('b',5),rep('c',4),rep('d',6))
rskew <- rnorm(21,mean=1, sd =1)
rkurt <- rnorm(21, mean=5, sd = 1)
panel_data <- cbind.data.frame(date = c(date6,date5,date4,date6), symbol = symbol, rskew = rskew, rkurt = rkurt, cor_skew_kurt = cor_skew_kurt )
panel_data$date <- as.Date(panel_data$date, '%Y-%m-%d')


# Computing the cor_skew_kurt and filling the table  <- ANSWER TO YOUR QUESTION

for (date in unique(panel_data$date))
{
   panel_data[panel_data$date == date,"cor_skew_kurt"] <-  as.double(cor(panel_data[panel_data$date == date,'rskew'],panel_data[panel_data$date == date,'rkurt']))
  
}