精选博文

C++ implementation of a simple order book

Please refer to my github for the code:  https://github.com/DongliangLarryYi.  1.      Data Structure 1.1   A basic or...

Wednesday, July 13, 2016

Value-at-Risk Computed Using Various Methods (Historical Simulation, Delta-normal method, Delta-Normal method using the exponentially weighted covariance estimator, Historical simulation using rescaled returns)

By Dongliang “Larry” Yi

Problem:



1.     Historical Simulation

#thousand.000
VaR <- vector("numeric", length=246)

for (i in 1:246)
{
PLGBP = (1000/(data$GBPUSD[i:(i+1999)]*data$UKX[i:(i+1999)]))*data$GBPUSD[(i+1):(i+2000)]*data$UKX[(i+1):(i+2000)]-1000
PLEUR = (1000/(data$EURUSD[i:(i+1999)]*data$DAX[i:(i+1999)]))*data$EURUSD[(i+1):(i+2000)]*data$DAX[(i+1):(i+2000)]-1000
PLUSD = (1000/data$SPX[i:(i+1999)])*data$SPX[(i+1):(i+2000)]-1000
Total = PLGBP + PLEUR + PLUSD

VaR[i]<-abs(unname(quantile(Total,0.01,na.rm=T)))

}

VaR
#VaR stores the historical VaR

2.     Delta-normal method

VaRdelta <- vector("numeric", length=246)

for (i in 1:246)
{
  RFTGBP = (1/(data$GBPUSD[i:(i+1999)]*data$UKX[i:(i+1999)]))*data$GBPUSD[(i+1):(i+2000)]*data$UKX[(i+1):(i+2000)]-1
  RDAXEUR = (1/(data$EURUSD[i:(i+1999)]*data$DAX[i:(i+1999)]))*data$EURUSD[(i+1):(i+2000)]*data$DAX[(i+1):(i+2000)]-1
  RSP500 = (1/data$SPX[i:(i+1999)])*data$SPX[(i+1):(i+2000)]-1
  stdRSP500 = sqrt(var(RSP500))
  stdRDAXEUR = sqrt(var(RDAXEUR))
  stdRFTGBP = sqrt(var(RFTGBP))
  covSPFT = cov(RSP500,RFTGBP)
  covSPDA = cov(RSP500,RDAXEUR)
  covFTDA = cov(RFTGBP,RDAXEUR)
 
 stdPortfolio=sqrt(var(RSP500)+var(RDAXEUR)+var(RFTGBP)+2*cov(RSP500,RFTGBP)+2*cov(RSP500,RDAXEUR)+2*cov(RFTGBP,RDAXEUR))
 
  VaRdelta[i]=2.33*stdPortfolio*1000
 
}

VaRdelta

#below assume the average daily return is zero.
VaRdeltabook <- vector("numeric", length=246)

for (i in 1:246)
{
  RFTGBP = (1/(data$GBPUSD[i:(i+1999)]*data$UKX[i:(i+1999)]))*data$GBPUSD[(i+1):(i+2000)]*data$UKX[(i+1):(i+2000)]-1
  RDAXEUR = (1/(data$EURUSD[i:(i+1999)]*data$DAX[i:(i+1999)]))*data$EURUSD[(i+1):(i+2000)]*data$DAX[(i+1):(i+2000)]-1
  RSP500 = (1/data$SPX[i:(i+1999)])*data$SPX[(i+1):(i+2000)]-1
  stdRSP500 = sqrt((sum(RSP500^2))/2000)
  stdRDAXEUR = sqrt((sum(RDAXEUR^2))/2000)
  stdRFTGBP = sqrt((sum(RFTGBP^2))/2000)
  covSPFT = (sum(RSP500*RFTGBP))/2000
  covSPDA = (sum(RSP500*RDAXEUR))/2000
  covFTDA = (sum(RFTGBP*RDAXEUR))/2000
 
  stdPortfolio=sqrt((sum(RSP500^2))/2000+(sum(RDAXEUR^2))/2000+(sum(RFTGBP^2))/2000+2*covSPFT+2*covSPDA+2*covFTDA)
 
  VaRdeltabook[i]=2.33*stdPortfolio*1000
 
}

VaRdeltabook

3.     Delta-Normal method using the exponentially weighted covariance estimator

VaRdeltaexpo <- vector("numeric", length=246)

weight <- vector("numeric", length=100)
weight[100]=0.06
for (i in 1:99)
{
  weight[i]=(0.94^(100-i))*0.06
 
}

for (i in 1:246)
{
  RFTGBP = (1/(data$GBPUSD[(i+1900):(i+1999)]*data$UKX[(i+1900):(i+1999)]))*data$GBPUSD[(i+1901):(i+2000)]*data$UKX[(i+1901):(i+2000)]-1
  RDAXEUR = (1/(data$EURUSD[(i+1900):(i+1999)]*data$DAX[(i+1900):(i+1999)]))*data$EURUSD[(i+1901):(i+2000)]*data$DAX[(i+1901):(i+2000)]-1
  RSP500 = (1/data$SPX[(i+1900):(i+1999)])*data$SPX[(i+1901):(i+2000)]-1
  stdRSP500 = sqrt(sum((RSP500^2)*weight))
  stdRDAXEUR = sqrt(sum((RDAXEUR^2)*weight))
  stdRFTGBP = sqrt(sum((RFTGBP^2)*weight))
  covSPFT = sum((RSP500*RFTGBP)*weight)
  covSPDA = sum((RSP500*RDAXEUR)*weight)
  covFTDA = sum((RDAXEUR*RFTGBP)*weight)

  stdPortfolio=sqrt(sum((RSP500^2)*weight)+sum((RDAXEUR^2)*weight)+sum((RFTGBP^2)*weight)+2*sum((RSP500*RFTGBP)*weight)+2*sum((RSP500*RDAXEUR)*weight)+2*sum((RDAXEUR*RFTGBP)*weight))
 
  VaRdeltaexpo[i]=2.33*stdPortfolio*1000
 
}

VaRdeltaexpo


4.     Historical simulation using rescaled returns

VaRexpohist <- vector("numeric", length=246)

sigmaFT <- vector("numeric", length=2246)
sigmaDAX<- vector("numeric", length=2246)
sigmaSP <- vector("numeric", length=2246)


for (i in 1:2247)
{
  RFTGBP = (1/(data2$GBPUSD[i:(i+99)]*data2$UKX[(i):(i+99)]))*data2$GBPUSD[(i+1):(i+100)]*data2$UKX[(i+1):(i+100)]-1
  RDAXEUR = (1/(data2$EURUSD[(i):(i+99)]*data2$DAX[(i):(i+99)]))*data2$EURUSD[(i+1):(i+100)]*data2$DAX[(i+1):(i+100)]-1
  RSP500 = (1/data2$SPX[(i):(i+99)])*data2$SPX[(i+1):(i+100)]-1
  sigmaSP[i] = sqrt(sum((RSP500^2)*weight))
  sigmaDAX[i] = sqrt(sum((RDAXEUR^2)*weight))
  sigmaFT[i] = sqrt(sum((RFTGBP^2)*weight))
 
}

for (i in 1:246)
{
 
  PLGBP = ((1000/(data$GBPUSD[i:(i+1999)]*data$UKX[i:(i+1999)]))*data$GBPUSD[(i+1):(i+2000)]*data$UKX[(i+1):(i+2000)]-1000)*sigmaFT[i+2000]/sigmaFT[(i+1):(i+1999)]
  PLEUR = ((1000/(data$EURUSD[i:(i+1999)]*data$DAX[i:(i+1999)]))*data$EURUSD[(i+1):(i+2000)]*data$DAX[(i+1):(i+2000)]-1000)*sigmaDAX[i+2000]/sigmaDAX[(i+1):(i+1999)]
  PLUSD = ((1000/data$SPX[i:(i+1999)])*data$SPX[(i+1):(i+2000)]-1000)*sigmaSP[i+2000]/sigmaSP[(i+1):(i+1999)]
  Total = PLGBP + PLEUR + PLUSD
  VaRexpohist[i]<-abs(unname(quantile(Total,0.01,na.rm=T)))

}

VaRexpohist


5.     The result

No comments:

Post a Comment