周转虚拟变量

Turn of month dummy variable

我有一个关于证券交易所每日收盘价及其各自日期的数年数据集。我进一步创建了一个计数器,计算每一天是该月的第几个交易日(因为数据集不包括周末和节假日)。它看起来像这样:

df$date <- as.Date(c("2017-03-25","2017-03-26","2017-03-27","2017-03-29","2017-03-30",
                     "2017-03-31","2017-04-03","2017-04-04","2017-04-05","2017-04-06",
                     "2017-04-07","2017-04-08","2017-04-09"))

df$DayofMonth <- c(18,19,20,21,22,23,1,2,3,4,5,6,7)

df$price <- (100, 100.53, 101.3 ,100.94, 101.42, 101.40, 101.85, 102, 101.9, 102, 102.31, 102.1, 102.23)

我现在想创建一个虚拟变量,每个月的最后 3 个交易日和下个月的前 5 个交易日的值为 1。所以在这种情况下它看起来像这样:

    df$ToM_dummy <- c(0,0,0,1,1,1,1,1,1,1,1,0,0)

感谢您的帮助!

这是一个 dplyr 解决方案。它可能比您的真实数据需要的复杂一点,因为您的样本在一个月的第 7 天停止,并且算法需要知道 7 不是真正的月底 - 数据只是不完整那个月。

因此,我任意添加了 18 天的截止日期,以表明如果交易天数少于一个月的交易天数,我们可以假设该月的数据不完整。如果需要,您可能希望更改此设置(例如,我不知道 12 月或 2 月是否总是超过 18 个交易日)

library(dplyr)

df %>% 
  mutate(month = lubridate::month(date)) %>% 
  group_by(month) %>%
  mutate(ToM_dummy = +(DayofMonth < 6 | 
                      (DayofMonth > (max(DayofMonth) - 3) &
                      max(DayofMonth) > 18))) # Change to appropriate number
#> # A tibble: 13 x 5
#> # Groups:   month [2]
#>    date       DayofMonth price month ToM_dummy
#>    <date>          <dbl> <dbl> <dbl>     <int>
#>  1 2017-03-25         18  100      3         0
#>  2 2017-03-26         19  101.     3         0
#>  3 2017-03-27         20  101.     3         0
#>  4 2017-03-29         21  101.     3         1
#>  5 2017-03-30         22  101.     3         1
#>  6 2017-03-31         23  101.     3         1
#>  7 2017-04-03          1  102.     4         1
#>  8 2017-04-04          2  102      4         1
#>  9 2017-04-05          3  102.     4         1
#> 10 2017-04-06          4  102      4         1
#> 11 2017-04-07          5  102.     4         1
#> 12 2017-04-08          6  102.     4         0
#> 13 2017-04-09          7  102.     4         0

数据

df <-  structure(list(date = structure(c(17250, 17251, 17252, 17254, 
17255, 17256, 17259, 17260, 17261, 17262, 17263, 17264, 17265
), class = "Date"), DayofMonth = c(18, 19, 20, 21, 22, 23, 1, 
2, 3, 4, 5, 6, 7), price = c(100, 100.53, 101.3, 100.94, 101.42, 
101.4, 101.85, 102, 101.9, 102, 102.31, 102.1, 102.23)), row.names = c(NA, 
-13L), class = "data.frame")

df
#>          date DayofMonth  price
#> 1  2017-03-25         18 100.00
#> 2  2017-03-26         19 100.53
#> 3  2017-03-27         20 101.30
#> 4  2017-03-29         21 100.94
#> 5  2017-03-30         22 101.42
#> 6  2017-03-31         23 101.40
#> 7  2017-04-03          1 101.85
#> 8  2017-04-04          2 102.00
#> 9  2017-04-05          3 101.90
#> 10 2017-04-06          4 102.00
#> 11 2017-04-07          5 102.31
#> 12 2017-04-08          6 102.10
#> 13 2017-04-09          7 102.23