【问题标题】:Turn of month dummy variable月轮虚拟变量
【发布时间】:2020-10-02 10:52:13
【问题描述】:

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

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)

感谢您的帮助!

【问题讨论】:

  • 您的data.frame 无法按原样重现。

标签: r finance dummy-variable


【解决方案1】:

这是一个 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

【讨论】:

  • 谢谢@Allan!您是否知道一种方法可以让我将df$ToM_dummy 作为df 中的一列而不是仅在控制台中?这样当我查看 df 时,它会返回一个显示虚拟变量的列?
  • 编辑 @Allan :此代码似乎不适用于整个数据集。似乎没有考虑到每个月的交易天数会有所不同(但总是> 18),因此在许多月份中,没有或每月最后几天的1-2个被赋予值(1) .前 5 个观察结果很好。我试图更改数字,但我自己无法弄清楚..
  • @rookie 如果你把数字降到 10 会起作用吗?
  • 不,它在前几个月有效,但随着每个月交易日数的变化,它开始发生变化。有什么方法可以调整代码,以便计算一个月内的观察次数,然后为每个月分配虚拟值?所以它考虑到每个月的最大df$DayofMonth? @艾伦
  • 等等,@rookie 你有好几年了?如果是这样,您需要使用 mutate(Year = lubridate::year(date)) 创建一个 Year 变量并将 group_by 更改为 group_by(Year, month)
猜你喜欢
  • 2015-06-09
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 2023-01-31
  • 2018-04-06
  • 1970-01-01
  • 1970-01-01
  • 2015-01-24
相关资源
最近更新 更多