当我有不规则的时间序列数据时,如何使用 1 小时滚动 window 来计算 sd(x)?

How to calculate sd(x) using 1 hour rolling window when I have irregular time series data?

假设我有以下动物园对象:

 prices.zoo <- read.zoo(data.frame(tm = c(as.POSIXct('2000-05-10 07:50:00'), as.POSIXct('2000-05-10 08:55:00'), as.POSIXct('2000-05-10 09:00:00'), as.POSIXct('2000-05-10 09:10:00'), as.POSIXct('2000-05-10 09:20:00'), as.POSIXct('2000-05-10 09:55:00'), as.POSIXct('2000-05-10 11:35:00')), px = c(10,20,30,40,50,60,70)))
> prices.zoo
2000-05-10 07:50:00 2000-05-10 08:55:00 2000-05-10 09:00:00 2000-05-10 09:10:00 2000-05-10 09:20:00 2000-05-10 09:55:00 
                 10                  20                  30                  40                  50                  60 
2000-05-10 11:35:00 
                 70 

如何计算 sd(px),即历史波动率,每 5 分钟 使用 1 小时的滚动window?

NOTE: I would prefer a base-R implementation using zoo or data.frame

rollapplyr中的宽度可以是一个向量,表示要翻转多少点。下面使用的 findInterval 给出了当前时间之前不到一小时的点数,如果我们从当前位置减去它,我们就会得到适当的宽度。

n <- length(prices.zoo)
tt <- time(prices.zoo)
w <- 1:n - findInterval(tt - 3600, tt)
rollapplyr(prices.zoo, w, sd, fill = NA)
## 2000-05-10 07:50:00 2000-05-10 08:55:00 2000-05-10 09:00:00 2000-05-10 09:10:00 
##                  NA                  NA            7.071068           10.000000 
## 2000-05-10 09:20:00 2000-05-10 09:55:00 2000-05-10 11:35:00 
##           12.909944           12.909944                  NA 

另一种可能性是忘记 1 小时的要求,只使用最后的 k 点。例如

rollapplyr(prices.zoo, 3, sd, fill = NA)
## 2000-05-10 07:50:00 2000-05-10 08:55:00 2000-05-10 09:00:00 2000-05-10 09:10:00 
##                  NA                  NA                  10                  10 
## 2000-05-10 09:20:00 2000-05-10 09:55:00 2000-05-10 11:35:00 
##                  10                  10                  10