从 R 中的 rollapply 获取交易日

Obtaining trading days from rollapply in R

我有以下 y 列的模拟数据集,具有 2018 年的固定交易日(比如 250 个)。

data
# A tibble: 249 × 2
   Date                     y
   <dttm>               <dbl>
 1 2018-01-02 00:00:00  0.409
 2 2018-01-03 00:00:00 -1.90 
 3 2018-01-04 00:00:00  0.131
 4 2018-01-05 00:00:00 -0.619
 5 2018-01-08 00:00:00  0.449
 6 2018-01-09 00:00:00  0.448
 7 2018-01-10 00:00:00  0.124
 8 2018-01-11 00:00:00 -0.346
 9 2018-01-12 00:00:00  0.775
10 2018-01-15 00:00:00 -0.948
# … with 239 more rows

有尾巴

> tail(data,n=10)
# A tibble: 10 × 2
   Date                       y
   <dttm>                 <dbl>
 1 2018-12-13 00:00:00 -0.00736
 2 2018-12-14 00:00:00 -1.30   
 3 2018-12-17 00:00:00  0.227  
 4 2018-12-18 00:00:00 -0.671  
 5 2018-12-19 00:00:00 -0.750  
 6 2018-12-20 00:00:00 -0.906  
 7 2018-12-21 00:00:00 -1.74   
 8 2018-12-27 00:00:00  0.331  
 9 2018-12-28 00:00:00 -0.768  
10 2018-12-31 00:00:00  0.649 

我想用 window 60 计算 y 列的滚动 sd,然后找到确切的交易日而不是 actual-usual 天(可以从索引中完成?我不知道。 )

data2 = data%>%
  mutate(date = as.Date(Date))
data3=data2[,-1];head(data3)
roll_win = 60
data3$a = c(rep(NA_real_, roll_win - 1), zoo::rollapply(data3$y, roll_win ,sd))
dat = subset(data3, !is.na(a))
dat_max = dat[dat$a == max(dat$a, na.rm = TRUE), ]
dat_max$date_start = dat_max$date -  (roll_win - 1)
dat_max

原来高波动期是:

dat_max
# A tibble: 1 × 4
      y date           a date_start
  <dbl> <date>     <dbl> <date>    
1 0.931 2018-04-24  1.18 2018-02-24

现在,如果我减去这两个日期,我将得到:

> dat_max$date - dat_max$date_start
Time difference of 59 days

这是事实,但现在不是交易日。

我问过一个类似的问题但是没有解决problem.Actually当时问的问题是如何获得高波动率的天数。

对我如何获得这个交易日有什么帮助吗?提前致谢

编辑

完整数据

library(gsheet)
data= gsheet2tbl("https://docs.google.com/spreadsheets/d/1PdZDb3OgqSaO6znUWsAh7p_MVLHgNbQM/edit?usp=sharing&ouid=109626011108852110510&rtpof=true&sd=true")
data

每次的开始日期window

如果问题是如何计算每个 window 的开始日期,则使用末尾注释中的数据和 window 3:

w <- 3
out <- mutate(data, 
  sd = zoo::rollapplyr(y, w, sd, fill = NA),
  start = dplyr::lag(Date, w - 1)
)
out

给予:

         Date        y        sd      start
1  2018-12-13 -0.00736        NA       <NA>
2  2018-12-14 -1.30000        NA       <NA>
3  2018-12-17  0.22700 0.8223515 2018-12-13
4  2018-12-18 -0.67100 0.7674388 2018-12-14
5  2018-12-19 -0.75000 0.5427053 2018-12-17
6  2018-12-20 -0.90600 0.1195840 2018-12-18
7  2018-12-21 -1.74000 0.5322894 2018-12-19
8  2018-12-27  0.33100 1.0420146 2018-12-20
9  2018-12-28 -0.76800 1.0361488 2018-12-21
10 2018-12-31  0.64900 0.7435068 2018-12-27

最大的 sd 及其开始和结束日期


最大的 4 个 sd 及其开始和结束日期是:

head(dplyr::arrange(out, -sd), 4)

给予:

        Date      y        sd      start
8 2018-12-27  0.331 1.0420146 2018-12-20
9 2018-12-28 -0.768 1.0361488 2018-12-21
3 2018-12-17  0.227 0.8223515 2018-12-13
4 2018-12-18 -0.671 0.7674388 2018-12-14

两个日期之间的行数

如果问题是数据中出现的两个日期之间有多少行并且包括两个日期,则:

 d1 <- as.Date("2018-12-14")
 d2 <- as.Date("2018-12-20")
 diff(match(c(d1, d2), data$Date)) + 1
 ## [1] 5

备注

Lines <- "   Date                       y
 1 2018-12-13T00:00:00 -0.00736
 2 2018-12-14T00:00:00 -1.30   
 3 2018-12-17T00:00:00  0.227  
 4 2018-12-18T00:00:00 -0.671  
 5 2018-12-19T00:00:00 -0.750  
 6 2018-12-20T00:00:00 -0.906  
 7 2018-12-21T00:00:00 -1.74   
 8 2018-12-27T00:00:00  0.331  
 9 2018-12-28T00:00:00 -0.768  
10 2018-12-31T00:00:00  0.649"
data <- read.table(text = Lines)
data$Date <- as.Date(data$Date)