使用 1 年 window 在每个月底计算 return 的波动率

calculating volatility of return at end of each month using 1 year window

我正在处理股票 return 的时间序列。数据包括从 1985 年到 2010 年的数千只股票和每只股票的每日 returns。由于交易暂停,缺少 returns。对于每只股票,我试图使用前一年 returns 计算每个月末(数据集中每个月的最后一个交易日)的移动波动率。我有一些数据:

         date name   return
   1985-01-01    A   -0.044
   1985-01-01    C    0.038
   1985-01-02    A    0.041
   1985-01-02    B   -0.005
   1985-01-02    C   -0.052
   1985-01-03    B    0.018
   1985-01-03    C   -0.034

注意B公司在1985-01-01没有交易,所以当天没有return数据。我查找了一些有用的软件包,例如 TTR、zoo、xts。但是所有函数都需要输入每年的期数,每个股票都不一样。我模糊的想法是先在xts中使用split按公司名称拆分数据,然后应用endpoints函数找到每个月的最后一天。我被困在那里。由于我有一个大数据集,我更喜欢一些快速的方法。谢谢!

假设末尾注释中显示的数据可重现,并且还假设每个日期至少出现在一只股票中(但不需要出现在任何特定股票中)。 252 通常使用一年,对于大多数用途来说可能足够接近;然而,考虑到我们在这个例子中使用 2 的问题中的数据长度:

library(zoo)

z <- read.zoo(DF, split = "name")
r <- rollapplyr(z, 2, sd, na.rm = TRUE)
aggregate(r, as.yearmon, tail, 1)
##           A          B          C
## Jan 1985 NA 0.01626346 0.01272792

备注

Lines <- "
         date name   return
   1985-01-01    A   -0.044
   1985-01-01    C    0.038
   1985-01-02    A    0.041
   1985-01-02    B   -0.005
   1985-01-02    C   -0.052
   1985-01-03    B    0.018
   1985-01-03    C   -0.034"

library(zoo)
DF <- read.table(text = Lines, header = TRUE)