Dummy-Variable zum Monatswechsel

Oct 02 2020

Ich habe einen Datensatz über den täglichen Schlusskurs einer Börse und ihre jeweiligen Daten für mehrere Jahre. Ich habe außerdem einen Zähler erstellt, der zählt, welcher Handelstag im Monat jeder Tag ist (da der Datensatz Wochenenden und Feiertage ausschließt). Es sieht aus wie das:

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)

Ich möchte jetzt eine Dummy-Variable erstellen, die für jeden Monat den Wert 1 für die letzten 3 Handelstage und die ersten 5 Handelstage des folgenden Monats annimmt. In diesem Fall würde es also ungefähr so ​​aussehen:

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

Vielen Dank für Ihre Hilfe!

Antworten

2 AllanCameron Oct 02 2020 at 18:12

Hier ist eine dplyr-Lösung. Es ist wahrscheinlich etwas komplexer als es für Ihre realen Daten sein muss, da Ihre Stichprobe am 7. Tag eines Monats stoppt und der Algorithmus wissen muss, dass 7 nicht wirklich das Monatsende ist - die Daten sind nur unvollständig für diesen Monat.

Ich habe daher willkürlich einen Cutoff von 18 Tagen hinzugefügt, um anzuzeigen, dass wir davon ausgehen können, dass die Daten für diesen Monat unvollständig sind, wenn es weniger Handelstage als in einem Monat gibt. Möglicherweise möchten Sie dies bei Bedarf ändern (ich habe keine Ahnung, ob es beispielsweise im Dezember oder Februar immer mehr als 18 Handelstage gibt).

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

Daten

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