【问题标题】:Time-series average of cross-sectional correlations横截面相关性的时间序列平均值
【发布时间】:2020-11-15 23:29:46
【问题描述】:

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

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 定义为整数。这是我为 20 个样本 width 尝试的:

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

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

【问题讨论】:

    标签: r time-series correlation


    【解决方案1】:

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

    ###################
    #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']))
      
    }
    

    【讨论】:

    • 这给了我以下错误消息n() must only be used inside dplyr verbs,因为rollapply 来自zoo 包。
    • @Kharon - 好的,所以我刚刚编辑了我的帖子,以便为您的问题提供完整的答案。我可能对您想要的最终输出有点不清楚,但这段代码解决了时间窗口长度不等的问题,因此它应该让您走上正确的道路。如果您希望输出采用不同的格式,请告诉我。
    • 非常感谢!这正是我所需要的。
    • 是否有可能扩展您的方法,以便它还为每个相关性提供 p 值?我使用cor.test 尝试过,但它似乎不起作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-05
    • 2021-11-18
    • 1970-01-01
    • 2016-04-05
    • 1970-01-01
    • 2018-01-01
    • 2015-04-30
    相关资源
    最近更新 更多