Introduction
This is the home page of the article "Nonparametric estimation in quadratic hedging", written by Jussi Klemelä.
Abstract of the article
We construct nonparametric estimators of hedging coefficients of a European option when quadratic hedging is applied. In quadratic hedging the hedging coefficients are chosen so that the mean squared hedging error is minimized. We define two statistical estimators applying kernel regression. The first estimator is better when the distribution of the stock price is heavy-tailed, and the second estimator is better when the distribution is light-tailed. We prove consistency of the estimators and derive rates of convergence of the estimators. In addition, we derive rates of convergence of the mean squared hedging error.
Reproducing the computations
Install software
source("http://jklm.fi/art/quadhedge/quadhedge.R") source("http://jklm.fi/finatool/finatool.R") source("http://jklm.fi/regpro/regpro.R")
Read SP500 Data
file<-"http://jklm.fi/statopti/GSPC.csv" gspc0<-read.csv(file=file) gspc<-gspc0[,6] prices<-gspc[2:length(gspc)] n<-length(prices) times<-matrix(0,n,1) delta<-1/251.63 alku<-1950+0/12 for (i in 1:length(times)) times[i]<-alku+(i-1)*delta retu<-log(gspc[2:length(gspc)]/gspc[1:(length(gspc)-1)])
Read Volatility
file<-"/home/jsk/Arti/statopti/var/garch-sp500-log-roll.var" #list=c("sigmat","alpha0t","alpha1t","betat")) load(file=file)
Estimator using differences: Compute quadratic hedging coefficients
S<-100 r<-0 T<-2 h<-0.7 h2<-0.7 x1<-seq(96,104,1) # price range x2<-seq(-5.5,-3,0.1) # range of logarithmic volatility xx2<-exp(x2)*sqrt(250) # range of annualized volatility koot<-seq(95,100) # range of strike prices mata<-matrix(0,length(x2),length(koot)) mata1<-matrix(0,length(x2),length(koot)) mata2<-matrix(0,length(x2),length(koot)) mata3<-matrix(0,length(x2),length(koot)) mata11n<-matrix(0,n,length(koot)) mata12n<-matrix(0,n,length(koot)) mata13n<-matrix(0,n,length(koot)) mata14n<-matrix(0,n,length(koot)) mataK1n<-matrix(0,n,length(koot)) mataH1n<-matrix(0,n,length(koot)) for (kk in 1:length(koot)){ K<-koot[kk] V0<-bs(S,K,v=sd(retu)*sqrt(250),r=0,t=T/360,type="put") op<-twoperiod(K=K,S=S,r=0,h=h,h2=h2,x1=x1,x2=x2,V0=V0, prices=prices,sigmat=sigmat) mata[,kk]<-op$xi mata1[,kk]<-op$f01 mata2[,kk]<-op$f02 mata3[,kk]<-op$f03 mata11n[,kk]<-op$f11n mata12n[,kk]<-op$f12n mata13n[,kk]<-op$f13n mata14n[,kk]<-op$f14n mataK1n[,kk]<-op$K1n mataH1n[,kk]<-op$H1n } mata.diffe<-mata mata2.diffe<-mata2 mata3.diffe<-mata3
Estimator using returns: Compute quadratic hedging coefficients
S<-100 r<-0 T<-2 h<-0.7 h2<-0.7 x1<-seq(96,104,1) # price range x2<-seq(-5.5,-3,0.1) # range of logarithmic volatility xx2<-exp(x2)*sqrt(250) # range of annualized volatility koot<-seq(95,100) # range of strike prices koot<-seq(95,100) mata<-matrix(0,length(x2),length(koot)) mata1<-matrix(0,length(x2),length(koot)) mata2<-matrix(0,length(x2),length(koot)) mata3<-matrix(0,length(x2),length(koot)) mata11n<-matrix(0,n,length(koot)) mata12n<-matrix(0,n,length(koot)) mata13n<-matrix(0,n,length(koot)) mata14n<-matrix(0,n,length(koot)) mataK1n<-matrix(0,n,length(koot)) mataH1n<-matrix(0,n,length(koot)) for (kk in 1:length(koot)){ K<-koot[kk] V0<-bs(S,K,v=sd(retu)*sqrt(250),r=0,t=T/360,type="put") op<-twoperiod.retu(K=K,S=S,r=0,h=h,h2=h2,x1=x2,V0=V0, prices=prices,sigmat=sigmat) mata[,kk]<-op$xi mata1[,kk]<-op$f01 mata2[,kk]<-op$f02 mata3[,kk]<-op$f03 mata11n[,kk]<-op$f11n mata12n[,kk]<-op$f12n mata13n[,kk]<-op$f13n mata14n[,kk]<-op$f14n mataK1n[,kk]<-op$K1n mataH1n[,kk]<-op$H1n } mata.retu<-mata mata2.retu<-mata2 mata3.retu<-mata3
Figure 1
# compute Black-Scholes hedging coefficients matab<-matrix(0,length(x2),length(koot)) for (kk in 1:length(koot)){ K<-koot[kk] deltas<-matrix(0,length(x2),1) for (i in 1:length(x2)){ vee<-xx2[i] deltas[i]<-bs.delta(S,K,v=vee,r=0,t=T/360,type="put") } matab[,kk]<-deltas } # Figure 1 cex.axis<-1.5 cex.lab<-1.5 cex.sub<-1.5 cex<-1.5 lty<-1.5 # Panel (a) matplot(xx2,mata.retu,type="l",lty=1,col="red", xlab="",ylab="",cex=cex,cex.axis=cex.axis,cex.lab=cex.lab) for (kk in 1:length(koot)){ ind<-23 text(xx2[ind],mata.retu[ind,kk],as.character(koot[kk]),cex=cex,col="red") } matplot(xx2,mata.diffe,type="l",lty=1,col="blue",add=TRUE, xlab="",ylab="",cex=cex,cex.axis=cex.axis,cex.lab=cex.lab) for (kk in 1:length(koot)){ ind<-25 text(xx2[ind],mata.diffe[ind,kk],as.character(koot[kk]),cex=cex,col="blue") } mtext("volatility",side=1,cex=1.5,line=2.4) title(sub="(a)",cex.sub=cex.sub) # Panel (b) matplot(xx2,matab,type="l",lty=1,col="black", xlab="",ylab="",cex=cex,cex.axis=cex.axis,cex.lab=cex.lab) mtext("volatility",side=1,cex=1.5,line=2.4) for (kk in 1:length(koot)){ ind<-22 text(xx2[ind],matab[ind,kk],as.character(koot[kk]),cex=cex,col="black") } title(sub="(b)",cex.sub=cex.sub)
Figure 2
cex.axis<-1.5 cex.lab<-1.5 cex.sub<-1.5 cex<-1.5 lty<-1.5 # Panel (a) plot(xx2,S^2*mata2.retu[,1],type="l",lty=1,col="red", xlab="",ylab="",cex=cex,cex.axis=cex.axis,cex.lab=cex.lab) matplot(xx2,mata2.diffe[,1],type="l",lty=1,col="blue",add=TRUE, xlab="",ylab="",cex=cex,cex.axis=cex.axis,cex.lab=cex.lab) mtext("volatility",side=1,cex=1.5,line=2.4) title(sub="(a)",cex.sub=cex.sub) # Panel (b) matplot(xx2,S*mata3.retu,type="l",lty=1,col="red", xlab="",ylab="",cex=cex,cex.axis=cex.axis,cex.lab=cex.lab) mtext("volatility",side=1,cex=1.5,line=2.4) for (kk in 1:length(koot)){ ind<-26 text(xx2[ind],S*mata3.retu[ind,kk],as.character(koot[kk]),cex=cex,col="red") } matplot(xx2,mata3.diffe,type="l",lty=1,col="blue",add=TRUE, xlab="",ylab="",cex=cex,cex.axis=cex.axis,cex.lab=cex.lab) mtext("volatility",side=1,cex=1.5,line=2.4) for (kk in 1:length(koot)){ ind<-25 text(xx2[ind],mata3.diffe[ind,kk],as.character(koot[kk]),cex=cex,col="blue") } title(sub="(b)",cex.sub=cex.sub)