从R中的rollapply获取交易日



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

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 

我想用窗口60计算第y列的滚动sd,然后找到确切的交易日,而不是实际的正常交易日(可以从指数中完成吗?我不知道。(

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

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

我在这里问了一个类似的问题,但它并没有解决问题。事实上,当时被问到的问题是,我如何才能度过高波动的日子。

有什么帮助我可以获得这个交易日吗?提前感谢

编辑

对于完整数据

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

每个时间窗口的开始日期

如果问题是如何计算每个窗口的开始日期,那么使用末尾注释中的数据和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)

相关内容

  • 没有找到相关文章

最新更新