libname in 'j:\cac'; /*importation des données*/ data brent; infile 'j:\cac\brent.csv' dlm=';'; input date :ddmmyy10. rendement; format date:ddmmyy10.; run; data brent(keep=date rendement);set brent;run; proc print data=brent;run;quit; proc sort data = brent; by date; run; quit; *------------ Représentation Graphique des Rendements --------------; title 'Rendements du cours du Brent'; proc gplot data=in.brent; plot rendement*date / legend; symbol i=join c=black; label rendement='rendement'; run; quit; *----------------- Construction Macro VaR Out of Sample ---------------------; /*------- Idée de la Macro : Estimation du modèle GARCH sur les 75% premières observations et prévision de la VaR out-of-sample pour les 25% restantes en utilisant des échantillons glissants */ /* Les inputs de la macro sont : database : Nom de la base de données où se trouve les rendements; varname : Le nom donné à la série des rendements dans la base précédente insize : la taille de l échantillon d estimation (in-sample). Elle est ici égale à T*0.75 avec T la taille totale de l échantillon tc : le taux de couverture de la VaR (1% ou 5%) */ %macro VaROutofSample(database=brent,varname=rendement,insize=6010,tc=5%); *---- On change le nom de la variable de rendement en y; data ChangeName; set &database (rename=(&varname=y)); run; *---- On récupère le nombre total d observations dans la macro-variable nobs; data ChangeName; set ChangeName; call symput('nobs',_n_); run; *------------------------ Grande boucle pour calcul des VaR out-of-sample; *------- Construction de l échantillon d estimation rolling; %let fin = %sysevalf(&nobs-&insize); %do i=1 %to &fin; %let o = %sysevalf(&insize-1+&i); data insample; set ChangeName; if _n_>=&i and _n_<=&o then output; run; *------ Estimation du modèle Garch sous loi normale; proc model data = insample outparms=param; parms c arch0 arch1 garch1 ; /* Equation moyenne*/; y = c; /* Equation variance*/ h.y = arch0 + arch1*zlag(resid.y**2)+garch1*zlag(h.y); /* Estimation du modèle*/; fit y / fiml method=marquardt out=ResultGarchNormal outactual outpredicted; outvars date y h.y; run ; quit ; proc print data=Resultgarchnormal;run; proc sort DATA=Resultgarchnormal; BY date ;run; proc transpose data=Resultgarchnormal out=ResultGarchNormalLast1; var y h_y;id _type_ ;by date; run; proc sort DATA=Resultgarchnormallast1; BY descending date ;run; DATA ResultGarchNormalLast2; SET ResultGarchNormalLast1 (obs=2) ; run; data ResultGarchNormalLast; set ResultGarchNormalLast2 (rename=(actual=y)); run; data param; set param; call symput('con',c); call symput('w',arch0); call symput('alpha',arch1); call symput('beta',garch1); run; data VaR; set ResultGarchNormalLast; h_prev = &w+&alpha*(y-&con)**2+&beta*h_y; VaR = predicted+quantile('normal',&tc)*sqrt(h_prev); run; %if &i=1 %then %do; data RecupVaR; set VaR; run; %end; %else %do; data RecupVaR; set RecupVaR VaR; run; %end; %end; proc gplot data=RecupVaR; plot y*date=1 VaR*date=2 / overlay; symbol1 i=join v=none c=black; symbol2 i=join v=none c=red; run; quit; %mend; %VaROutofSample(database=brent,varname=rendement,insize=6010,tc=0.05);