Freakonometrics

To content | To menu | To search

Teaching › économetrie de la finance - M2-09/10

Entries feed - Comments feed

Tuesday, February 16 2010

Valeurs extrêmes et calculs de quantiles

En fin de TD, nous avons vu comment calculer des quantiles à l'aide des résultats sur les valeurs extrêmes. Pour reprendre le début du code, nous avons vu tout d'abord comment calculer une volatilité historique par moyenne mobile,
> library(tseries)
> X=get.hist.quote("^FCHI")
essai de l'URL 'http://chart.yahoo.com/table.csv?s=^FCHI&a=0&b=02&c=1991&d=1&e=15&f=2010&g=d&q=q&y=0&z=^FCHI&x=.csv'
Content type 'text/csv' length unknown
URL ouverte
downloaded 267 Kb

> P=X$Close
> R=diff(log(P))
> plot(R)
> abline(h=mean(R)+qnorm(.05)*sd(R),col="green")
> abline(h=mean(R)+qnorm(.01)*sd(R),col="blue")

> for(t in 1:length(R)){
+ sigma2[t+1,1]=beta1*sigma2[t,1]+(1-beta1)*R[t+1]^2
+ sigma2[t+1,2]=beta2*sigma2[t,2]+(1-beta2)*R[t+1]^2
+ sigma2[t+1,3]=beta3*sigma2[t,3]+(1-beta3)*R[t+1]^2
+ }
Erreur dans sigma2[t + 1, 1] = beta1 * sigma2[t, 1] + (1 - beta1) * R[t +  :
  indice hors limites
> S2=ts(data = sigma2, start = 1991, frequency = 252)
> plot(qnorm(.01)*sqrt(S2[,2]),col="red")
> abline(h=mean(R)+qnorm(.05)*sd(R),col="green")
> abline(h=mean(R)+qnorm(.01)*sd(R),col="blue")
> lines(qnorm(.01)*sqrt(S2[,3]),col="purple")

Bref,on a une estimation locale de la volatilité, avec une estimation globale (en ensuite on utilise le fait que, localement, on suppose les rendements Gaussiens).
On peut ensuite utiliser des résultats sur les valeurs extrêmes, comme évoqués ici. Tout d'abord essayons d'utiliser l'estimateur de Hill. Le soucis est que pour calculer l'estimateur de Hill, il faut des données positives. On va donc se restreindre aux fortes pertes, dont on prendra ensuite l'opposé.
> RP=-R[R<(-.01)]
> length(RP)/length(R)
[1] 0.1843194
On se focalise ainsi sur 20% des observations, correspondant aux plus fortes pertes (rendement journaliers présentant une perte supérieure - en valeur absolue - à 1%). Pour calculer le quantile à 99% sur l'ensemble, il faudra calculer le quantile à 94,5% sur cette sous base,
> 1-0.01/(length(RP)/length(R))
[1] 0.9457464

Si on regarde l'estimateur de Hill sur le quantile, on obtient
> library(evir)
> hill(RP,option="quantile",p=.945)
Graph may look strange !!
Suggestion 1: Increase `p' above 0.98316
Suggestion 2: Increase `start' above  50

Autrement dit, une valeur de -4,1% semble être un estimateur possible. Ramené sur le graphique précédant, on obtient la barre suivante, avec le trait en noir sur le graphique,

On peut aussi utiliser un ajustement de loi GPD qui peut se faire à partir de la base initiale, en expliquant qu'on s'intéresse aux pertes dépassant (en valeur absolue toujours) 1,5%,
> GPD=gpd(as.numeric(-R),.015)
> TP=tailplot(GPD)
>  gpd.q(TP, 0.99)
  Lower CI   Estimate   Upper CI
0.03755175 0.03971711 0.04242509
>  gpd.q(TP, 0.995)
  Lower CI   Estimate   Upper CI
0.04480919 0.04811167 0.05270170
>  gpd.q(TP, 0.999)
  Lower CI   Estimate   Upper CI
0.06184920 0.06991049 0.08305725

On obtient ici un quantile à 99% aux alentours de 3,7% (4,1% semblant ici trop important). 

Mais de la même manière que supposer la volatilité constante dans le temps était absurde, on peut douter de la pertinence de notre analyse, en utilisant la théorie des valeurs extrêmes sur l'ensemble de la base. Le code suivant, qui est un peu du bricolage (mais tant pis) permet de calculer à différentes dates des quantiles avec la méthode précédente en prenant en compte les 200 dernières observations,
> n=length(R)
> q=matrix(NA,100,3)
> for(i in 1:100){
+ debut=max(0,trunc(n/100*i)-200)+1
+ fin=trunc(n/100*i)
+ x=R[debut:fin]
+ out=gpd(-x,0.005)
+ OUT=tailplot(out,plot=FALSE)
+ Q=gpd.q(OUT,.99)
+ q[i,]=Q[]}

On peut visualiser l'ensemble sur le graphique suivant
> DT=as.Date("01/01/1991","%m/%d/%Y")+seq(0,n,by=n/100)/252*365
> I=is.na(q[,2])
> plot(DT[I==FALSE],-q[I==FALSE,2],type="l",col="red")

Le trait noir est l'ajustement Pareto global, la courbe orange est celui par estimation glissante de la volatilité, et celle en rouge est l'estimation GPD glissante (sur 200 jours). Il y a peut être des soucis temporelles (car il faut trouver un bon proxi de la date), mais voici en gros ce que l'on peut faire en quelques lignes de commande.

Monday, February 15 2010

Econométrie de la finance (2)

Pour préparer le TP d'économétrie de la finance, quelques rappels sur les principales méthodes de calcul de Value-at-Risk que nous avons vues. La base reste le document technique de RiskMetrics, téléchargeable ici par exemple. Je peux renvoyer également ici ou pour des compléments relativement simples.

  • Les estimations basées sur la volatilité: la méthode EWMA
La méthode EWMA est une moyenne pondérée, dont les poids décroissent de manière exponentielle. On peut utiliser une forme récursive simple
http://perso.univ-rennes1.fr/arthur.charpentier/latex/vol-04.png
ou bien l'incrémenter davantage, pour mieux voir la moyenne pondérée apparaître,
http://perso.univ-rennes1.fr/arthur.charpentier/latex/vol-05.png
  • Les estimations basées sur la volatilité: la volatilité intra-day
Notons http://perso.univ-rennes1.fr/arthur.charpentier/latex/vol-P.png le prix de clôture, http://perso.univ-rennes1.fr/arthur.charpentier/latex/vol-M.png le prix maximal, http://perso.univ-rennes1.fr/arthur.charpentier/latex/vol-L.png le prix le plus bas atteint et http://perso.univ-rennes1.fr/arthur.charpentier/latex/vol-O.png le prix à l'ouverture.
L'estimateur de Rogers & Satchell (1991), téléchargeable ici, de la volatilité est 
http://perso.univ-rennes1.fr/arthur.charpentier/latex/vol-01b.png
L'estimateur de Parkinson (1980), téléchargeable ici, est
http://perso.univ-rennes1.fr/arthur.charpentier/latex/vol-02.png
Enfin, l'estimateur de Garman & Klass (1980), téléchargeable ici, est
http://perso.univ-rennes1.fr/arthur.charpentier/latex/vol-03.png
  • Les estimations basées sur les valeurs extrêmes
On peut utiliser le fait qu'un quantile d'une loi de Pareto s'exprime de manière très simple. L'estimateur de Hill de l'indice de queue (que j'avais abordé ici ou sur ce blog) est
http://perso.univ-rennes1.fr/arthur.charpentier/latex/vol-10.png
Or comme
http://perso.univ-rennes1.fr/arthur.charpentier/latex/vol-11.png
pour http://perso.univ-rennes1.fr/arthur.charpentier/latex/vol-12.png et http://perso.univ-rennes1.fr/arthur.charpentier/latex/vol-13.png suffisement petit
http://perso.univ-rennes1.fr/arthur.charpentier/latex/vol-14.png
Si on suppose que le ratio des fonctions à variation lente peut être négligé (ce qui peut être une hypothèse relativement forte)
http://perso.univ-rennes1.fr/arthur.charpentier/latex/vol-15.png
Aussi, un estimateur naturel de la fonction de répartition, dans les queues, est alors
http://perso.univ-rennes1.fr/arthur.charpentier/latex/vol-16.png
qui s'inverse sous la forme
http://perso.univ-rennes1.fr/arthur.charpentier/latex/vol-20.png
pour des niveaux de quantile http://perso.univ-rennes1.fr/arthur.charpentier/latex/vol-21.png tel que http://perso.univ-rennes1.fr/arthur.charpentier/latex/vol-22.png. On a alors
http://perso.univ-rennes1.fr/arthur.charpentier/latex/vol-23.png
Si on faisait un ajustement par une loi de Pareto généralisée, on obtiendrait
http://perso.univ-rennes1.fr/arthur.charpentier/latex/vol-24.png



Friday, February 12 2010

Econométrie de la finance avec R (1)

Afin de préparer le TD de mardi, d'économétrie de la finance, quelques lignes de code. J'avais parlé ici de la fonction get.hist.quote() du package tseries. Ainsi, on peut récupérer l’historique de l’indice CAC40, en utilisant simplement x<-get.hist.quote("^FCHI"). Par défaut, les données sont récupérées via http://chart.yahoo.com/, i.e. ici pour la base csv utilisée précédemment,
> library(tseries)
> x<-get.hist.quote("^FCHI")
essai de l'URL 'http://chart.yahoo.com/table.csv?s=^FCHI&

a=0&b=02&c=1991&d=1&e=11&f=2010&g=d&q=q&y=0&z=^FCHI&x=.csv'
Content type 'text/csv' length unknown
URL ouverte
downloaded 267 Kb
> head(x)
           Open High  Low Close
1991-01-02 1504 1509 1488  1505
1991-01-03 1500 1540 1500  1539
1991-01-04 1535 1552 1533  1547
1991-01-07 1533 1533 1501  1508
1991-01-08 1475 1507 1475  1503
1991-01-09 1511 1554 1509  1552
> plot(x)

On a ici le niveau à l'ouverture, en clôture mais aussi le maximum et le minimum sur la journée.
Mais on peut aussi utiliser d'autres sites, comme http://www.oanda.com/, qui propose par exemple des taux de change. On peut ainsi récupérer des séries sur 1000 jours avec le code suivant
> z1<-get.hist.quote(instrument="EUR/USD",provider="oanda", start=Sys.Date()-500)
essai de l'URL 'http://www.oanda.com/convert/fxhistory?lang=en&date1=09%2F30%2F08&date=02%2F11%2F10&date_fmt=
us&exch=EUR&exch2=&expr=USD&expr2=&margin_fixed=0&&SUBMIT=Get+Table&format=ASCII&redirected=1'

Content type 'text/html' length unknown
URL ouverte
downloaded 29 Kb
> z2<-get.hist.quote(instrument="EUR/USD",provider="oanda", start=Sys.Date()-1000,end=Sys.Date()-501)
essai de l'URL 'http://www.oanda.com/convert/fxhistory?lang=en&date1=05%2F19%2F07&date=09%2F29%2F08&date_fmt=
us&exch=EUR&exch2=&expr=USD&expr2=&margin_fixed=0&&SUBMIT=Get+Table&format=ASCII&redirected=1'

Content type 'text/html' length unknown
URL ouverte
downloaded 29 Kb
C'est un peu pénible d'avoir une limite sur 500 jours, mais à moins de vouloir des séries très très longues, une boucle permet de récupérer les données assez rapidement.
> EUR.USD=c(z1,z2)
> plot(EUR.USD)

Nous verrons en TD comment calculer des Value-at-Risk, soit en programmant les formules vues en cours, soit à l'aide des fonctions proposées dans les packages de R, détaillés ici. En particulier, on pourra utiliser library(VaR), ici.