Variable fictive du tour de mois

Oct 02 2020

J'ai un ensemble de données sur le cours de clôture quotidien d'une bourse et leurs dates respectives depuis plusieurs années. J'ai en outre créé un compteur, en comptant le jour de négociation du mois chaque jour (car l'ensemble de données exclut les week-ends et les jours fériés). Cela ressemble à ceci:

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)

Je voudrais maintenant créer une variable factice prenant la valeur 1 pour les 3 derniers jours de trading et les 5 premiers jours de trading du mois suivant, pour chaque mois. Donc, dans ce cas, cela ressemblerait à quelque chose comme ceci:

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

Merci de votre aide!

Réponses

2 AllanCameron Oct 02 2020 at 18:12

Voici une solution dplyr. C'est probablement un peu plus complexe que nécessaire pour vos données réelles car votre échantillon s'arrête le 7ème jour du mois et l'algorithme doit savoir que 7 n'est pas vraiment la fin du mois - les données sont simplement incomplètes pour ce mois.

J'ai donc ajouté arbitrairement un délai de 18 jours pour indiquer que s'il y a moins de jours de négociation que dans un mois, nous pouvons supposer que les données pour ce mois sont incomplètes. Vous voudrez peut-être changer cela si nécessaire (je n'ai aucune idée s'il y a toujours plus de 18 jours de négociation en décembre ou février, par exemple)

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

Données

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