library(tseries)
library(forecast)
library(caschrono)
library(fGarch)
# set.seed(123) # je fixe les réalisations aléatoires

EXERCICE I

?garchSim 

Modèle ARCH(1)

spec = garchSpec(model = list(omega = 1, alpha = c(0.8), beta = 0))
X <- garchSim(spec, n = 500)
plot(X)

acf(X)

Box.test.2(X,1:20)
##       Retard    p-value
##  [1,]      1 0.37479047
##  [2,]      2 0.05804548
##  [3,]      3 0.00527414
##  [4,]      4 0.00907868
##  [5,]      5 0.01663220
##  [6,]      6 0.00218158
##  [7,]      7 0.00428588
##  [8,]      8 0.00389009
##  [9,]      9 0.00701217
## [10,]     10 0.00851219
## [11,]     11 0.01401100
## [12,]     12 0.02148134
## [13,]     13 0.03023286
## [14,]     14 0.01787048
## [15,]     15 0.02352157
## [16,]     16 0.01000353
## [17,]     17 0.01132053
## [18,]     18 0.00830769
## [19,]     19 0.01224506
## [20,]     20 0.01465810
Residus <- residuals(arima(X^2, order=c(1,0,0)))
acf(Residus)

Box.test.2(Residus,1:20)
##       Retard    p-value
##  [1,]      1 0.25364361
##  [2,]      2 0.00838127
##  [3,]      3 0.01475421
##  [4,]      4 0.01760368
##  [5,]      5 0.01954620
##  [6,]      6 0.03614874
##  [7,]      7 0.05977032
##  [8,]      8 0.05980713
##  [9,]      9 0.08535465
## [10,]     10 0.12450461
## [11,]     11 0.17193081
## [12,]     12 0.22437568
## [13,]     13 0.27086284
## [14,]     14 0.32706449
## [15,]     15 0.39487266
## [16,]     16 0.39987510
## [17,]     17 0.46561077
## [18,]     18 0.53364359
## [19,]     19 0.58606819
## [20,]     20 0.63303869

Modèle ARCH(3)

spec = garchSpec(model = list(omega = 1, alpha = c(0.5,0.1,0.3), beta = 0))
X <- garchSim(spec, n = 500)
plot(X)

acf(X)

Residus <- residuals(arima(X^2, order=c(3,0,0)))
acf(Residus)

Box.test.2(Residus,1:20)
##       Retard   p-value
##  [1,]      1 0.9644953
##  [2,]      2 0.9870417
##  [3,]      3 0.9986589
##  [4,]      4 0.9986184
##  [5,]      5 0.9973485
##  [6,]      6 0.9973354
##  [7,]      7 0.9957780
##  [8,]      8 0.7728837
##  [9,]      9 0.7418514
## [10,]     10 0.6389294
## [11,]     11 0.4965860
## [12,]     12 0.5647410
## [13,]     13 0.6434901
## [14,]     14 0.4620679
## [15,]     15 0.4909645
## [16,]     16 0.4100683
## [17,]     17 0.4532260
## [18,]     18 0.5219448
## [19,]     19 0.5702670
## [20,]     20 0.6331217

Modèle GARCH(1,1)

spec = garchSpec(model = list(omega = 1, alpha = c(0.5), beta = c(0.4)))
X <- garchSim(spec, n = 500)
plot(X)

acf(X)

Residus <- residuals(arima(X^2, order=c(1,0,1)))
acf(Residus)

Box.test.2(Residus,1:20)
##       Retard    p-value
##  [1,]      1 0.28732449
##  [2,]      2 0.00140039
##  [3,]      3 0.00000000
##  [4,]      4 0.00000000
##  [5,]      5 0.00000000
##  [6,]      6 0.00000000
##  [7,]      7 0.00000000
##  [8,]      8 0.00000000
##  [9,]      9 0.00000000
## [10,]     10 0.00000000
## [11,]     11 0.00000000
## [12,]     12 0.00000000
## [13,]     13 0.00000000
## [14,]     14 0.00000000
## [15,]     15 0.00000000
## [16,]     16 0.00000000
## [17,]     17 0.00000000
## [18,]     18 0.00000000
## [19,]     19 0.00000000
## [20,]     20 0.00000000

Modèle GARCH(2,3)

spec = garchSpec(model = list(omega = 1, alpha = c(0.06,0.1), beta = c(0.2,0.15,0.1)))
X <- garchSim(spec, n = 500)
plot(X)

acf(X)

Residus <- residuals(arima(X^2, order=c(3,0,3)))
acf(Residus)

Box.test.2(Residus,1:20)
##       Retard   p-value
##  [1,]      1 0.5592017
##  [2,]      2 0.8378062
##  [3,]      3 0.6804462
##  [4,]      4 0.8240519
##  [5,]      5 0.6955286
##  [6,]      6 0.8044649
##  [7,]      7 0.8668329
##  [8,]      8 0.9143899
##  [9,]      9 0.9237524
## [10,]     10 0.9550390
## [11,]     11 0.9689032
## [12,]     12 0.9285905
## [13,]     13 0.9537861
## [14,]     14 0.9712432
## [15,]     15 0.9778869
## [16,]     16 0.9861581
## [17,]     17 0.9462377
## [18,]     18 0.9632284
## [19,]     19 0.9664228
## [20,]     20 0.9727337

EXERCICE 2

On récupère le jeu de données INTC (en specifiant d’abord le répertoire où R doit chercher) :

# setwd("/Users/adrien/R/Data")
Dat0 <- read.table("/Users/adrien/R/Data/INTC", header=T)
INTC <- ts(data = Dat0, start=c(1973,1),end=c(2003,12), frequency=12)
plot(INTC)

On étudie la série INTC :

acf(INTC,lag=100)

pacf(INTC,lag=100)

Box.test.2(INTC,1:50)
##       Retard    p-value
##  [1,]      1 0.89386607
##  [2,]      2 0.91427190
##  [3,]      3 0.37222884
##  [4,]      4 0.32435131
##  [5,]      5 0.43077263
##  [6,]      6 0.48746844
##  [7,]      7 0.08921509
##  [8,]      8 0.06034335
##  [9,]      9 0.08975699
## [10,]     10 0.11540033
## [11,]     11 0.10113237
## [12,]     12 0.11191248
## [13,]     13 0.11873731
## [14,]     14 0.03322213
## [15,]     15 0.04178934
## [16,]     16 0.05883222
## [17,]     17 0.08055149
## [18,]     18 0.10015606
## [19,]     19 0.11179859
## [20,]     20 0.13825313
## [21,]     21 0.11193471
## [22,]     22 0.12569008
## [23,]     23 0.10902431
## [24,]     24 0.13738412
## [25,]     25 0.13363336
## [26,]     26 0.13808178
## [27,]     27 0.16901174
## [28,]     28 0.19914106
## [29,]     29 0.19749051
## [30,]     30 0.23010734
## [31,]     31 0.26453123
## [32,]     32 0.30529418
## [33,]     33 0.31421034
## [34,]     34 0.28614257
## [35,]     35 0.32761383
## [36,]     36 0.36553451
## [37,]     37 0.40743047
## [38,]     38 0.44907218
## [39,]     39 0.48802732
## [40,]     40 0.51625613
## [41,]     41 0.55752500
## [42,]     42 0.59868650
## [43,]     43 0.62994721
## [44,]     44 0.66410356
## [45,]     45 0.66202762
## [46,]     46 0.67220471
## [47,]     47 0.70436039
## [48,]     48 0.73974665
## [49,]     49 0.77192588
## [50,]     50 0.79402710

D’après le test de Box-Pierce, l’hypothèse d’un bruit blanc ne peut pas être rejetée.

On étudie maintenant cette série élevée au carré pour débusquer un effet ARCH :

acf(INTC^2,lag=100) 

pacf(INTC^2,lag=100)

Box.test(INTC^2,3)
## 
##  Box-Pierce test
## 
## data:  INTC^2
## X-squared = 34.233, df = 3, p-value = 1.769e-07

En effet, si une série est un bruit blanc, alors la série élevée au carré doit l’être aussi, et ce n’est ici manifestement pas la cas en vertu du test de Box-Pierce. On tente de modéliser INTC^2 avec un ARMA :

ARMA <- auto.arima(INTC^2,stationary=TRUE, seasonal=FALSE)
ARMA
## Series: INTC^2 
## ARIMA(1,0,2) with non-zero mean 
## 
## Coefficients:
##          ar1      ma1     ma2    mean
##       0.8746  -0.8027  0.0725  0.0181
## s.e.  0.0758   0.0903  0.0610  0.0041
## 
## sigma^2 estimated as 0.001384:  log likelihood=698.47
## AIC=-1386.95   AICc=-1386.78   BIC=-1367.35
Box.test.2(residuals(ARMA),1:50)
##       Retard   p-value
##  [1,]      1 0.9974349
##  [2,]      2 0.9999866
##  [3,]      3 0.9302030
##  [4,]      4 0.9617276
##  [5,]      5 0.9784405
##  [6,]      6 0.9841967
##  [7,]      7 0.9807108
##  [8,]      8 0.9886544
##  [9,]      9 0.9950860
## [10,]     10 0.9929692
## [11,]     11 0.9685373
## [12,]     12 0.4814540
## [13,]     13 0.5566356
## [14,]     14 0.3151310
## [15,]     15 0.3592240
## [16,]     16 0.3676372
## [17,]     17 0.3887653
## [18,]     18 0.4180108
## [19,]     19 0.4644522
## [20,]     20 0.5245124
## [21,]     21 0.4692977
## [22,]     22 0.5114473
## [23,]     23 0.5075649
## [24,]     24 0.5663583
## [25,]     25 0.6230293
## [26,]     26 0.6686375
## [27,]     27 0.6876068
## [28,]     28 0.7207481
## [29,]     29 0.7621122
## [30,]     30 0.7980296
## [31,]     31 0.8231999
## [32,]     32 0.8522068
## [33,]     33 0.8764502
## [34,]     34 0.9005882
## [35,]     35 0.9211340
## [36,]     36 0.9322147
## [37,]     37 0.9470294
## [38,]     38 0.9574408
## [39,]     39 0.9667697
## [40,]     40 0.9743623
## [41,]     41 0.9782832
## [42,]     42 0.9830756
## [43,]     43 0.9797898
## [44,]     44 0.9848187
## [45,]     45 0.9883363
## [46,]     46 0.9913175
## [47,]     47 0.9936642
## [48,]     48 0.9954219
## [49,]     49 0.9966068
## [50,]     50 0.9971864

Une modélisation ARMA(1,2) semble raisonnable. Cependant, si INTC était un GARCH(p,q) et, supposant que la série à un moment d’ordre 4, INTC^2 serait un ARMA(max(p,q),q), qui ne contient pas la classe ARMA(1,2). Cepedant, on voit que parmi les coeffcients :

coef(ARMA)
##         ar1         ma1         ma2   intercept 
##  0.87457353 -0.80266059  0.07251611  0.01809983

le coefficient ma2 est negligeable devant ar1 et ma1. On peut tenter de négliger ce coefficient et modéliser avec un ARMA(1,1) :

arima(INTC^2,order=c(1,0,1)) 
## 
## Call:
## arima(x = INTC^2, order = c(1, 0, 1))
## 
## Coefficients:
##          ar1      ma1  intercept
##       0.9122  -0.7971     0.0182
## s.e.  0.0469   0.0685     0.0044
## 
## sigma^2 estimated as 0.001374:  log likelihood = 697.75,  aic = -1387.5
Box.test.2(residuals(arima(INTC^2,order=c(1,0,1))),1:50)
##       Retard   p-value
##  [1,]      1 0.4062199
##  [2,]      2 0.5891072
##  [3,]      3 0.5198242
##  [4,]      4 0.6824185
##  [5,]      5 0.8014312
##  [6,]      6 0.8586763
##  [7,]      7 0.8770328
##  [8,]      8 0.9094476
##  [9,]      9 0.9472803
## [10,]     10 0.9523248
## [11,]     11 0.8707045
## [12,]     12 0.3483931
## [13,]     13 0.4247163
## [14,]     14 0.2560471
## [15,]     15 0.3053455
## [16,]     16 0.3159037
## [17,]     17 0.3461926
## [18,]     18 0.3710159
## [19,]     19 0.4182775
## [20,]     20 0.4659493
## [21,]     21 0.4255396
## [22,]     22 0.4608356
## [23,]     23 0.4579136
## [24,]     24 0.5166969
## [25,]     25 0.5744912
## [26,]     26 0.6148837
## [27,]     27 0.6383801
## [28,]     28 0.6674724
## [29,]     29 0.7124502
## [30,]     30 0.7521049
## [31,]     31 0.7777328
## [32,]     32 0.8116283
## [33,]     33 0.8380984
## [34,]     34 0.8670140
## [35,]     35 0.8924016
## [36,]     36 0.9058884
## [37,]     37 0.9250510
## [38,]     38 0.9391823
## [39,]     39 0.9514647
## [40,]     40 0.9621827
## [41,]     41 0.9686885
## [42,]     42 0.9752068
## [43,]     43 0.9707715
## [44,]     44 0.9777078
## [45,]     45 0.9824633
## [46,]     46 0.9867298
## [47,]     47 0.9901243
## [48,]     48 0.9927310
## [49,]     49 0.9945922
## [50,]     50 0.9955474

Cette modélisation est pertinente.

On entrevoit ainsi la possibilité que INTC provienne d’un GARCH(1,1).

L’analyse suivante nous montre que c’est une hypothèse raisonnable :

Fit <- garch(INTC,order=c(1,1)) 
## 
##  ***** ESTIMATION WITH ANALYTICAL GRADIENT ***** 
## 
## 
##      I     INITIAL X(I)        D(I)
## 
##      1     1.609728e-02     1.000e+00
##      2     5.000000e-02     1.000e+00
##      3     5.000000e-02     1.000e+00
## 
##     IT   NF      F         RELDF    PRELDF    RELDX   STPPAR   D*STEP   NPRELDF
##      0    1 -5.619e+02
##      1    6 -5.619e+02  6.38e-05  1.21e-04  3.2e-03  6.0e+05  3.4e-04  3.64e+01
##      2    9 -5.620e+02  1.53e-04  1.58e-04  2.6e-02  2.1e+00  2.7e-03  3.66e+00
##      3   13 -5.654e+02  5.99e-03  9.72e-03  4.5e-01  2.0e+00  8.9e-02  3.43e+00
##      4   14 -5.664e+02  1.84e-03  4.64e-03  2.9e-01  2.0e+00  8.9e-02  2.74e-01
##      5   15 -5.686e+02  3.79e-03  4.17e-03  2.3e-01  2.0e+00  8.9e-02  2.74e-01
##      6   17 -5.711e+02  4.47e-03  6.83e-03  3.8e-01  1.9e+00  3.0e-01  1.15e-01
##      7   22 -5.713e+02  2.79e-04  6.59e-04  3.3e-04  7.1e+00  3.5e-04  9.62e-03
##      8   23 -5.713e+02  1.46e-05  1.28e-05  3.2e-04  2.0e+00  3.5e-04  8.19e-03
##      9   29 -5.721e+02  1.42e-03  1.12e-03  7.8e-02  9.1e-01  9.0e-02  8.60e-03
##     10   30 -5.733e+02  2.11e-03  3.31e-03  1.3e-01  2.0e+00  1.8e-01  1.89e-01
##     11   31 -5.738e+02  8.27e-04  6.10e-03  7.3e-02  0.0e+00  1.3e-01  6.10e-03
##     12   33 -5.746e+02  1.44e-03  5.87e-03  2.5e-02  8.9e-01  5.7e-02  1.06e-02
##     13   35 -5.752e+02  1.02e-03  2.38e-03  7.0e-03  1.4e+00  1.1e-02  3.18e-03
##     14   36 -5.756e+02  6.79e-04  6.81e-04  6.9e-03  1.8e+00  1.1e-02  1.70e-03
##     15   38 -5.760e+02  6.37e-04  9.14e-04  2.7e-02  9.1e-01  4.5e-02  1.93e-03
##     16   40 -5.760e+02  1.24e-05  3.49e-05  2.3e-03  6.7e-01  3.8e-03  4.86e-05
##     17   41 -5.760e+02  3.64e-06  9.07e-06  1.1e-03  0.0e+00  2.0e-03  9.07e-06
##     18   43 -5.760e+02  1.33e-07  3.40e-07  1.8e-04  8.2e-01  4.0e-04  4.59e-07
##     19   45 -5.760e+02  4.05e-07  8.55e-08  1.8e-04  0.0e+00  4.4e-04  8.55e-08
##     20   46 -5.760e+02  4.99e-08  8.92e-10  6.6e-06  0.0e+00  1.6e-05  8.92e-10
##     21   47 -5.760e+02  1.10e-08  1.59e-11  8.8e-07  0.0e+00  1.6e-06  1.59e-11
##     22   48 -5.760e+02  1.74e-09  1.32e-13  3.0e-07  0.0e+00  5.6e-07  1.32e-13
##     23   49 -5.760e+02  4.43e-11  1.07e-16  8.6e-09  0.0e+00  1.5e-08  1.07e-16
##     24   50 -5.760e+02  4.35e-13  3.29e-20  1.2e-10  0.0e+00  2.1e-10  3.29e-20
##     25   51 -5.760e+02 -3.36e-15  1.25e-24  6.5e-13  0.0e+00  1.4e-12  1.25e-24
## 
##  ***** X- AND RELATIVE FUNCTION CONVERGENCE *****
## 
##  FUNCTION    -5.759765e+02   RELDX        6.479e-13
##  FUNC. EVALS      51         GRAD. EVALS      25
##  PRELDF       1.254e-24      NPRELDF      1.254e-24
## 
##      I      FINAL X(I)        D(I)          G(I)
## 
##      1    1.158365e-03     1.000e+00    -1.605e-07
##      2    8.739503e-02     1.000e+00    -2.417e-09
##      3    8.456534e-01     1.000e+00    -2.211e-09
coef(Fit)
##          a0          a1          b1 
## 0.001158365 0.087395034 0.845653382
Er <- residuals(Fit)
plot.ts(Er) ; Box.test.2(Er,1:100) 

##        Retard   p-value
##   [1,]      1 0.7192460
##   [2,]      2 0.8464215
##   [3,]      3 0.5421388
##   [4,]      4 0.4955916
##   [5,]      5 0.6374841
##   [6,]      6 0.6352119
##   [7,]      7 0.3365955
##   [8,]      8 0.3140770
##   [9,]      9 0.4056276
##  [10,]     10 0.4827762
##  [11,]     11 0.5419189
##  [12,]     12 0.5709801
##  [13,]     13 0.5042275
##  [14,]     14 0.3256200
##  [15,]     15 0.3803232
##  [16,]     16 0.4488597
##  [17,]     17 0.5138924
##  [18,]     18 0.5221752
##  [19,]     19 0.5772624
##  [20,]     20 0.6405308
##  [21,]     21 0.5930960
##  [22,]     22 0.5013889
##  [23,]     23 0.4377090
##  [24,]     24 0.4960664
##  [25,]     25 0.4425148
##  [26,]     26 0.4799296
##  [27,]     27 0.5353108
##  [28,]     28 0.5851709
##  [29,]     29 0.5898103
##  [30,]     30 0.6360464
##  [31,]     31 0.6813499
##  [32,]     32 0.7261372
##  [33,]     33 0.7213385
##  [34,]     34 0.6941055
##  [35,]     35 0.7335554
##  [36,]     36 0.7676821
##  [37,]     37 0.7962666
##  [38,]     38 0.8285838
##  [39,]     39 0.8537805
##  [40,]     40 0.8669364
##  [41,]     41 0.8868791
##  [42,]     42 0.9070094
##  [43,]     43 0.9218327
##  [44,]     44 0.9368688
##  [45,]     45 0.9247388
##  [46,]     46 0.9251788
##  [47,]     47 0.9356199
##  [48,]     48 0.9478785
##  [49,]     49 0.9580580
##  [50,]     50 0.9653318
##  [51,]     51 0.9682192
##  [52,]     52 0.9746951
##  [53,]     53 0.9718667
##  [54,]     54 0.9701964
##  [55,]     55 0.9751967
##  [56,]     56 0.9791780
##  [57,]     57 0.9821518
##  [58,]     58 0.9820760
##  [59,]     59 0.9859155
##  [60,]     60 0.9855846
##  [61,]     61 0.9876990
##  [62,]     62 0.9757557
##  [63,]     63 0.9796232
##  [64,]     64 0.9821014
##  [65,]     65 0.9817073
##  [66,]     66 0.9849550
##  [67,]     67 0.9768166
##  [68,]     68 0.9792963
##  [69,]     69 0.9826463
##  [70,]     70 0.9764412
##  [71,]     71 0.9799386
##  [72,]     72 0.9821583
##  [73,]     73 0.9857106
##  [74,]     74 0.9880569
##  [75,]     75 0.9904210
##  [76,]     76 0.9902713
##  [77,]     77 0.9922968
##  [78,]     78 0.9917486
##  [79,]     79 0.9932373
##  [80,]     80 0.9894478
##  [81,]     81 0.9872160
##  [82,]     82 0.9884680
##  [83,]     83 0.9882724
##  [84,]     84 0.9744134
##  [85,]     85 0.9787206
##  [86,]     86 0.9804616
##  [87,]     87 0.9791726
##  [88,]     88 0.9811699
##  [89,]     89 0.9839301
##  [90,]     90 0.9860001
##  [91,]     91 0.9885858
##  [92,]     92 0.9905897
##  [93,]     93 0.9923090
##  [94,]     94 0.9932638
##  [95,]     95 0.9937527
##  [96,]     96 0.9948069
##  [97,]     97 0.9953887
##  [98,]     98 0.9962485
##  [99,]     99 0.9966755
## [100,]    100 0.9972576

On peut alors tenter de prédire la volatilité \(\sigma_t^2\) de la série INTC \(X_t=\sigma_t\varepsilon_t\) à l’aide des formules du cours. En effet, on a pour un GARCH(1,1) :

\[ X_t=\sigma_t\varepsilon_t,\qquad \sigma_t^2=\omega+ \alpha X_{t-1}^2+\beta\sigma_{t-1}^2. \]

On nommes les constantes :

omega = coef(Fit)[1]
alpha = coef(Fit)[2]
beta = coef(Fit)[3]
n = length(INTC) ; n
## [1] 372

On commence par estimer \(\sigma_n^2\) par récurrence (en supposant que \(\sigma_0=0\)) :

sigma2 <- vector()
sigma2[1]=0
for (i in 1:n){sigma2[i+1]= omega +alpha*INTC[i]^2 + beta*sigma2[i]}
sigma2_n=sigma2[n+1]

Ensuite, on crée une fonction \(\verb'sigma2_est'\) de \(\ell\) qui nous renvoie \(\hat\sigma_n^2(\ell)\) comme suite :

sigma2_est <- function(l){
  sig_est1 <- unname(omega + alpha*INTC[n]^2 + beta*sigma2_n)
  if (l==1){return(sig_est1)}
  else {
    Est <- vector()
    Est[1]=sig_est1
    for (i in 2:l){Est[i]=omega*(1-(alpha+beta)^l)/(1-alpha-beta)+(alpha+beta)^l*Est[i-1]}
    return(Est[l])
    }
}

Par exemple, on prédit à l’horizon \(\ell=1,2,3,4\) :

sigma2_est(1) ; sigma2_est(2) ; sigma2_est(3) ; sigma2_est(4)
## [1] 0.01503668
## [1] 0.0153298
## [1] 0.01580714
## [1] 0.0163155