当我有不规则的时间序列数据时,如何使用 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
假设我有以下动物园对象:
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