Pour ce second post dans la série consacrée à la finance comportementale, revenons sur les effets calendaires qui ont, par le passé, été mis en évidence comme affectant les rendements des actions. Encore une fois, cette application est principalement une réplication sous R du travail présenté par Savva Shanaev et Arina Shuraeva sous excel sur leur chaîne youtube NDEL (que je recommande fortement).

Le(s) papier(s) d’origine

L’effet vacances (holiday effect) est une autre anomalie de marché au regard de l’hypothèse d’efficience détectée dans les années 80. Il a notamment été mis en évidence par ARIEL (1990) et Cadsby and Ratner (1992). Il consiste en la présence de rendements en moyenne plus importants que les autres jours la veille de périodes de vacances (des périodes de fremeture du marché plus longues que les simples weekends) .

Sa présence a été justifié à la fois par des biais d’optimistes avant les périodes de congése et la prudence des short sellers (les vendeurs à découvert) qui préfèrent liquider leurs positions avant une longue fermeture du marché (ou pour un jours fériés).

Chargeons les packages et les données

Pour tester l’effet vacances, nous ne mobiliserons ici qu’un seul package : le très classique tidyverse. Chargeons-le.

library(tidyverse)

Concernant les données, reprenons le jeu que nous avons établi pour l’effet weekend (vous pouvez les charger ici. Celui-ci comprend des informations journalières concernant l’indice Standard and Poor 500 sur la période 2015-2020.

dat<-read_delim("S&P500_2015_2020.csv",delim=";")
head(dat)
## # A tibble: 6 × 3
##   date_t     SP500       ret
##   <date>     <dbl>     <dbl>
## 1 2015-01-02 2058. -0.000340
## 2 2015-01-05 2021. -0.0183  
## 3 2015-01-06 2003. -0.00889 
## 4 2015-01-07 2026.  0.0116  
## 5 2015-01-08 2062.  0.0179  
## 6 2015-01-09 2045. -0.00840

Reprendre ces données, nous évite pas mal de manipulations pour télécharger l’information, limiter la période d’étude, mettre l’ensemble dans une data frame, formater les dates et calculer les rendements.

Traitement des données

Commençons par repérer les jours qui précédents les périodes de vacances. Ce faisant, il est important de les distinguer de ceux qui précédent les simples weekend. Pour ce faire, nous procédons par étapes. Tout d’abord, nous calculons pour chaque date le nombre de jours qui la sépare de la suivante. Un weekend ordinaire sera ainsi marqué par un écart de dates de 3 jours et le passage ordinaire d’un jour ouvré à l’autre d’un écart de 1. Tout les autres écarts correspondent donc à des vacances. Nous codons une variable sur cette base et générons en appui un facteur aux étiquettes plus claires. Enfin, la dernière observation de la série,le 31 décembre 2019, est marquée par un NA. Nous corrigeons cette erreur en indiquant qu’il s’agit bien d’une veille de vacances (le nouvel an).

dat<-dat %>%
  mutate(day_dif=lead(date_t)-date_t,
         holiday=ifelse(day_dif==2,1, ifelse(day_dif>=4,1,0)),
         holiday_f=factor(holiday,labels=c("no_holiday","holiday")))

dat$holiday_f[length(dat$holiday_f)]<-"holiday"

Maintenant que toutes les veilles de vacances sont marquées, on peut calculer les rendements moyens sur ces jours et sur les autres.

dat %>% 
  group_by(holiday_f) %>% 
  summarise(moyenne=round(mean(ret)*100,digits=4))
## # A tibble: 2 × 2
##   holiday_f  moyenne
##   <fct>        <dbl>
## 1 no_holiday  0.0409
## 2 holiday     0.0008

On relève que les jours hors veilles de vacances présentent un rendement moyenne de 4 points de base (0,04%) et que les veilles de vacance un rendement quasi nulle 0,08 points de base (0,0008%). Cela est déjà contraire à ce que devrait produire l’effet vacances (des rendements plus importants les veilles de vacances). Mais la différence constatée est-elle statistiquement significative ?

Tests statistiques

La comparaison des moyennes se fait sur la base d’un test de Student. Pour connaître, la forme qu’il doit prendre il est nécessaire de tester au préalable l’égalité des variances. Pour ce faire, nous mobilisons un test de Fisher. Mais avant de le pratiquer établissons les variances, le nombre d’observations et les degrés de liberté associés aux groupes comparés.

dat %>%
  group_by(holiday_f) %>%
  summarise(moyenne=round(mean(ret)*100,digits=4),
            variance=round(var(ret),digits=6), 
            N=n(),
            df=N-1)
## # A tibble: 2 × 5
##   holiday_f  moyenne variance     N    df
##   <fct>        <dbl>    <dbl> <int> <dbl>
## 1 no_holiday  0.0409 0.000071  1212  1211
## 2 holiday     0.0008 0.00009     46    45

Il y a 46 jours qui sont des veilles de vacances sur la période d’étude. Les variances des deux échantillons sont relativement proches. Mais, on ne peut pas conclure à leur égalité sans test. Calculons le ratio de ces variances sous H0 (l’égalité des variances). Celui-ci suit une loi de Fisher à n-1,m-1 degrés de liberté. Tirons la p-value du test des valeurs observées;

Fish<-var(dat$ret[dat$holiday_f=="holiday"])/var(dat$ret[dat$holiday_f=="no_holiday"]) 
c(Fish=Fish,pv=pf(Fish,45,1211,lower.tail = FALSE)*2) %>% round(digits=4)
##   Fish     pv 
## 1.2687 0.2241

Avec une p-value de 22,41%, on ne peut raisonnablement pas rejeter H0 (égalité des variances). Le même test peut être fait directement à partir de la fonction var.test(). Pour obtenir, le ratio dans le même sens que celui utilisé dans le calcul détaillé inversons la variable holiday (les 1 deviennent des 0 et les 0 des 1).

var.test(ret~abs(holiday-1),data=dat)
## 
## 	F test to compare two variances
## 
## data:  ret by abs(holiday - 1)
## F = 1.2948, num df = 44, denom df = 1211, p-value = 0.1919
## alternative hypothesis: true ratio of variances is not equal to 1
## 95 percent confidence interval:
##  0.8793085 2.0782256
## sample estimates:
## ratio of variances 
##           1.294758

Le test pratiqué ici est bilatéral. On peut également le pratiquer en unilatéral en posant que l’hypothèse alternative (H1) est que la variance des rendements les veilles de vacances est plus grande que celle des autres jours.

var.test(ret~abs(holiday-1),data=dat,alternative="greater")
## 
## 	F test to compare two variances
## 
## data:  ret by abs(holiday - 1)
## F = 1.2948, num df = 44, denom df = 1211, p-value = 0.09594
## alternative hypothesis: true ratio of variances is greater than 1
## 95 percent confidence interval:
##  0.9348272       Inf
## sample estimates:
## ratio of variances 
##           1.294758

On aboutit à la même conclusion. H0 (l’égalité des variances) ne peut être rejetée avec un niveau de certitude suffisant. En conséquence, la forme du test de Student à utiliser est la forme classique. Soit la suivante :

\[ t=\frac{\bar{r_1}-\bar{r_2}}{s_p.\sqrt{\frac{1}{n_1}+\frac{1}{n_2}}} \]

\[ s_p=\sqrt{\frac{(n_1-1)s_1^2+(n_2-1)s_2^2}{n_1+n_2-2}} \]

sp<-sqrt(((46-1)*var(dat$ret[dat$holiday_f=="holiday"])+
            (1212-1)*var(dat$ret[dat$holiday_f=="no_holiday"]))/(46+1212-2))
t<-(mean(dat$ret[dat$holiday_f=="holiday"])-
      mean(dat$ret[dat$holiday_f=="no_holiday"]))/(sp*sqrt((1/46)+(1/1212)))
c(t=t,p_value=pt(-0.31528,nrow(dat)-2)*2)
##          t    p_value 
## -0.3152823  0.7526014

Avec une p-value de 75,26%, on ne peut pas rejeter H0. Les rendements moyens sur les veilles de vacances ne sont pas statistiquement différents de ceux des autres jours. Il n’y a pas d’effet vacances sur la période d’étude. Encore, une fois l’anomalie semble avoir été arbitrée.

Le test peut être pratiqué directement en utilisant la fonction t.test() et en veillant à sélectionner l’option var.equal=TRUE.

t.test(ret~abs(holiday-1),data=dat,var.equal=TRUE)
## 
## 	Two Sample t-test
## 
## data:  ret by abs(holiday - 1)
## t = -0.36264, df = 1255, p-value = 0.7169
## alternative hypothesis: true difference in means between group 0 and group 1 is not equal to 0
## 95 percent confidence interval:
##  -0.002988414  0.002055983
## sample estimates:
## mean in group 0 mean in group 1 
##   -5.747888e-05    4.087369e-04

Résumons: on peut conclure que les rendements autour des veilles de vacances ne sont pas, sur la période étudiée, statistiquement différents de ceux constatés les autres jours. Il n’y a pas ici d’effet vacances.

L’anomalie a disparu. Une des explications de cette disparition est que les agents connaissant de son existence auraient progressivement procédé à des arbitrages amenant à sa disparition.

ARIEL, ROBERT A. 1990. “High Stock Returns Before Holidays: Existence and Evidence on Possible Causes.” The Journal of Finance 45 (5): 1611–26. https://doi.org/10.1111/j.1540-6261.1990.tb03731.x.
Cadsby, Charles Bram, and Mitchell Ratner. 1992. “Turn-of-Month and Pre-Holiday Effects on Stock Returns: Some International Evidence.” Journal of Banking & Finance 16 (3): 497–509. https://doi.org/10.1016/0378-4266(92)90041-w.