[关闭]
@fanxy 2020-05-17T19:13:24.000000Z 字数 11251 阅读 15564

第十三讲 极值理论、分位数估计与VaR

樊潇彦 复旦大学经济学院 金融数据


Ch13_data_code.rar54.9kB

  1. setwd("D:\\..\\Ch13")
  2. install.packages("sm","quantreg","evir")
  3. ## 调用
  4. library(sm)
  5. library(quantreg)
  6. library(evir)
  7. library(stats)
  8. library(fPortfolio)
  9. library(RQuantLib)
  10. library(qcc)
  11. library(rugarch)
  12. library(fGarch)
  13. library(zoo)
  14. library(tseries)
  15. library(forecast)
  16. library(timeSeries)
  17. library(tidyverse)
  18. library(readxl)
  19. library(ggplot2)

1. 风险测度

根据巴塞尔协议,金融风险被分为三类:市场风险、信用风险和操作风险。一个与基本金融理论一致的市场风险测度 应满足下面四个条件( 为随机变量,):

1. 次可加性:

2. 单调性:

3. 正齐性:

4. 变换不变性:

1.1 风险值(Value at Risk, VaR)

一个金融头寸在时刻 的价值记为 ,在接下来的 期的损失


假定随机变量 的累积分布函数为 ,我们把 定义为一个可能面临的巨大损失:

对于一元函数,VaR 就是损失分布的 分位数。相应地有:

  1. mn=0.01; sd=2; p=0.05; q=1-p; nu=5 # 参数设定
  2. set.seed(1)
  3. rn=rnorm(1000) # 模拟数据
  4. rt=rt(1000,nu) # 可以用 plot(density(rn)) 命令画密度线
  5. y = c(rn,rt)
  6. g = factor(rep(c("r_n","r_t"), each=1000)) # 用因子变量标记两组
  7. library(sm)
  8. sm.density.compare(y, g) # 合并做图,进行比较
  9. legend("topright", levels(g), fill=2+(0:nlevels(g)))
  10. title(main="正态分布和学生分布密度曲线")
  11. z=qnorm(q); t=qt(q,nu)
  12. VaR_n=mn+z*sd # (7-2)正态分布VaR
  13. VaR_t=mn+t*sd # (7-3)学生分布VaR
  14. data.frame(VaR_n, VaR_t)

1.2 期望损失(Expected Shortfall, ES)

定义 ES 为损失 时的期望值,也称为条件或尾部风险值(CVaR,TVaR)。

  1. fz=dnorm(z); ft=dt(t,nu)
  2. ES_n=mn+fz/p*sd # (7-6)正态分布ES
  3. ES_t=mn+ft/p*sd*(nu+t^2)/(nu-1) # (7-7)学生分布ES
  4. data.frame(ES_n,ES_t)

1.3 风险度量制()方法

定义第 期的损失率:


期建仓并持有 期的损失率和相应的风险值为:

如果 服从无漂移的 IGARCH(1,1) 过程:

则基于信息 的条件期望:

从而有:

因此损失率服从正态分布 ,相应有 VaR 计算的时间平方根准则(squqre root of time rule)

需要注意的是,当损失率不满足均值为零、方差均值为零的特殊IGARCH(1,1)的假设,上述准则就失效了。

  1. # P266:IBM股票
  2. da=read.table("d-ibm-0110.txt",header=T)
  3. head(da)
  4. ibm=log(da[,2]+1)
  5. source("RMfit.R")
  6. mm=RMfit(ibm)
  7. # 用rugarch包复制结果
  8. library(rugarch)
  9. igarch=ugarchspec(variance.model = list(model="iGARCH"),
  10. mean.model = list(armaOrder=c(0,0),include.mean=F), # 均值方程截距为0
  11. fixed.pars=list(omega=0)) # 方差方程截距为0
  12. igarch.fit=ugarchfit(spec=igarch, data=ibm)
  13. igarch.fcst = ugarchforecast(igarch.fit, n.ahead=1)
  14. ibm_sd=as.numeric(igarch.fcst@forecast$sigmaFor) # 预测sigma_T(1)
  15. names(igarch.fit@fit)
  16. c(alpha=1-as.numeric(igarch.fit@fit$coef[2]),
  17. sd=as.numeric(igarch.fit@fit$se.coef),
  18. ibm_sd=ibm_sd) # 回归结果
  19. ibm_mn=0; p=c(0.05,0.01,0.001); q=1-p
  20. z=qnorm(q)
  21. ibm_VaR_n=ibm_mn+z*ibm_sd # VaR
  22. fz=dnorm(z)
  23. ibm_ES_n=ibm_mn+fz/p*ibm_sd # ES
  24. data.frame(p, ibm_VaR_n, ibm_ES_n)
  25. # P267:汇率
  26. da1=read.table("d-useu0111.txt",header=T)
  27. head(da1)
  28. rt=diff(log(da1[,4]))
  29. m2=RMfit(rt)

2. VaR计算的计量经济学方法

2.1 基于ARIMA-GARCH模型参数估计

为损失率 建立ARIMA(p,q)-GARCH(m,n)模型:

  1. # P271:IBM股票
  2. xt=-ibm # 计算多头损失率
  3. library(fGarch)
  4. m1=garchFit(~garch(1,1),data=xt,trace=F)
  5. m1 # P270估计结果
  6. m1pre1=as.numeric(predict(m1,1)) # 提前一步预测
  7. source("RMeasure.R")
  8. m11=RMeasure(mu=m1pre1[1],sigma=m1pre1[2])
  9. m2=garchFit(~garch(1,1),data=xt,trace=F,cond.dist="std") # 学生分布
  10. m2 # P271估计结果
  11. m2pre1=as.numeric(predict(m2,1))
  12. m22=RMeasure(mu=m2pre1[1],sigma=m2pre1[2],cond.dist="std",
  13. df=as.numeric(m2@fit$coef[5])) # 与P271结果不符
  14. # 用rugarch包复制结果
  15. sgarch_n=ugarchspec(variance.model = list(model="sGARCH"),
  16. mean.model = list(armaOrder=c(0,0),include.mean=T),
  17. distribution.model = "norm") # 正态分布
  18. sgarch_n.fit=ugarchfit(spec=sgarch_n, data=xt)
  19. sgarch_n.fcst = ugarchforecast(sgarch_n.fit, n.ahead=1)
  20. xt_nsd=as.numeric(sgarch_n.fcst@forecast$sigmaFor)
  21. xt_nmn=as.numeric(sgarch_n.fit@fit$coef[1])
  22. p=c(0.05,0.01); q=1-p
  23. z=qnorm(q)
  24. xt_VaR_n=xt_nmn+z*xt_nsd
  25. fz=dnorm(z)
  26. xt_ES_n=xt_nmn+fz/p*xt_nsd
  27. data.frame(p, xt_VaR_n, xt_ES_n) # P270结果
  28. sgarch_t=ugarchspec(variance.model = list(model="sGARCH"),
  29. mean.model = list(armaOrder=c(0,0),include.mean=T),
  30. distribution.model = "std") # 学生分布
  31. sgarch_t.fit=ugarchfit(spec=sgarch_t, data=xt)
  32. sgarch_t.fcst = ugarchforecast(sgarch_t.fit, n.ahead=1)
  33. xt_tsd=as.numeric(sgarch_t.fcst@forecast$sigmaFor)
  34. xt_tmn=as.numeric(sgarch_t.fit@fit$coef[1])
  35. nu=as.numeric(sgarch_t.fit@fit$coef[5])
  36. t=qt(q,nu)
  37. xt_VaR_t=xt_tmn+ t*xt_tsd
  38. fz=dnorm(z); ft=dt(t,nu)
  39. xt_ES_t=xt_tmn+ft/p*xt_tsd*(nu+t^2)/(nu-1)
  40. data.frame(p, xt_VaR_t, xt_ES_t) # P271结果
  1. # P274
  2. M1=predict(m1,15) # 正态分布
  3. pmean=sum(M1$meanForecast)
  4. pvar=sum((M1$meanError)^2)
  5. pstd=sqrt(pvar)
  6. M11=RMeasure(pmean,pstd)
  7. # P275
  8. vol=volatility(m2) # 学生分布
  9. a1=c(1.922*10^(-6),0.06448); b1=0.9286; mu=-4.113*10^(-4)
  10. ini=c(ibm[2515],vol[2515])
  11. set.seed(1) # 如果设不同的随机种子,结果与教材差别很大
  12. source("SimGarcht.R") # 模拟数据
  13. mm=SimGarcht(h=15,mu=mu,alpha=a1,b1=b1,df=5.751,ini=ini,nter=30000)
  14. rr=mm$rtn
  15. mean(rr)
  16. q=quantile(rr,c(0.95,0.99)) # VaR
  17. idx=c(1:30000)[rr>q[1]]
  18. mean(rr[idx]) # ES_0.95
  19. idx=c(1:30000)[rr>q[2]]
  20. mean(rr[idx]) # ES_0.99

2.2 基于分位数回归

  1. # P277:样本分位数
  2. quantile(xt,0.95)
  3. sxt=sort(xt)
  4. 0.95*2515
  5. es=sum(sxt[2390:2515])/(2515-2389)
  6. es
  1. # P279:分位数回归
  2. dd=read.table("d-ibm-rq.txt",header=T)
  3. head(dd)
  4. dd[,3]=dd[,3]/100
  5. library(quantreg)
  6. mm=rq(nibm~vol+vix,tau=0.95,data=dd) # q=0.95
  7. summary(mm)
  8. names(mm)
  9. fit=mm$fitted.values
  10. tdx=c(2:2515)/252+2001
  11. plot(tdx,dd$nibm,type='l',xlab='year',ylab='neg-log-rtn') # 图7-7
  12. lines(tdx,fit,col='red')
  13. mm=rq(xt~vol+vix,tau=0.99,data=dd) # q=0.99,与P280结果不同
  14. summary(mm)

3. 极值理论

3.1 基本概念

极值理论(Extreme Value Theory, EVT)讨论 时服从独立同分布的随机变量的极大值 的统计性质。
根据 Fisher–Tippett–Gnedenko 定理,当 时,如果存在均值和标准差数列 ,使正规化的极大值随机变量 有渐进分布:
则称 服从广义极值分布(Generalized Extreme Value, GEV),相应的累积分布函数为:


其中 为位置参数(location parameter); 为尺度参数 (scale parameter); 为形状参数(shape parameter),控制极限分布的尾部行为,称 为尾部指数(tail index)。相应的概率密度函数为:

按照形状参数的取值范围,GEV又可分为三种类型:
1. 类型I:Gumbel 族,

2. 类型II:Frechet 族,

3. 类型III:Weibull 族,

注:本图来自Wiki,Tsay(2015)图7-8有误。

3.2 估计

极值分布的三个重要参数:形状参数 (shape),位置参数 (location) 和尺度参数 (scale)。

  1. 分块经验估计
    将样本至少分为三块(,每块平均有 个样本,),分别估计三个参数。evir包中的gev命令就用这一方法。
  2. 最大似然法
    根据密度函数构造似然函数,进而估计参数。这一估计是无偏、渐近正态的,并在适当假设下是渐近有效的。
  3. 非参估计
    Hill(1975)和Pickands(1975)提出以下估计量(Q为正整数):

    Hill 估计仅对Frechet族适用,但当它适用时,比Pickands估计更有效。
  1. # P285表7-1第一列
  2. source("Hill.R") # compile R script
  3. Hill(ibm,110); Hill(xt,110)
  4. # P286表7-2,子区间长度为21个交易日
  5. library(evir)
  6. gev(ibm,block=21)$par.ests
  7. gev(xt,block=21)$par.ests
  8. # P287图7-11
  9. par(mfcol=c(1,2))
  10. m1=gev(xt,block=21)
  11. plot(m1)

3.3 应用

  1. # P291:收益率水平
  2. m1=gev(xt,block=21) # n=21
  3. rl.21.12=rlevel.gev(m1,k.block=12) # g=12
  4. rl.21.12 # L=5.43% in (4.65%,6.76%)
  5. # P293:图7-12
  6. par(mfcol=c(2,1))
  7. qplot(xt,threshold=0.01,pch='*',cex=0.8,main="Loss variable of daily IBM log returns")
  8. meplot(ibm)
  9. title(main="Daily IBM log returns")
  10. # P294:表7-3
  11. m1=pot(xt,threshold=0.01) # pot命令
  12. m1$par.ests
  13. m2=pot(xt,threshold=0.012)
  14. m2$par.ests
  15. m3=pot(xt,threshold=0.008)
  16. m3$par.ests
  17. riskmeasures(m1,0.95) # VaR和ES
  18. riskmeasures(m2,0.95)
  19. riskmeasures(m3,0.95)
  20. # P296
  21. m1gpd=gpd(xt,threshold=0.01) # gpd命令
  22. m1gpd
  23. names(m1gpd)
  24. par(mfcol=c(2,2))
  25. plot(m1gpd) # 图7-13
  26. riskmeasures(m1gpd,0.95) # VaR和ES
  1. m1=exindex(xt,10) # 图7-10
  2. m1[which(m1[,2]==21),] # 子区间为21天,theta=0.725
  3. 1.966-(1.029/.251)*(1-(-21*.72*log(.99))^(-.251)) # VaR
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注