概述
- 第10章 推断统计学
- 10.4 风险测度
- 10.4.1 风险价值
- 10.4.2 信用价值调整
- 10.4 风险测度
第10章 推断统计学
Python金融大数据分析——第10章 推断统计学 笔记1
Python金融大数据分析——第10章 推断统计学 笔记2
Python金融大数据分析——第10章 推断统计学 笔记3
10.4 风险测度
10.4.1 风险价值
风险价值(VaR)是最广泛使用的风险测度之一, 也是饱受争议的测度之一。从业人员喜欢其直观性. 但是许多人对其有限的尾部风险捕捉能力进行广泛的讨论和批评——主要是在理论依据上。从字面上讲, VaR 是一个以货币单位(如 美元、欧元、日元)表示的数字, 表示在给定时间周期中不超过某种置信度(概率)的损失(或者一个投资组合、股票头寸等)。
考虑一个当日价值为100万美元的股票头寸, 在30天( 1个月)内、 置信度为99%的情况下 VaR 为 5 万美元。 这个 VaR 数字说明, 30天内损失不超过 5 万美元的概率为99% ( 100 个案例中有 99 个)。但是, 它并不说明一旦损失超过 5万美元, 损失的规模会达到什么程度——也就是如果最大损失为10万或者50万美元时, 这种特定的“高于 VaR 的损失” 概率有多大。它所说明的只是,发生 5万美元或者更大损失的概率为 1%。我们再次假定使 Black-Scholes-Merton 设置,考虑如下的参数化和未来日期 T=30/365(即假定 30 天的一段时期)指数水平的模拟:
import numpy as np
import numpy.random as random
import matplotlib.pyplot as plt
S0 = 100
r = 0.05
sigma = 0.25
T = 30 / 365.
I = 10000
ST = S0 * np.exp((r - 0.5 * sigma ** 2) * T + sigma * np.sqrt(T) * random.standard_normal(I))
# 为了估算VaR数字,需要模拟的绝对利润和相对于近日持仓价值的亏损,并加以排序,即从最严重的亏损到最大的利润
R_gbm = np.sort(ST - S0)
plt.hist(R_gbm, bins=50)
plt.xlabel('absolute return')
plt.ylabel('frequency')
plt.grid(True)
几何布朗运动的绝对收益( 30 日)
import scipy.stats as scs
percs = [0.01, 0.1, 1., 2.5, 5., 10.]
var = scs.scoreatpercentile(R_gbm, percs)
print("%16s %16s" % ('Confidence Level', 'Value-at-Risk'))
print(33 * '-')
for pair in zip(percs, var):
print("%16.2f %16.3f" % (100 - pair[0], -pair[1]))
# Confidence Level
Value-at-Risk
# ---------------------------------
#
99.99
22.079
#
99.90
19.911
#
99.00
15.439
#
97.50
12.929
#
95.00
11.129
#
90.00
8.718
在列表对象 percs 中, 0.1 转换为置信度 100%在1%=99.9% 。在本例中, 置信度为 99.9%的 30 日 VaR 为 22.1 货币单位,而89%置信度下为 8.7 个货币单位。
# Meron的跳跃扩散 动态模拟
lamb = 0.75
mu = -0.6
delta = 0.25
M = 50
dt = 30. / 365 / M
rj = lamb * (np.exp(mu + 0.5 * delta ** 2) - 1)
S = np.zeros((M + 1, I))
S[0] = S0
# 为了模拟跳跃扩散,需要生成3组(独立)随机数:
sn1 = random.standard_normal((M + 1, I))
sn2 = random.standard_normal((M + 1, I))
poi = random.poisson(lamb * dt, (M + 1, I))
for t in range(1, M + 1, 1):
S[t] = S[t - 1] * (np.exp((r - rj - 0.5 * sigma ** 2) * dt
+ sigma * np.sqrt(dt) * sn1[t])
+ (np.exp(mu + delta * sn2[t]) - 1)
* poi[t])
S[t] = np.maximum(S[t], 0)
R_jd = np.sort(S[-1] - S0)
plt.hist(R_jd, bins=50)
plt.xlabel('value')
plt.ylabel('frequency')
plt.grid(True)
跳跃扩散的绝对收益(30日)
percs = [0.01, 0.1, 1., 2.5, 5., 10.]
var = scs.scoreatpercentile(R_jd, percs)
print("%16s %16s" % ('Confidence Level', 'Value-at-Risk'))
print(33 * '-')
for pair in zip(percs, var):
print("%16.2f %16.3f" % (100 - pair[0], -pair[1]))
# Confidence Level
Value-at-Risk
# ---------------------------------
#
99.99
79.703
#
99.90
72.507
#
99.00
57.857
#
97.50
50.096
#
95.00
33.371
#
90.00
9.386
对于这种过程和参数化,置信度 90%的 30日VaR 相差很少,但是在 99.9%置信度下与几何布朗运动相比高出 3 倍多( 79.703对22.079 货币单位)。这说明标准 VaR 测度在捕捉金融市场经常遇到的尾部风险方面的问题。最后以图形方式展示两种情况的 VaR 测度以便比较。在典型置信度范围内的 VaR 测度表现完全不同:
# 几何布朗运动和跳跃扩散的风险价值
percs = list(np.arange(0.0, 10.1, 0.1))
gbm_var = scs.scoreatpercentile(R_gbm, percs)
jd_var = scs.scoreatpercentile(R_jd, percs)
plt.plot(percs, gbm_var, 'b', lw=1.5, label='GBM')
plt.plot(percs, jd_var, 'r', lw=1.5, label='JD')
plt.legend(loc=4)
plt.xlabel('100 - confidence level [%]')
plt.ylabel('value-at-risk')
plt.grid(True)
plt.ylim(ymax=0.0)
几何布朗运动和跳跃扩散的风险价值
10.4.2 信用价值调整
其他重要的风险测度是信用风险价值(CVaR)和从CVaR中派生而来的信用价值调整(CVA)。粗略地讲, CVaR 是对手方可能无法履行其义务所引发风险(例如, 对手方破产)的一个测度。在这种情况下, 有两个主要的假设:违约概率 和 (平均)损失水平。
举个具体的例子, 我们再次考虑Black-Scholes-Merton 的基准设置:
# Black-Scholes-Merton 的基准设置,参数:
S0 = 100.
r = 0.05
sigma = 0.2
T = 1.
I = 100000
ST = S0 * np.exp((r - 0.5 * sigma ** 2) * T + sigma * np.sqrt(T) * random.standard_normal(I))
# 固定(平均)损失水平
L = 0.5
# 对手方违约(每年)概率
p = 0.01
# 使用泊松分布, 违约的方案可以用如下代码生成, 考虑了违约只能发生-次的事实
D = random.poisson(p * T, I)
D = np.where(D > 1, 1, D)
# 如果没有违约,未来指数水平的风险中立价值应该等于资产当日现值(取决于数值误差造成的差异):
np.exp(-r * T) * 1 / I * np.sum(ST)
# 99.982104037870357
# 假定条件下CVaR的值
CVaR = np.exp(-r * T) * 1 / I * np.sum(L * D * ST)
CVaR
# 0.52398128347827266
# 经过信用风险调整之后的资产现值
S0_CVA = np.exp(-r * T) * 1 / I * np.sum((1 - L * D) * ST)
S0_CVA
# 99.458122754392079
# 这应该(大约)等于CVaR价值减去当前资产价值
S0_adj = S0 - CVaR
S0_adj
# 99.476018716521722
np.count_nonzero(L * D * ST)
# 1052
在这个特殊的模拟示例中,假定违约概率为1%、10万次模拟下,由于信用风险引起大约1000次亏损。
plt.hist(L * D * ST, bins=50)
plt.xlabel('loss')
plt.ylabel('frequency')
plt.grid(True)
plt.ylim(ymax=175)
由于风险中立预期违约引起的亏损(股票)
上图展示了由于违约引起亏损的完整频率分布。 当然, 在大部分情况下(10万例中的99 000例), 没有发现亏损。
现在考虑欧式看涨期权的情况:
K = 100
# 行权价100
hT = np.maximum(ST - K, 0)
C0 = np.exp(-r * T) * 1 / I * np.sum(hT)
C0
# 10.466594304488577
# 行权价100时的价值大约为10.5个货币单位
CVaR = np.exp(-r * T) * 1 / I * np.sum(L * D * hT)
CVaR
# 0.054095276121378301
# 在相同的违约概率和损失水平假设下, CVaR大约为5分
S0_CVA = np.exp(-r * T) * 1 / I * np.sum((1 - L * D) * hT)
S0_CVA
# 10.412499028367199
# 调整后的期权价值大约低了5分
np.count_nonzero(L * D * hT)
# number of losses
# 572
np.count_nonzero(D)
# number of defaults
# 1052
I - np.count_nonzero(hT)
# zero payoff
# 44079
# 和常规资产相比, 期权有不同的特性。
# 我们只看到略低于 500 次回违约引起的亏损。
# 但是仍然有大约1000次违约。
# 这一结果源于这样的事实:期权到期日时的收益为0的概率很大。
plt.hist(L * D * hT, bins=50)
plt.xlabel('loos')
plt.ylabel('frequency')
plt.grid(True)
plt.ylim(ymax=350)
由于风险中立预期违约引起的亏损(看涨期权)
^_^
最后
以上就是害羞哈密瓜为你收集整理的Python金融大数据分析——第10章 推断统计学 笔记3第10章 推断统计学的全部内容,希望文章能够帮你解决Python金融大数据分析——第10章 推断统计学 笔记3第10章 推断统计学所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复