Read in Data

rm(list = ls())
source("~/OneDrive - INSEAD/SkewEllipt/Code_Update/Rfns.R")
library("data.table")
library("ggplot2")
library("psych")
library("lintools")
library("xtable")

path = "/Users/jinyuanzhang/OneDrive - INSEAD/SkewEllipt/Code_Update/CoVaR_forecast/"
folders= 1:100
load(paste(path,"s",as.character(1),"/COVAR.RDATA",sep=""))  
DF = out$df
fit = out$fit
for(folder in folders){
  load(paste(path,"s",as.character(folder),"/COVAR.RDATA",sep=""))
  DF = rbind(DF, out$df)
  fit = rbind(fit, out$fit)
}
DF = data.table(DF)
fit = data.table(fit)
fit[,  c("alpha1", "alpha2", "rho", "nu", "sd1", "sd2"):= tstrsplit(V3,",",fixed = TRUE)] 
fit[, alpha1:=substring(alpha1,3)]
fit[, sd2:=substring(sd2,1,nchar(sd2)-1)]
fit[,V3:=NULL]
fit[,  3:8 := lapply(.SD, as.numeric), .SDcols = 3:8]

#### Trim data at 0.5% tails
DF[, CoVaR_evt99 := winsor(CoVaR_evt99, 0.001)]
DF[, CoVaR_fp99 := winsor(CoVaR_fp99, 0.001)]
# DF[, VaR99 := winsor(VaR99, 0.001)]
DF = DF[!(CoVaR_evt99==max(CoVaR_evt99))]
DF = DF[!(CoVaR_fp99==max(CoVaR_fp99))]
# DF = DF[!(VaR99==max(VaR99))]

DF[, N := .N, by = .(firm)]


report.1 <- function(dat){
  c(min(as.matrix(dat),na.rm=T),
    quantile(as.matrix(dat), na.rm=T, c(0.05,0.25,0.50,0.75,0.95)), max(as.matrix(dat),na.rm=T))
}


#### Summary statistics for estiamted parameters
report = t(apply(fit[,3:8], 2, report.1))
colnames(report) = c("Min", "5%", "25%", "50%", "75%", "95%", "Max")
print(report)
##                Min          5%       25%       50%       75%       95%
## alpha1 -0.26569755 -0.11795223 0.0675564 0.1376575 0.2009652 0.2881240
## alpha2  0.28196952  0.41668839 0.5096010 0.7251475 1.0016914 1.2439247
## rho    -0.04047033  0.06050544 0.1055952 0.1393781 0.1778673 0.2680570
## nu      3.67727299  4.04734701 4.2779174 4.5011852 4.8556391 5.6812541
## sd1     0.72718438  0.80479892 0.8352061 0.8616396 0.8889533 0.9216741
## sd2     0.69280993  0.79009849 0.8329532 0.9190491 0.9761305 1.0312317
##              Max
## alpha1 0.4111905
## alpha2 1.5995800
## rho    0.3585994
## nu     6.8656810
## sd1    0.9933988
## sd2    1.1133864

Comparison between EVT and FP mthods

Empirical estimator for VaR violation: Loss_stock > VaR_stock

hist(DF[, list(sum( (Loss_stock > VaR99)/N )), by = .(firm)]$V1)

# hist(DF[, list(sum( (Loss_stock > VaR95)/N )), by = .(firm)]$V1)
Empirical estimator for violatoin: Loss_Index > CoVaR_Index given Loss_stock > VaR_stock
DF_CoVaR = DF[, C99:= ifelse(Loss_stock > VaR99,1,0)]
DF_CoVaR[C99 == 1, CoVaR_N99 := .N, by = .(firm)]
### EVT method 
hist(DF_CoVaR[C99==1, list(sum((Loss_Index > CoVaR_evt99)/CoVaR_N99)), by = .(firm)]$V1, main = "EVT")

### FP method 
hist(DF_CoVaR[C99==1, list(sum((Loss_Index > CoVaR_fp99)/CoVaR_N99)), by = .(firm)]$V1, main = "FP")

LRuc

LRuc_pvalue = DF_CoVaR[C99 ==1, list(fp_LRuc = LRuc(0.01, Loss_Index > CoVaR_fp99)$pvalue, evt_LRuc = LRuc(0.01, Loss_Index > CoVaR_evt99)$pvalue), by = .(firm)]
LRuc_pvalue[, `:=`(p10_evt = evt_LRuc > 0.1, p05_evt = evt_LRuc > 0.05, p01_evt = evt_LRuc > 0.01, p10_fp = fp_LRuc > 0.1, p05_fp = fp_LRuc > 0.05, p01_fp = fp_LRuc > 0.01)]
print(LRuc_pvalue)
##    firm      fp_LRuc  evt_LRuc p10_evt p05_evt p01_evt p10_fp p05_fp
## 1:    T 0.0001268467 0.2164653    TRUE    TRUE    TRUE  FALSE  FALSE
## 2:  IBM 0.0022534647 0.8998699    TRUE    TRUE    TRUE  FALSE  FALSE
## 3:  CTR 0.0341019204 0.2494031    TRUE    TRUE    TRUE  FALSE  FALSE
## 4:  HWP 0.0312639085 0.2567045    TRUE    TRUE    TRUE  FALSE  FALSE
##    p01_fp
## 1:  FALSE
## 2:  FALSE
## 3:   TRUE
## 4:   TRUE

cct.onesided

pv.avg

fp_cct =  DF_CoVaR[C99==1, (cct.1s.VaR(r = CoVaR_fp99, x = Loss_Index , lev=0.99, hac = FALSE)$pv.avg), by = .(firm)]
colnames(fp_cct)[2] = "fp_cct"
evt_cct =  DF_CoVaR[C99==1, (cct.1s.VaR(r = CoVaR_evt99, x = Loss_Index , lev=0.99, hac = FALSE)$pv.avg), by = .(firm)]
colnames(evt_cct)[2] = "evt_cct"
cct_pvalue = merge(fp_cct, evt_cct, by = c("firm"))
cct_pvalue[, `:=`(p10_evt = evt_cct > 0.1, p05_evt = evt_cct > 0.05, p01_evt = evt_cct > 0.01, p10_fp = fp_cct > 0.1, p05_fp = fp_cct > 0.05, p01_fp = fp_cct > 0.01)]
cct_pvalue
##    firm     fp_cct   evt_cct p10_evt p05_evt p01_evt p10_fp p05_fp p01_fp
## 1:  CTR 0.08641188 1.0000000    TRUE    TRUE    TRUE  FALSE   TRUE   TRUE
## 2:  HWP 0.08458366 1.0000000    TRUE    TRUE    TRUE  FALSE   TRUE   TRUE
## 3:  IBM 0.03147410 0.4519732    TRUE    TRUE    TRUE  FALSE  FALSE   TRUE
## 4:    T 0.01540398 1.0000000    TRUE    TRUE    TRUE  FALSE  FALSE   TRUE

pv.cond

fp_cct =  DF_CoVaR[C99==1, (cct.1s.VaR(r = CoVaR_fp99, x = Loss_Index , lev=0.99, hac = FALSE)$pv.cond), by = .(firm)]
colnames(fp_cct)[2] = "fp_cct"
evt_cct =  DF_CoVaR[C99==1, (cct.1s.VaR(r = CoVaR_evt99, x = Loss_Index , lev=0.99, hac = FALSE)$pv.cond), by = .(firm)]
colnames(evt_cct)[2] = "evt_cct"
cct_pvalue = merge(fp_cct, evt_cct, by = c("firm"))
cct_pvalue[, `:=`(p10_evt = evt_cct > 0.1, p05_evt = evt_cct > 0.05, p01_evt = evt_cct > 0.01, p10_fp = fp_cct > 0.1, p05_fp = fp_cct > 0.05, p01_fp = fp_cct > 0.01)]
cct_pvalue
##    firm     fp_cct evt_cct p10_evt p05_evt p01_evt p10_fp p05_fp p01_fp
## 1:  CTR 0.15739934       1    TRUE    TRUE    TRUE   TRUE   TRUE   TRUE
## 2:  HWP 0.19058078       1    TRUE    TRUE    TRUE   TRUE   TRUE   TRUE
## 3:  IBM 0.08782837       1    TRUE    TRUE    TRUE  FALSE   TRUE   TRUE
## 4:    T 0.04621193       1    TRUE    TRUE    TRUE  FALSE  FALSE   TRUE

Comparative backtesting

com1 =  DF_CoVaR[C99==1, as.list(TLMfn.biv(r = CoVaR_evt99, rS = CoVaR_fp99,  y= Loss_Index , lev=0.99, h = 1)), by = .(firm)]
com0 =  DF_CoVaR[C99==1, as.list(TLMfn.biv(r = CoVaR_evt99, rS = CoVaR_fp99,  y= Loss_Index , lev=0.99, h = 0)), by = .(firm)]
colnames(com0)[2:5] = c("TLM01_0", "TLM05_0", "TLM10_0", "Tn_0")
colnames(com1)[2:5] = c("TLM01_1", "TLM05_1", "TLM10_1", "Tn_1")
com = merge(com0, com1, by = c("firm"))
print(com)
##    firm TLM01_0 TLM05_0 TLM10_0       Tn_0 TLM01_1 TLM05_1 TLM10_1
## 1:  CTR       1       1       1 -0.9481109       1       1       1
## 2:  HWP       1       1       2 -1.3820509       1       1       1
## 3:  IBM       1       1       1 -1.1903287       1       1       1
## 4:    T       1       1       2 -1.5222830       1       1       2
##          Tn_1
## 1: -0.8805963
## 2: -1.1400320
## 3: -0.9781751
## 4: -1.3627847
#### All  ###
red.count <- apply((com[,c(3:5, 7:9)]==0),2,"sum") #number of 0's in each column
yellow.count <- apply((com[,c(3:5, 7:9)]==1),2,"sum")  #number of 1's in each column
green.count <-  apply((com[,c(3:5, 7:9)]==2),2,"sum")  #number of 2's in each column
xtable(round(cbind(red.count[4],yellow.count[4],green.count[4])), digits = 0) ## percentage in each category
## % latex table generated in R 3.4.0 by xtable 1.8-2 package
## % Thu Dec 14 00:13:59 2017
## \begin{table}[ht]
## \centering
## \begin{tabular}{rrrr}
##   \hline
##  & 1 & 2 & 3 \\ 
##   \hline
## TLM05\_1 & 0 & 4 & 0 \\ 
##    \hline
## \end{tabular}
## \end{table}

Compare scores

c(sum((com$Tn_0< 0)),sum((com$Tn_1< 0)))
## [1] 4 4