#ratingsSP code for data from Jan 2000 to Dec 2017 #Monthly credit rating according to S&P dataset <- t(matrix(scan(file=".../ratingsSP.txt", what="character", sep="\t"), nrow=4)) total <- dim(dataset)[1] #9390 tabTlen <- table(dataset[,1]) countries <- names(tabTlen) ncountries <- length(countries) #28 #[1] "Austria" "Belgium" "Bulgaria" "Croatia" "Cyprus" "Czech Republic" "Denmark" "Estonia" "Finland" "France" "Germany" "Greece" "Hungary" "Ireland" "Italy" "Latvia" "Lithuania" "Luxembourg" "Malta" "Netherlands" "Poland" "Portugal" "Romania" "Slovakia" "Slovenia" "Spain" "Sweden" "United Kingdom" tabTlen <- c(tabTlen, use.names=FALSE) #[1] 510 351 230 252 287 294 442 241 549 511 413 230 309 351 350 252 247 285 286 336 271 271 262 287 260 353 483 477 ends <- c(cumsum(tabTlen), use.names=FALSE) #[1] 510 861 1091 1343 1630 1924 2366 2607 3156 3667 4080 4310 4619 4970 5320 5572 5819 6104 6390 6726 6997 7268 7530 7817 8077 8430 8913 939 starts <- c(cumsum(c(1,tabTlen[1:(ncountries-1)])), use.names=FALSE) #[1] 1 511 862 1092 1344 1631 1925 2367 2608 3157 3668 4081 4311 4620 4971 5321 5573 5820 6105 6391 6727 6998 7269 7531 7818 8078 8431 8914 #Full rating: states <- c("D","SD","R","CC","CCC-","CCC","CCC+","B-","B","B+","BB-","BB","BB+","BBB-","BBB","BBB+","A-","A","A+","AA-","AA","AA+","AAA") #position in states corresponds to natural ordering nostates <- length(states) nostates #23 m <- nostates-1 #For binarization: bincodes <- diag(1,nostates) #Using unique start date "Jan 2000": start2000 <- c(1:total)[dataset[,2]=="Jan 2000"] #[1] 295 646 876 1128 1415 1709 2151 2392 2941 3452 3865 4095 4404 4755 5105 5357 5604 5889 6175 6511 6782 7053 7315 7602 7862 8215 8698 9175 Tlen2000 <- length(dataset[start2000[1]:ends[1],2]) #216 years <- Tlen2000/12 #18 #Maximal lag for serial dependence properties maxlag <- 10 level <- 0.05 z2 <- qnorm(1-level/2) #Constructing vector of column labels results2000 <- c("Country", "T") fpaste <- function(i) paste("p", i, sep="") results2000 <- c(results2000, sapply(0:m, fpaste)) fpaste <- function(i) paste("f", i, sep="") results2000 <- c(results2000, sapply(0:(m-1), fpaste)) results2000 <- c(results2000, "Median", "IOV", "asym", "skew", "crit_l", "crit_u") fpaste <- function(i) paste("k", i, sep="") results2000 <- c(results2000, sapply(1:maxlag, fpaste)) ncols <- length(results2000) results2000 <- array(0, dim=c(ncountries,ncols), dimnames=list(countries, results2000)) summaries2000 <- array(0, dim=c(ncountries,4), dimnames=list(countries, c("median", "IOV", "asym", "skew"))) kappas2000 <- array(0, dim=c(ncountries,2+maxlag), dimnames=list(countries, c("crit_l", "crit_u", 1:maxlag))) #also critical values #Time series plots: for(ic in c(1:ncountries)){ country <- countries[ic] #full rating: data2000 <- dataset[start2000[ic]:ends[ic],3] res2000 <- c(ic,Tlen2000) #Rank counts 0-m: datanum2000 <- match(data2000, states)-1 plot(datanum2000, type="b", pch=19, cex=0.5, ylim=c(0,m), xlab = "t", xaxt="n", ylab = "Rating", yaxt="n", las=1, main=country) axis(side=1, at=c(0:years)*12, labels=c(2000:(2000+years)), las=2) axis(side=2, at=c(0,3,5,8,11,14,17,20,22), labels=c("D","CC","CCC","B","BB","BBB","A","AA","AAA"), las=1) }# for countries #Summary statistics for(ic in c(1:ncountries)){ country <- countries[ic] #full rating: data2000 <- dataset[start2000[ic]:ends[ic],3] res2000 <- c(ic,Tlen2000) #Rank counts 0-m: datanum2000 <- match(data2000, states)-1 #Binarization: databin2000 <- bincodes[datanum2000+1,] #assign row vectors #Marginal properties #relative frequencies hatpi2000 <- colMeans(databin2000) hatf2000 <- cumsum(hatpi2000)[1:m] # print(hatpi2000) # print(hatf2000) res2000 <- c(res2000, hatpi2000, hatf2000) #Location: #Median of data med2000 <- median(datanum2000) res2000 <- c(res2000, med2000) summaries2000[ic,1] <- med2000 #Dispersion: #IOV: disp2000 <- 2*sum(hatf2000*(1-hatf2000)) iov2000 <- 2/m*disp2000 #iov2000 <- 1-1/m* sum((2*hatf2000-1)^2) #print(iov2000) res2000 <- c(res2000, iov2000) summaries2000[ic,2] <- iov2000 #Asymmetry: asym2000 <- sum((1-hatf2000-rev(hatf2000))^2)/m #Skewness: skew2000 <- 1-2/m*mean(datanum2000) #print(c(asym2000, skew2000)) res2000 <- c(res2000, asym2000, skew2000) summaries2000[ic,3] <- asym2000 summaries2000[ic,4] <- skew2000 #Serial dependence properties hatbivprob2000 <- array(0,c(nostates,nostates,maxlag)) for(k in c(1:maxlag)){ for(i in c(1:nostates)){ for(j in c(1:nostates)){ hatbivprob2000[i,j,k] <- mean(databin2000[(k+1):Tlen2000,i]*databin2000[1:(Tlen2000-k),j]) } } } #hatbivprob[,,1] #kappa based on do1: #Required for computing asymptotics: fmat2000 <- array(0, c(m,m)) for(i in c(1:m)){ for(j in c(1:m)){ fmat2000[i,j] <- hatf2000[min(i,j)]-hatf2000[i]*hatf2000[j] }} #for i,j #plug-in asymptotic variance for kappa_do1 sig2k2000 <- 4/disp2000^2 * sum(fmat2000^2) #Critical values: critl2000 <- -1/Tlen2000 - z2 * sqrt(sig2k2000/Tlen2000) critu2000 <- -1/Tlen2000 + z2 * sqrt(sig2k2000/Tlen2000) res2000 <- c(res2000, critl2000, critu2000) kappas2000[ic,1] <- critl2000 kappas2000[ic,2] <- critu2000 #kappa(1) to kappa(maxlag): hatbivcdf2000 <- array(0,c(m,maxlag)) #bivariate diagonal cdf for(k in c(1:maxlag)){ for(i in c(1:m)){ hatbivcdf2000[i,k] <- sum(hatbivprob2000[1:i,1:i,k]) } } kdo12000 <- (apply(hatbivcdf2000,2,sum)-sum(hatf2000^2))/sum(hatf2000*(1-hatf2000)) # print(kdo12000) res2000 <- c(res2000, kdo12000) kappas2000[ic,3:(2+maxlag)] <- kdo12000 results2000[ic,] <- res2000 }# for countries #kappa plots: for(ic in c(1:ncountries)){ plot(kappas2000[ic,3:(2+maxlag)], type="h", xlab = "k", ylab = expression(kappa[d["o,1"]](k)), lwd=4, xlim=c(0,maxlag), ylim=c(-1,1), main=countries[ic]) abline(h=kappas2000[ic,1:2], col=gray(0.5), lwd=2, lty=2) abline(h=0, col=gray(0), lwd=1, lty=1) }# for countries #Further analytic plots par(pty="s") #"m" #Median against IOV: plot(summaries2000[,1], summaries2000[,2], type="p", pch=19, cex=0.5, xlim=c(0,m), ylim=c(0,1), xlab = "Median", ylab = expression("2/m "%*%" disp"[d["o,1"]]), xaxt="n", main="IOV vs. median") axis(side=1, at=c(0,3,5,8,11,14,17,20,22), labels=c("D","CC","CCC","B","BB","BBB","A","AA","AAA"), las=2) #abline(h=0.1, lty=2) #Median against asym: plot(summaries2000[,1], summaries2000[,3], type="p", pch=19, cex=0.5, xlim=c(0,m), ylim=c(0,1), xlab = "Median", ylab = expression("1/m "%*%" asym"[d["o,1"]]), xaxt="n", main="asym vs. median") axis(side=1, at=c(0,3,5,8,11,14,17,20,22), labels=c("D","CC","CCC","B","BB","BBB","A","AA","AAA"), las=2) #abline(h=0.8, lty=2) #Median against skew: plot(summaries2000[,1], summaries2000[,4], type="p", pch=19, cex=0.5, xlim=c(0,m), ylim=c(-1,1), xlab = "Median", ylab = expression("1/m "%*%" skew"[d["o,1"]]), xaxt="n", main="skew vs. median") axis(side=1, at=c(0,3,5,8,11,14,17,20,22), labels=c("D","CC","CCC","B","BB","BBB","A","AA","AAA"), las=2) #asym against IOV: plot(summaries2000[,2], summaries2000[,3], type="p", pch=19, cex=0.5, xlim=c(0,1), ylim=c(0,1), xlab = expression("2/m "%*%" disp"[d["o,1"]]), ylab = expression("1/m "%*%" asym"[d["o,1"]]), main="asym vs. IOV") abline(a=1, b=-1) #skew against IOV: plot(summaries2000[,2], summaries2000[,4], type="p", pch=19, cex=0.5, xlim=c(0,1), ylim=c(-1,1), xlab = expression("2/m "%*%" disp"[d["o,1"]]), ylab = expression("1/m "%*%" skew"[d["o,1"]]), main="skew vs. IOV") #skew against asym: plot(summaries2000[,3], summaries2000[,4], type="p", pch=19, cex=0.5, xlim=c(0,1), ylim=c(-1,1), xlab = expression("1/m "%*%" asym"[d["o,1"]]), ylab = expression("1/m "%*%" skew"[d["o,1"]]), main="skew vs. asym") summaries2000 # median IOV asym skew # Austria 22.0 0.04040404 0.94949495 -0.96969697 # Belgium 21.0 0.04094962 0.85747132 -0.87794613 # Bulgaria 13.0 0.17830309 0.08193431 -0.15656566 # Croatia 13.0 0.10867549 0.11190805 -0.16624579 # Cyprus 17.0 0.36515619 0.17309281 -0.31649832 # Czech Republic 17.0 0.12799679 0.50712955 -0.57112795 # Denmark 22.0 0.01028417 0.98938654 -0.99452862 # Estonia 17.0 0.13927079 0.50275518 -0.57239057 # Finland 22.0 0.03790996 0.95410899 -0.97306397 # France 22.0 0.07274910 0.91227865 -0.94865320 # Germany 22.0 0.00000000 1.00000000 -1.00000000 # Greece 16.0 0.50500764 0.04434975 -0.14351852 # Hungary 14.0 0.18527092 0.17167430 -0.26430976 # Ireland 21.0 0.26836264 0.63686245 -0.77104377 # Italy 18.0 0.25718216 0.43496111 -0.56355219 # Latvia 15.0 0.15504193 0.24023998 -0.31776094 # Lithuania 15.0 0.12882295 0.29964576 -0.36405724 # Luxembourg 22.0 0.00000000 1.00000000 -1.00000000 # Malta 17.0 0.07039141 0.46101641 -0.49621212 # Netherlands 22.0 0.01795735 0.98092031 -0.98989899 # Poland 15.0 0.04874361 0.38219385 -0.40656566 # Portugal 18.5 0.37003133 0.29520319 -0.48021886 # Romania 12.0 0.16590286 0.03197484 -0.04882155 # Slovakia 17.0 0.18842748 0.38053373 -0.47474747 # Slovenia 18.0 0.15503414 0.56768495 -0.64520202 # Spain 21.0 0.31737904 0.55848220 -0.71717172 # Sweden 22.0 0.03188911 0.96343255 -0.97937710 # United Kingdom 22.0 0.02917290 0.96942028 -0.98400673 kappas2000 # crit_l crit_u 1 2 3 4 5 6 7 8 9 10 # Austria -0.13798829 0.12872903 0.9860465 0.9719626 0.9577465 0.9433962 0.9289100 0.9142857 0.8995215 0.8846154 0.8695652 0.8543689 # Belgium -0.13798829 0.12872903 0.9864236 0.9727204 0.9588885 0.9449261 0.9308313 0.9166023 0.9022372 0.8877339 0.8730905 0.8583049 # Bulgaria -0.09174031 0.08248105 0.9633746 0.9264069 0.8890921 0.8514253 0.8182342 0.7847270 0.7508992 0.7167461 0.6822630 0.6474451 # Croatia -0.10437929 0.09512003 0.9779882 0.9557708 0.9333447 0.9107070 0.8878548 0.8647849 0.8414943 0.8179797 0.7942379 0.7702656 # Cyprus -0.10361362 0.09435436 0.9664623 0.9419181 0.9171434 0.8921350 0.8692493 0.8461457 0.8228210 0.7992720 0.7754955 0.7514881 # Czech Republic -0.11905265 0.10979339 0.9915272 0.9829753 0.9743430 0.9656293 0.9568330 0.9479529 0.9389879 0.9299366 0.9207980 0.9115705 # Denmark -0.13798829 0.12872903 0.9227191 0.8447160 0.7659805 0.6865022 0.6062705 0.5252747 0.4435039 0.3609467 0.2775920 0.1934279 # Estonia -0.10476227 0.09550301 0.9799846 0.9597821 0.9393899 0.9188053 0.8980256 0.8770480 0.8558697 0.8344877 0.8128992 0.7911010 # Finland -0.13798829 0.12872903 0.9619951 0.9236350 0.8849148 0.8458292 0.8063732 0.7665414 0.7263284 0.6857287 0.6447368 0.6033470 # France -0.12418062 0.11492136 0.9833168 0.9664777 0.9494805 0.9323229 0.9150027 0.8975175 0.8798650 0.8620428 0.8440484 0.8258793 # Germany NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN # Greece -0.11092186 0.10166260 0.9705634 0.9442164 0.9193124 0.8975699 0.8756214 0.8534638 0.8310941 0.8085094 0.7857064 0.7644298 # Hungary -0.10155433 0.09229507 0.9776002 0.9595769 0.9413844 0.9230202 0.9044820 0.8857672 0.8668733 0.8477977 0.8285379 0.8090910 # Ireland -0.10557680 0.09631754 0.9827267 0.9652920 0.9476936 0.9299292 0.9119963 0.8938927 0.8756159 0.8571633 0.8385324 0.8197206 # Italy -0.10171023 0.09245097 0.9861926 0.9722562 0.9581889 0.9439889 0.9296543 0.9151832 0.9005736 0.8858235 0.8709309 0.8558938 # Latvia -0.09604648 0.08678722 0.9700259 0.9397716 0.9092333 0.8784068 0.8472882 0.8158732 0.7841576 0.7521370 0.7198070 0.6871632 # Lithuania -0.10162165 0.09236239 0.9671468 0.9339866 0.9005150 0.8667276 0.8326200 0.7981875 0.7634256 0.7283294 0.6928941 0.6571148 # Luxembourg NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN # Malta -0.12152551 0.11226625 0.9824799 0.9647961 0.9469463 0.9289280 0.9107390 0.8923767 0.8738387 0.8551225 0.8362254 0.8171448 # Netherlands -0.13798829 0.12872903 0.9581395 0.9158879 0.8732394 0.8301887 0.7867299 0.7428571 0.6985646 0.6538462 0.6086957 0.5631068 # Poland -0.12943921 0.12017995 0.9571088 0.9138167 0.8701181 0.8260072 0.7991564 0.7720499 0.7446840 0.7170549 0.6891589 0.6609921 # Portugal -0.11258206 0.10332280 0.9879276 0.9757425 0.9634428 0.9510272 0.9384939 0.9258412 0.9130674 0.9001709 0.8871497 0.8740020 # Romania -0.09780955 0.08855029 0.9717757 0.9432877 0.9145322 0.8855054 0.8562035 0.8266225 0.7967584 0.7666072 0.7361646 0.7054265 # Slovakia -0.09952711 0.09026786 0.9765626 0.9529061 0.9290275 0.9049236 0.8805913 0.8560272 0.8312281 0.8061905 0.7809110 0.7553861 # Slovenia -0.10289082 0.09363156 0.9721961 0.9441324 0.9158052 0.8872108 0.8583453 0.8292049 0.7997856 0.7700835 0.7400944 0.7098141 # Spain -0.11014064 0.10088138 0.9816443 0.9631171 0.9444160 0.9255384 0.9064819 0.8872439 0.8678217 0.8482129 0.8284146 0.8084240 # Sweden -0.13798829 0.12872903 0.9794969 0.9588022 0.9379132 0.9168271 0.8955412 0.8740525 0.8523582 0.8304553 0.8083407 0.7860115 # United Kingdom -0.13798829 0.12872903 0.9471236 0.8937531 0.8398814 0.7855015 0.7306061 0.6751880 0.6192395 0.5627530 0.5057208 0.4481349