【FinE】正态分布和t分布下的CVaR

本文深入探讨了CVaR(条件风险价值)和VaR(风险价值)的概念,对比了正态分布和t分布下的计算方法,并通过IBM股票数据进行了实证分析,展示了t分布对厚尾数据的优越拟合能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CVaR and VaR

CVaR(Conditional Value-at-Risk)也被称为Expected Shortfall(ES) 或者 Expected Tail Loss(ETL),可以解释超过给定VaR值的期望损失,在很多风险分析中,CVaR是更具有解释力,当设置了VaR阈值后,CVaR说明了在之后的 h h h天交易中的期望损失风险(即资产价值低于预先设置的VaR值). 显然VaR和资产日回报率的分布有关.

当资产回报率的尾部较厚,使用整态分布刻画是不合适的,考虑使用t分布对资产回报率分布进行描述.

Model

normal distribution

X X X表示 h h h日的回报率,则
V a R h , α = − x h , α VaR_{h, \alpha}=-x_{h, \alpha} VaRh,α=xh,α
其中, P ( X < x h , α ) = α P(X<x_{h, \alpha})=\alpha P(X<xh,α)=α.
CVaR使用条件期望的形式表达
C V a R h , α ( X ) = − E ( X ∣ X < x h , α ) = − α − 1 ∫ − ∞ x h , α = x f ( x ) d x CVaR_{h, \alpha}(X)=-\mathbb{E}(X\mid X<x_{h, \alpha})=-\alpha^{-1}\int_{-\infty}^{x_{h, \alpha}}=xf(x)dx CVaRh,α(X)=E(XX<xh,α)=α1xh,α=xf(x)dx
对于任意连续的概率密度函数 f ( x ) f(x) f(x),需要计算 x ∼ 100 ( 1 − α ) % h x\sim 100(1-\alpha)\%h x100(1α)%hVaR x f ( x ) xf(x) xf(x)积分.
考虑在 X ∼ N ( μ h , σ h 2 ) X\sim N(\mu_h, \sigma_h^2) XN(μh,σh2)的情况下的CVaR
C V a R h , α ( X ) = α − 1 φ ( Φ − 1 ( α ) ) σ h − μ h CVaR_{h, \alpha}(X)=\alpha^{-1}\varphi(\Phi^{-1}(\alpha))\sigma_h-\mu_h CVaRh,α(X)=α1φ(Φ1(α))σhμh
其中 φ ( z ) \varphi(z) φ(z)表示标准正态分布的pdf, Φ ( α ) − 1 \Phi(\alpha)^{-1} Φ(α)1 α \alpha α分位数.
案例:计算 h = 5 h=5 h=5CVaR,股价年化回报率符合 σ = 41 % , μ = 0 \sigma=41\%, \mu=0 σ=41%,μ=0的正态分布,设置一年的交易日为252天计算出
σ h = σ h / 252 = 0.41 5 / 252 = 0.05798 \sigma_h=\sigma\sqrt{h/252}=0.41\sqrt{5/252}=0.05798 σh=σh/252 =0.415/252 =0.05798
python计算gaussian分布VaRCVaR代码如下

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm
from math import sqrt

def demo_1():
    h, D=5, 252
    mu, sig = 0, 0.41
    muh, sigh=mu*(h/D), sig*sqrt(h/D)
    alpha=0.01
    lev=100*(1-alpha)

    CVaRh=alpha**(-1)*norm.pdf(norm.ppf(alpha))*sigh-muh
    VaRh=norm.ppf(1-alpha)*sigh-muh

    print('{}% {} day Normal VaR= {:.2f}%'.format(lev, h, VaRh*100))
    print('{}% {} day Normal CVaR= {:.2f}%'.format(lev, h, CVaRh*100))

demo_1()

student t distribution

考虑更适合肥尾的t分布进行建模,标准t分布的pdf函数为
f ν ( x ) = ( ( ν − 2 ) π ) − 1 / 2 Γ ( v 2 ) − 1 Γ ( ν + 1 2 ) ⏟ A ( 1 + ( ν − 2 ) − 1 ⏟ a x 2 ) − ( ν + 1 ) / 2 ⏟ b f_\nu(x)=\underbrace{((\nu-2)\pi)^{-1/2}\Gamma(\frac{v}{2})^{-1}\Gamma(\frac{\nu+1}{2})}_{A}(1+\underbrace{(\nu-2)^{-1}}_{a}x^2)^{\underbrace{-(\nu+1)/2}_{b}} fν(x)=A ((ν2)π)1/2Γ(2v)1Γ(2ν+1)(1+a (ν2)1x2)b (ν+1)/2
其中 Γ \Gamma Γ表示gamma函数, ν \nu ν表示自由度,方程一般形式为
f ν ( x ) = A ( 1 + a x 2 ) b f_\nu(x)=A(1+ax^2)^b fν(x)=A(1+ax2)b
代入到CVaR定义中得到
C V a R α , ν = − α − 1 ∫ − ∞ x α , ν x f ν ( x ) d x = − α − 1 ∫ − ∞ x α , ν x A ( 1 + a x 2 ) b d x = − A α ∫ − ∞ x α , ν x ( 1 + a x 2 ⏟ y ) b d x (1) \begin{aligned} CVaR_{\alpha, \nu}&=-\alpha^{-1}\int_{-\infty}^{x_{\alpha, \nu}}xf_\nu(x)dx\\ &=-\alpha^{-1}\int_{-\infty}^{x_{\alpha, \nu}}xA(1+ax^2)^bdx\\ &=-\frac{A}{\alpha}\int_{-\infty}^{x_{\alpha, \nu}}x(\underbrace{1+ax^2}_y)^bdx \end{aligned}\tag{1} CVaRα,ν=α1xα,νxfν(x)dx=α1xα,νxA(1+ax2)bdx=αAxα,νx(y 1+ax2)bdx(1)
y = 1 + a x 2 y=1+ax^2 y=1+ax2进行变换, d y = 2 a x d x , B = 1 + ( ν − 2 ) − 1 x α , ν 2 dy=2axdx,B=1+(\nu-2)^{-1}x^2_{\alpha, \nu} dy=2axdxB=1+(ν2)1xα,ν2,方程 ( 1 ) (1) (1)变换得到
( 1 ) = − A α ∫ − ∞ B x ( 1 + a x 2 ) b 2 a x d y = − A 2 a α ∫ ∞ B y b d y = − A 2 a α B b + 1 b + 1 \begin{aligned} (1)&=-\frac{A}{\alpha}\int_{-\infty}^B\frac{x(1+ax^2)^b}{2ax}dy\\ &=-\frac{A}{2a\alpha}\int_{\infty}^{B}y^bdy\\ &=-\frac{A}{2a\alpha}\frac{B^{b+1}}{b+1} \end{aligned} (1)=αAB2axx(1+ax2)bdy=2aαABybdy=2aαAb+1Bb+1
由于 b + 1 = ( 1 − ν ) / 2 b+1=(1-\nu)/2 b+1=(1ν)/2代入得到 ( 1 ) (1) (1)值为
− A ( ν − 2 ) − 1 α 2 B ( 1 − ν ) / 2 1 − ν -\frac{A}{(\nu-2)^{-1}\alpha}\frac{2B^{(1-\nu)/2}}{1-\nu} (ν2)1αA1ν2B(1ν)/2
根据 f ν ( x ) f_\nu(x) fν(x)的表达式可以知道
f ν ( x ) = A B b ⇒ A = f ν ( x ) B − b = f ν ( x ) B ( 1 + ν ) / 2 f_\nu(x)=AB^b\Rightarrow A=f_\nu(x)B^{-b}=f_\nu(x)B^{(1+\nu)/2} fν(x)=ABbA=fν(x)Bb=fν(x)B(1+ν)/2
代入方程 ( 1 ) (1) (1)得到CVaR值为
( 1 ) = − α − 1 f ν ( x ) B ( 1 + ν ) / 2 2 ( ν − 2 ) − 1 2 B ( 1 − ν ) / 2 1 − ν = − α − 1 f ν ( x ) ( ν − 2 ) ( 1 − ν ) − 1 B = − α − 1 ( ν − 2 ) ( 1 − ν ) − 1 ( 1 + ( ν − 2 ) − 1 x α , ν 2 ) f ν ( x α , ν ) = − α − 1 ( 1 − ν ) − 1 [ ν − 2 + x α , ν 2 ] f ν ( x α , ν ) \begin{aligned} (1)&=-\alpha^{-1}\frac{f_\nu(x)B^{(1+\nu)/2}}{2(\nu-2)^{-1}}\frac{2B^{(1-\nu)/2}}{1-\nu}\\ &=-\alpha^{-1}f_\nu(x)(\nu-2)(1-\nu)^{-1}B\\ &=-\alpha^{-1}(\nu-2)(1-\nu)^{-1}(1+(\nu-2)^{-1}x^2_{\alpha, \nu})f_\nu(x_{\alpha, \nu})\\ &=-\alpha^{-1}(1-\nu)^{-1}[\nu-2+x^2_{\alpha, \nu}]f_\nu(x_{\alpha, \nu}) \end{aligned} (1)=α12(ν2)1fν(x)B(1+ν)/21ν2B(1ν)/2=α1fν(x)(ν2)(1ν)1B=α1(ν2)(1ν)1(1+(ν2)1xα,ν2)fν(xα,ν)=α1(1ν)1[ν2+xα,ν2]fν(xα,ν)
所以, h h h天,t分布下CVaR值为
C V a R h , α , ν ( X ) = − α − 1 ( 1 − ν ) − 1 [ ν − 2 + x α , ν 2 ] f ν ( x α , ν ) σ h − μ h CVaR_{h, \alpha, \nu}(X)=-\alpha^{-1}(1-\nu)^{-1}[\nu-2+x_{\alpha, \nu}^2]f_\nu(x_{\alpha, \nu})\sigma_h-\mu_h CVaRh,α,ν(X)=α1(1ν)1[ν2+xα,ν2]fν(xα,ν)σhμh
案例计算自由度为 6 6 6的t分布的VaRCVaR
python计算t分布下VaRCVaR代码如下

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm, t
from math import sqrt

def demo_2():
    h, D = 10, 252
    mu, sig=0, 0.41
    muh, sigh=mu*(h/D), sig*sqrt(h/D)
    alpha=0.01
    lev=100*(1-alpha)
    nu=6 # 设置自由度
    xanu=t.ppf(alpha, nu)
    CVaRh=-1/alpha*(1-nu)**(-1)*(nu-2+xanu**2)*t.pdf(xanu, nu)*sigh-muh
    VaRh=sqrt(h/D*(nu-2)/nu)*t.ppf(1-alpha, nu)*sig-mu
    
    print('{}% {} day t VaR= {:.2f}%'.format(lev, h, VaRh*100))
    print('{}% {} day t CVaR= {:.2f}%'.format(lev, h, CVaRh*100))

demo_2()

可以发现,随着自由度的上升,t分布的VaRCVaR逐渐收敛到gaussian分布的VaRCVaR

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm, t
from math import sqrt


def demo_3():
    h, D = 10, 252
    mu, sig=0, 0.41
    muh, sigh=mu*(h/D), sig*sqrt(h/D)
    alpha=0.01
    lev=100*(1-alpha)

    data=[]
    for nu in range(5, 101):
        xanu=t.ppf(alpha, nu)
        CVaRt=-1/alpha*(1-nu)**(-1)*(nu-2+xanu**2)*t.pdf(xanu, nu)*sigh-muh
        VaRt=sqrt(h/D*(nu-2)/nu)*t.ppf(1-alpha, nu)*sig-muh
        data.append([nu, VaRt, CVaRt])

    CVaRn=alpha**(-1)*norm.pdf(norm.ppf(alpha))*sigh-muh
    VaRn=norm.ppf(1-alpha)*sigh-muh

    data=np.array(data)

    fig, ax=plt.subplots(figsize=(8, 6))
    plt.plot(data[:, 0], data[:, 1]*100, 'b-', label='VaRt')
    plt.plot(np.arange(5, 100), VaRn*np.ones(95)*100, 'b:', label='VaRn')
    plt.plot(data[:, 0], data[:, 2]*100, 'r-', label='CVaRt')
    plt.plot(np.arange(5, 100), CVaRn*np.ones(95)*100, 'r:', label='CVaRn')

    plt.xlabel('student t. d.o.f')
    plt.ylabel('%')
    plt.legend()
    plt.show()

    
demo_3()

cvar

Case Study

使用IBM数据进行实证分析, 使用gaussian分布和t分布拟合IBM日回报收益率得到拟合图像如下
fit
可以发现,t分布更适合拟合这种存在高噪声的尖峰厚尾的数据,不同分布计算的CVaR和VaR值如下

99.0% 1 day gaussian VaR= 2.81%
99.0% 1 day gaussian CVaR= 3.22%
99.0% 1 day student t VaR= 2.22%
99.0% 1 day student t CVaR= 3.91%

ibmcvar
案例python代码

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm, t, skew, kurtosis, kurtosistest
from math import sqrt
import pandas_datareader.data as web
import pickle

# Fetching Yahoo Finance for IBM stock data
def data_fetch():
    data = web.DataReader('IBM', data_source='yahoo', start='2010-12-31', end='2015-12-31')['Adj Close']
    adj_close=np.array(data.values)
    ret=adj_close[1:]/adj_close[:-1]-1
    file=open('ibm_ret', 'wb')
    pickle.dump(ret, file)

with open('ibm_ret', 'rb') as file:
    ret=pickle.load(file)

dx=0.0001
x=np.arange(-0.1, 0.1, dx)

# gaussian fit
mu_norm, sig_norm=norm.fit(ret)
pdf_norm=norm.pdf(x, mu_norm, sig_norm)

# student t fit
nu, mu_t, sig_t=t.fit(ret)
nu=np.round(nu)
pdf_t=t.pdf(x, nu, mu_t, sig_t)

# VaR and CVaR
h=1
alpha=0.01
lev=100*(1-alpha)
xanu=t.ppf(alpha, nu)

CVaRn=alpha**(-1)*norm.pdf(norm.ppf(alpha))*sig_norm-mu_norm
VaRn=norm.ppf(1-alpha)*sig_norm-mu_norm
CVaRt=-1/alpha*(1-nu)**(-1)*(nu-2+xanu**2)*t.pdf(xanu, nu)*sig_t-h*mu_t
VaRt=sqrt((nu-2)/nu)*t.ppf(1-alpha, nu)*sig_t-h*mu_t

print('{}% {} day gaussian VaR= {:.2f}%'.format(lev, h, VaRn*100))
print('{}% {} day gaussian CVaR= {:.2f}%'.format(lev, h, CVaRn*100))
print('{}% {} day student t VaR= {:.2f}%'.format(lev, h, VaRt*100))
print('{}% {} day student t CVaR= {:.2f}%'.format(lev, h, CVaRt*100))

plt.figure(figsize=(12, 8))
grey=0.75, 0.75, 0.75
plt.hist(ret, bins=50, density=True, color=grey, edgecolor='none')
plt.axis('tight')
plt.plot(x, pdf_norm, 'b-.', label='Guassian Fit')
plt.plot(x, pdf_t, 'g-.', label='Student t Fit')
plt.xlim([-0.2, 0.1])
plt.ylim([0, 50])
plt.legend(loc='best')
plt.xlabel('IBM daily return')
plt.ylabel('ret. distr.')

# plt.savefig('ibm_fit')
# inset local
sub=plt.axes([0.22, 0.35, 0.3, 0.4])
plt.hist(ret, bins=50, density=True, color=grey, edgecolor='none')
plt.plot(x, pdf_norm, 'b')
plt.plot(x, pdf_t, 'g')
plt.plot([-CVaRt, -CVaRt], [0, 3], 'g:')
plt.plot([-CVaRn, -CVaRn], [0, 4], 'b:')
plt.text(-CVaRt-0.015, 3.1, 'Stu. t', color='g')
plt.text(-CVaRn-0.015, 4.1, 'Gaussian CVaR', color='b')
plt.xlim([-0.09, -0.02])
plt.ylim([0, 5])

# plt.savefig('ibmcvar')
plt.show()

从数据和图像可以看出,Gaussian拟合计算的CVaR值存在低估风险的倾向.

Reference

CVaR Quant at risk

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Quant0xff

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值