(四十六)Expected Shortfall & VaR back testing

Expected Shortfall

  又叫条件VaR,定义为VaR后所有极端值的算术平均,即当投资组合的损失超过VaR阈值时所遭受的平均损失程度。由于ES在VaR的基础上进一步考虑了出现极端情况时的平均损失程度,因此可以更为完整地衡量一个投资组合的极端损失风险。仍然以(四十三)中的案例为例,在非参数法的基础上计算持有期分别为1天和10天、置信水平为99%情况下的ES:

import numpy as np
import pandas as pd
data=pd.read_excel('C:/Users/Desktop/投资组合配置的资产情况.xlsx',index_col=0)
R=np.log(data/data.shift(1)).dropna()
w=np.array([0.15,0.2,0.5,0.05,0.1])
Rmean=R.mean();Rcov=R.cov()
Rp=np.sum(R.mean()*w)#miu
volp=np.sqrt(w@Rcov@w.T)#sigma
rp=pd.Series((1e8*R)@w,index=R.index)#投资组合日收益额
rp
Out[1]: 
日期
2015-01-06   -821493.852971
2015-01-07   -571227.581954
2015-01-08   -566389.437960
2015-01-09   -232246.072524
2015-01-12   -540918.613270
     
2018-12-24   -386367.171344
2018-12-25     45729.829296
2018-12-26    471615.398346
2018-12-27    283725.390678
2018-12-28    923876.469087
Length: 974, dtype: float64
def ES_daily(a,x):
    VaR=np.percentile(a,(1-x)*100)
    ES=a[a<=VaR].mean()
    return abs(ES)
print('99%置信水平下1天的ES为{:.2f},10天的ES为{:.2f}'.format(\
ES_daily(rp,0.99),ES_daily(rp,0.99)*np.sqrt(10)))
99%置信水平下1天的ES为2885159.96,10天的ES为9123676.88

  可以发现同一置信水平下ES要大于VaR,同时ES具有满足次可加性、动态ES比动态VaR更平滑等优良性质,可以优先使用ES指标对基金进行筛选,或者对投资组合进行极端风险测度。

VaR back testing

  VaR back testing是指将通过模型得到的VaR估算结果与实际发生的损益进行比较,以检验模型的准确性。比如计算得到持有期1天、置信水平95%的风险价值是1000万,假如观测的交易日天数是1000,如果交易日的损失金额超出1000万元的天数是控制在50天左右(大约占总天数的5%),可以认为计算风险价值的模型是合理的;相反模型可能就不合理,可以通过假设检验或置信区间法来进行。仍然以上述案例为例,验证该投资组合2015~2018年每年的持有期为1天、置信水平为95%情况下的normal VaR准确性。

def VaR_norm(miu,sigma,x,P,n):#n参数为持有期,x为置信水平
	import scipy.stats as st
	z=abs(st.norm.ppf(q=1-x))#标准正态分布中1-x的概率对应的分位点
	return -(miu-z*sigma)*P*np.sqrt(n)
print('95%置信水平下1天的normal VaR为{:.2f}'.format(VaR_norm(Rp,volp,0.95,1e8,1)))
95%置信水平下1天的normal VaR为1030355.12

  接下来我们就要找出每一年exceptions的个数(小于-VaR的天数),然后用置信区间(μ-Zσ,μ+Zσ)(根据保守性原则一般用单侧(0,μ+Zσ))或假设检验统计量Z = (x-μ) / √Tp(1-p)来对VaR进行回测,其中μ为exceptions的平均个数,σ为其标准差,p为exceptions出现的概率(即5%),T为数据长度。
在这里插入图片描述

r2015=rp['2015-01-01':'2015-12-31']
r2016=rp['2016-01-01':'2016-12-31']
r2017=rp['2017-01-01':'2017-12-31']
r2018=rp['2018-01-01':'2018-12-31']
z=abs(st.norm.ppf(q=0.05))#1.645
VaR_95=VaR_norm(Rp,volp,0.95,1e8,1)
#找出每年小于VaR的极端值天数
ex2015=len(r2015[r2015<-VaR_95])
ex2016=len(r2016[r2016<-VaR_95])
ex2017=len(r2017[r2017<-VaR_95])
ex2018=len(r2018[r2018<-VaR_95])
print(ex2015,ex2016,ex2017,ex2018)
22 9 1 6#每年的x值

							#置信区间法
miu2015=len(r2015)*0.05;sigma2015=np.sqrt(len(r2015)*0.05*0.95)
print('2015年的置信区间为(0,{:.2f})'.format(miu2015+z*sigma2015))
2015年的置信区间为(0,17.74)
#可见22不在置信区间范围内,因此2015年用此VaR模型是不合适的
miu2016=len(r2016)*0.05;sigma2016=np.sqrt(len(r2016)*0.05*0.95)
print('2016年的置信区间为(0,{:.2f})'.format(miu2016+z*sigma2016))
2016年的置信区间为(0,17.80)
#9在置信区间范围内,因此2016年用此VaR模型可行,同理2017和2018年也可行
							#假设检验法
Z2015=(ex2015-miu2015)/sigma2015
Z2016=(ex2016-miu2016)/sigma2016
Z2017=(ex2017-miu2017)/sigma2017
Z2018=(ex2018-miu2018)/sigma2018
print(round(Z2015,2),round(Z2016,2),round(Z2017,2),round(Z2018,2))
2.9 -0.94 -3.29 -1.81
#对于单侧检验,只要统计量小于临界值z=1.645那么就不能拒绝“VaR模型正确”的原假设
#可见该VaR模型适合于后三年

  由于是单侧检验,以上VaR的回测过程过于保守,可能导致VaR值设置过大,降低了资金使用效率。如果用双侧检验那么就只有2016年的exceptions满足回测条件(置信区间约为(7,18)),即该VaR模型在2016年是最适用的,放在2017年和2018年则有点保守了,不适用于2015年。

  • 5
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值