VaR 风险价值: Stata 及 Python 实现

发布时间:2020-06-15 阅读 496

Stata 连享会   主页 || 视频 || 推文

温馨提示: 定期 清理浏览器缓存,可以获得最佳浏览体验。

课程详情 https://gitee.com/arlionn/Course   |   lianxh.cn

课程主页 https://gitee.com/arlionn/Course

作者: 田原 (北京交通大学)
E-mail: godfreytian@163.com


目录


1. VaR 介绍

1.1 VaR 方法提出的背景

传统的 ALM (Asset-Liability Management,资产负债管理) 过于依赖报表分析,缺乏时效性;利用方差及 β 系数来衡量风险又太过抽象,不直观,而且反映的只是市场 (或资产) 的波动幅度;而 CAPM (资本资产定价模型) 又无法揉合金融衍生品种。

在上述传统的几种方法都无法准确定义和度量金融风险时,G30 集团在研究衍生品种的基础上,于 1993 年发表了题为《衍生产品的实践和规则》的报告,提出了度量市场风险的指标 —— VaR (Value at Risk:风险价值/在险价值)。

该方法已成为目前金融界测量市场风险的主流方法。稍后由 J.P.Morgan 推出的用于计算 VaR 的 Risk Metrics 风险控制模型更是被众多金融机构广泛采用。目前国外一些大型金融机构已将其所持资产的 VaR 风险值作为其定期公布的会计报表的一项重要内容加以列示。

在现在的金融市场上,受经济全球化和金融一体化影响,金融创新品种日新月异,金融市场波动性和系统风险大为加剧,控制金融风险成为各类金融机构面临的一个主要任务。VaR 方法成为当前最为流行和实用的一个测量金融风险的方法。VaR 风险管理技术是指在正常的市场条件和给定的置信度内,用于评估和计量任何一种金融资产或证券投资组合在既定时期内所面临的市场风险大小和可能遭受的潜在最大价值损失。

1.2 VaR 的定义

VaR (Value at Risk) 按字面解释就是「在险价值」,其含义为:在市场正常波动下,某一金融资产或证券组合的最大可能损失

更为严谨的定义为:在一定概率水平 (置信度) 下,某一金融资产或证券组合价值在未来特定时期内的最大可能损失。

如下图,假设其为未来一天的 VaR 值,在 95% 的置信度下,VaR 值为 0.82%,可以解释为该金融资产或证券组合在未来一天内的损失超过 0.82% 的概率为 5%,或者有 95% 的把握判断该金融资产或证券组合在未来一天内的损失在 0.82% 以内。

VaR 是对风险的总括性评估,它考虑了金融资产对某种风险来源 (例如利率、汇率、商品价格、股票价格等基础性金融变量) 的敞口和市场逆向变化的可能性。VaR 模型加入了大量可能影响公司交易组合公允价值的因素,比如证券和商品价格、利率、外汇汇率、有关的波动率以及这些变量之间的相关值。VaR 模型一般考虑线性和非线性价格暴露头寸、利率风险及隐含的线性波动率风险暴露头寸。

借助该模型,对历史风险数据模拟运算,可求出在不同的置信度 (比如 99%) 下的 VaR 值。对于置信度为 99%、时间基准为一天的 VaR 值,该值被超过的概率为 1% 或在 100 个交易日内可能发生一次。例如,银行家信托公司 (Banker Trust) 在其 1994 年年报中披露,1994 年的每日 99%VAR 值平均为 3500 万美元,这表明该银行可以以 99% 的概率做出保证,1994 年每一特定时点上的投资组合在未来 24 小时内的平均损失不会超过 3500 万美元。通过这一 VaR 值与该银行 1994 年 6.15 亿美元的年利润和 47 亿美元的资本额相对照,则该银行的风险状况即可一目了然。

1.3 VaR 的公式表示

用公式表示为:P(ΔPΔtVaR)=α

字母含义如下:

  • P —— 资产价值损失小于可能损失上限的概率,即英文的Probability。

  • ΔP —— 某一金融资产在一定持有期 Δt 的价值损失额。

  • VaR —— 给定置信水平 α 下的在险价值,即可能的损失上限。

  • α —— 给定的置信水平

从统计的意义上讲,VaR 本身是个数字,是指面临「正常」的市场波动时「处于风险状态的价值」。即在给定的置信水平和一定的持有期限内,预期的最大损失量 (可以是绝对值,也可以是相对值) 。例如,某一投资公司持有的证券组合在未来 24 小时内,置信度为95%,在证券市场正常波动的情况下,VaR 值为 520 万元,其含义是指,该公司的证券组合在一天内 (24 小时) ,由于市场价格变化而带来的最大损失超过 520 万元的概率为 5%,平均 20 个交易日才可能出现一次这种情况。或者说有 95% 的把握判断该投资公司在下一个交易日内的损失在 520 万元以内。5% 的几率反映了金融资产管理者的风险厌恶程度,可根据不同的投资者对风险的偏好程度和承受能力来确定。

2. VaR 的计算

2.1 系数计算

由定义出发,要确定一个金融机构或资产组合的 VaR 值或建立 VaR 的模型,必须首先确定以下三个因素:一是持有期间的长短 (Δt);二是置信区间的大小 (α);三是观察期间 ()。

A. 持有期

持有期 Δt,即确定计算在哪一段时间内的持有资产的最大损失值,也就是明确风险管理者关心资产在一天内一周内还是一个月内的风险价值。持有期的选择应依据所持有资产的特点来确定比如对于一些流动性很强的交易头寸往往需以每日为周期计算风险收益和 VaR 值,如 G30 小组在 1993 年的衍生产品的实践和规则中就建议对场外 OTC 衍生工具以每日为周期计算其 VaR,而对一些期限较长的头寸如养老基金和其他投资基金则可以以每月为周期。从银行总体的风险管理看持有期长短的选择取决于资产组合调整的频度及进行相应头寸清算的可能速率。巴塞尔委员会在这方面采取了比较保守和稳健的姿态,要求银行以两周即 10 个营业日为持有期限。

B. 置信水平 α

一般来说对置信区间的选择在一定程度上反映了金融机构对风险的不同偏好。选择较大的置信水平意味着其对风险比较厌恶,希望能得到把握性较大的预测结果,希望模型对于极端事件的预测准确性较高。根据各自的风险偏好不同,选择的置信区间也各不相同。比如 J.P. Morgan 与美洲银行选择 95% ,花旗银行选择 95.4%,大通曼哈顿选择 97.5%,Bankers Trust 选择 99%。作为金融监管部门的巴塞尔委员会则要求采用 99% 的置信区间,这与其稳健的风格是一致的。

C. 观察期间

观察期间是对给定持有期限的回报的波动性和关联性考察的整体时间长度,是整个数据选取的时间范围,有时又称数据窗口 (Data Window) 。例如选择对某资产组合在未来 6 个月,或是 1 年的观察期间内,考察其每周回报率的波动性 (风险) 。这种选择要在历史数据的可能性和市场发生结构性变化的危险之间进行权衡。为克服商业循环等周期性变化的影响,历史数据越长越好,但是时间越长,收购兼并等市场结构性变化的可能性越大,历史数据因而越难以反映现实和未来的情况。巴塞尔银行监管委员会目前要求的观察期间为 1 年。

2.2 VaR 的度量方式

VaR 的度量主要有方差-协方差法 (Variance-Covariance Approach) 、历史模拟法 (Historical Simulation Method) 和蒙特卡罗模拟法 (Monte-Carlo Simulation) 三种方法。

M1. 方差-协方差法

该方法假定风险因素收益的变化服从特定的分布 (通常假定为正态分布),主要包括如下三个步骤:

  • S1: 通过历史数据分析和估计该风险因素收益分布的参数值,如方差、均值、相关系数等;
  • S2: 根据风险因素发生单位变化时,头寸的单位敏感性与置信水平来确定各个风险要素的 VaR 值;
  • S3: 根据各个风险要素之间的相关系数来确定整个组合的 VaR 值。

M2. 历史模拟法

该方法以历史可以在未来重复为假设前提,直接根据风险因素收益的历史数据来模拟风险因素收益的未来变化。在这种方法下,VaR 值取自于投资组合收益的历史分布,组合收益的历史分布又来自于组合中每一金融工具的「盯市价值」(Mark to Market value)。而这种盯市价值是风险因素收益的函数。具体来说,历史模拟法分为三个步骤:

  • S1: 为组合中的风险因素安排一个历史的市场变化序列;
  • S2: 计算每一历史市场变化的资产组合的收益变化;
  • S3: 推算出 VaR 值。

因此,风险因素的历史收益数据是该 VaR 模型的主要数据来源。

M3. 蒙特卡罗模拟法

顾名思义,该方法通过计算机模拟产生一个服从特定分布的市场变化序列,然后通过这一市场变化序列模拟资产组合风险因素的收益分布,最后求出组合的 VaR 值。

蒙特卡罗模拟法与历史模拟法 (M2) 的主要区别在于:前者采用随机模拟的方法获取市场变化序列,而不是通过复制历史的方法获得,即将历史模拟法计算过程中的第一步改成通过随机的方法获得一个市场变化序列。

市场变化序列既可以通过历史数据模拟产生,也可以通过假定参数的方法模拟产生。由于该方法的计算过程比较复杂,因此应用上没有前面两种方法广泛。

2.3 风险管理中的应用

主要包括如下几个方面:

  • 风险控制: 目前已有众多的银行、保险公司、投资基金、养老金基金及非金融公司采用VaR方法作为金融衍生工具风险管理的手段。利用VaR方法进行风险控制,可以使每个交易员或交易单位都能确切地明了他们在进行有多大风险的金融交易,并可以为每个交易员或交易单位设置VaR限额,以防止过度投机行为的出现。

  • 业绩评估: 在金融投资中,公司出于稳健经营的需要,必须对交易员可能的过度投机行为进行限制。所以,有必要引入考虑风险因素的业绩评价指标。

  • 估算风险性资本: 以VaR来估算投资者面临市场风险时所需的适量资本,风险资本的要求是BIS对于金融监管的基本要求。

3. VaR 的优缺点分析

3.1 VaR 的优点

VaR 最大的优点是能够计算出在未来指定的一段时间内最大损失的可能性,并且这种计算方法是适用于所有的市场参与者的。不仅如此VaR还可以将特定策略的历史波动性与相关性联系在一起,最后通过类比的方式预测未来的价格风险。

系统开发者和风险经理通常会利用利用一些比较传统的方法,例如利用止损和交易量价格风险分析,就可以让交易者了解到有关量化投资策略风险的很多特性。加入利用特定品种策略在过去 10 年中遭遇 20% 的最大回调可能性。不仅如此,它们还可以确定这样的账户每日可能会超过定额亏损的次数。是市场这是一种非基于统计的 VaR 策略,我们一般也将其称为历史 VaR。

尽管历史 VaR 可以帮助我们每日可能超过额定亏损的次数,但是无论是历史 VaR 还是传统的价格风险管理工具。都无法告诉我们交易策略在接下来 24 小时发生亏损的可能性。前测 VaR 模型可以利用标准偏差和相关性,使用统计学方法预测持仓时间内亏损的可能性分布。所以,前测 VaR 模型可以非常有效的去分析当前策略应建头寸之外的额外头寸是会减少还是增加系统风险。

3.2 VaR 的缺点

我们都知道虽然 VaR 是一个非常有用的工具,但是它并不是一个关于管理价格风险问题的最全面的解决方案。这是因为 VaR 无法解决制定时间内判断亏多少的问题,它只是大概说明了我们可能会亏损的最大数量。VaR 模型还有另外一个缺陷,就是假设了连续交易日之间的独立性。也就是说假设今天发生的交易不会对明天的交易有任何的影响。

无论市场是均值回归性还是趋势性,我们进行的量化投资肯定对市场的性质有所影响,所以这种独立性假设是一个有缺陷的假设。那么这种假设也会间接导致 VaR 不能够对一系列连续时间做出解释。当然在 VaR 中还有其它的一些问题,比如其中最危险的假设是交易者可以在没有滑点的前提下平掉头寸。

4. VaR 的 Python 实现

4.1 数据概况

接下来,我们以贵州茅台 (600519) 股票为例,使用方差-协方差法和历史模拟法来计算它的 VaR 值。在计算之前,首先需要获取到贵州茅台的历史股价数据,这里我们使用 Tushare 包。它是一个免费、开源的 Python 财经数据接口包。拥有丰富的数据内容,如股票、基金、期货、数字货币等行情数据,公司财务、基金经理等基本面数据,后续开通债券、外汇、行业、大数据、区块链。Tushare 返回的绝大部分的数据格式都是 pandas DataFrame 类型,非常便于用 pandas/ NumPy/ Matplotlib 进行数据分析和可视化。

# 数据下载链接
# https://gitee.com/arlionn/data/raw/master/data01/VaR_Data_Lianxh.xlsx

# 调用相应模块
import numpy as np
import pandas as pd
import tushare as ts

# 读入贵州茅台 「600519」 2019-01-01 到 2019-12-31 复权后数据
df = ts.get_hist_data('600519', start='2019-01-01', end='2019-12-31') 

# 计算日均收益率
df1 = df['close'].sort_index(ascending=True)
df1 = pd.DataFrame(df1)
df1['date'] = df1.index
df1['date'] = df1[['date']].astype(str)
df1["rev"]= df1.close.diff(1)
df1["last_close"]= df1.close.shift(1)
df1["rev_rate"]= df1["rev"]/df1["last_close"]
df1 = df1.dropna()

# 打印查看数据
print(df1.head(10))
             close        date    rev  last_close  rev_rate
date                                                       
2019-01-03  590.00  2019-01-03  -8.98      598.98 -0.014992
2019-01-04  602.00  2019-01-04  12.00      590.00  0.020339
2019-01-07  605.49  2019-01-07   3.49      602.00  0.005797
2019-01-08  604.79  2019-01-08  -0.70      605.49 -0.001156
2019-01-09  616.12  2019-01-09  11.33      604.79  0.018734
2019-01-10  618.77  2019-01-10   2.65      616.12  0.004301
2019-01-11  635.88  2019-01-11  17.11      618.77  0.027652
2019-01-14  624.60  2019-01-14 -11.28      635.88 -0.017739
2019-01-15  659.98  2019-01-15  35.38      624.60  0.056644
2019-01-16  661.10  2019-01-16   1.12      659.98  0.001697

4.2 历史模拟法

首先,使用历史模拟法计算 VaR 值。对收益率从小到大排序, 根据所选定的置信度,取相应的分位数, 作为VaR损失率。 本例中选定如下置信度: 99% - 对应1分位 95% - 对应5分位 90% - 对应10分位

# Numpy 的 percentile 函数,可以直接返回序列相应的分位数
sRate = df1["rev_rate"].sort_values(ascending=True)
p = np.percentile(sRate, (1, 5, 10), interpolation='midpoint')
print(p)

# 打印程序返回结果 (1分位,5分位,10分位) :
[-0.0379989  -0.02364283 -0.01714272]

4.3 方差-协方差法

继续使用上文数据,使用协方差法计算贵州茅台未来持有期为一天的的 VaR。

from scipy.stats import norm
u = df1.rev_rate.mean()
σ2 = df1.rev_rate.var()
σ  = df1.rev_rate.std()

# 置信度为 99% 时的 VaR
Z_01 = -norm.ppf(0.99)
# 因为 (R* - u)/σ = Z_01
# 所以 R* = Z_01*σ - u
print(Z_01*σ - u)
# 打印程序返回结果
-0.047625455108454944

# 置信度为 95% 时的 VaR
Z_05 = -norm.ppf(0.95)
print(Z_01*σ - u)
# 打印程序返回结果
-0.03454868901947605

# 置信度为 90% 时的 VaR
Z_10 = -norm.ppf(0.90)
print(Z_01*σ - u)
# 打印程序返回结果
-0.027577513405078673

5. VaR 的 Stata 实现

5.1 历史模拟法

首先,将贵州茅台 (600519) 的历史股价数据导入到 Stata,如果能下载到日收益率数据则可以省去第一步算收益率。接下来,我们使用历史模拟法计算贵州茅台的 VAR 值。

在计算完收益率后, 根据所选定的置信度,取相应的分位数, 作为 VaR 损失率。

本例中选定如下置信度:

  • 99% - 对应第 1 百分位
  • 95% - 对应第 5 百分位
  • 90% - 对应第 10 百分位

具体实现过程如下。

数据下载和准备工作:

 local url "https://gitee.com/arlionn/data/raw/master/data01/VaR_Data_Lianxh.xlsx"
 import excel using "`url'", first clear  //导入数据
 
 gen t = date(date, "YMD") //产生数值类型的时间变量
 format t %td              //设定显示格式
 tsset  t                  //设定时间序列标示
 drop rev_rate

VaR 的计算和分析过程如下:

* 首先,导入历史股价数据后计算日收益率
gen yesterday=close[_n-1]    * close 代表收盘价,yesterday代表滞后一期的变量,也就是前一天的收盘价
gen rev_rate=(close-yesterday)/yesterday

* 接下来,计算出 99%、95%、90% 置信水平下的 VaR 值
centile rev_rate, centile(1 5 10)

* 输出结果如下

                                                       -- Binom. Interp. --
    Variable |       Obs  Percentile    Centile        [95% Conf. Interval]
-------------+-------------------------------------------------------------
 rev_rateold |       243          1   -.0445851       -.0698152   -.0303525*
             |                    5   -.0240372        -.030362   -.0187834
             |                   10     -.01755       -.0215588    -.013518

 Lower (upper) confidence limit held at minimum (maximum) of sample

历史模拟法从上面的计算过程来看似乎很简单,或许你已经发现上述计算过程的缺陷,没有使用持有期Tn;其实本例在计算收益率时使用T1 - T0的计算方法,隐含着持有期为一天的VaR值;如果有计算持有期为100天的VaR值,需要用T100 - T0计算收益率,也就是差分为100阶;相信这里大家能看发现历史模拟法的缺陷了,它不单要假设历史很长一段时间具备独立同分布统计条件,实际上外部因素不可能长期保持不变的分布概率;还有就是持有期较长的话,差分处理导致损失大量数据,这样对数据样本的要求就比较苛刻了。

5.2 方差-协方差法

继续使用上文数据,使用协方差法计算贵州茅台未来持有期为一天的的 VaR。

* 首先,计算收益率的均值及标准差
egen rev_mean=mean(rev_rate)
egen rev_sd=sd(rev_rate)

* 置信度为 99% 时的 VaR
* 按照公式 R* = -Z_01*σ - u 计算 VaR值,其中 Z_01 代表标准正太分布下 99% 的 z 值
local 99VaR "-2.58*rev_sd-rev_mean"
di `99VaR'
* 输出结果如下
-.05249263

* 置信度为 95% 时的 VaR
* 按照公式 R* = -Z_05*σ - u 计算 VaR值,其中 Z_05 代表标准正太分布下 95% 的 z 值
local 95VaR "-1.96*rev_sd-rev_mean"
di `95VaR'
* 输出结果如下
-.04059584

* 置信度为 90% 时的 VaR
* 按照公式 R* = -Z_10*σ - u 计算 VaR值,其中 Z_10 代表标准正太分布下 90% 的 z 值
local 90VaR "-1.65*rev_sd-rev_mean"
di `90VaR'
* 输出结果如下
-.03464744

以上计算可以看出, 方差-协方差法与历史模拟法有很大区别, 方差-协方差法的核心是概率密度函数的分布假设, 如正态随机分布;而历史模拟法以样本的实际分布为参考。协方差法的好处在于可以考虑当前实际因素, 假定合适的分布, 不会受历史影响,而且只要小量的样本计算出均值和方差即可。

6. 例子:用贵州茅台实时数据计算 VaR

本例中,我们使用 cntrade 命令实时下载 贵州茅台 (600519) 「ps, 很容易记,我要酒 - 519」,进而分别采用「历史模拟法」和「方差-协方差法」计算其 VaR 值。

由于过程与上一节完全相同,故只列出代码。


*-6 贵州茅台-实时数据分析

*-下载实时数据
  . ssc install cntrade, replace // 下载 cntrade 命令

  . cntrade 600519  //下载贵州茅台日交易资料
  . keep date clsprc rit 

  . rename rit rev_rate  // 日收益率

  . des  // 数据概况

Contains data from C:\data/600519.dta
  obs:         4,487                          
 vars:             3                          15 Jun 2020 22:30
 size:       107,688                          
-----------------------------------------------------------------
              storage   display    value
variable name   type    format     label      variable label
-----------------------------------------------------------------
date            double  %dCY-N-D              Trading Date
clsprc          double  %10.0g                Closing Price
rit             double  %10.0g                Daily Return
-----------------------------------------------------------------

. tsset date
   time variable:  date, 2001-08-27 to 2020-06-15, but with gaps
           delta:  1 day
 
*-6.1 历史模拟法 
  
*-计算出 99%、95%、90% 置信水平下的 VaR 值
. centile rev_rate, centile(1 5 10)
                                                     -- Binom. Interp. --
  Variable |       Obs  Percentile    Centile        [95% Conf. Interval]
  ---------+-------------------------------------------------------------
  rev_rate |     4,487          1   -.0482902       -.0528689   -.0456988
           |                    5   -.0297198       -.0312668    -.028101
           |                   10   -.0211164       -.0221469   -.0201984

*-6.2 方差-协方差法

* 首先,计算收益率的均值及标准差
  egen rev_mean=mean(rev_rate)
  egen rev_sd=sd(rev_rate)

* 置信度为 99% 时的 VaR
* 按照公式 R* = -Z_01*σ - u 计算 VaR值,其中 Z_01 代表标准正太分布下 99% 的 z 值
  local 99VaR "-2.58*rev_sd-rev_mean"
  di `99VaR'   // -.0554347   (2020/6/15 22:37)

* 置信度为 95% 时的 VaR
* 按照公式 R* = -Z_05*σ - u 计算 VaR值,其中 Z_05 代表标准正太分布下 95% 的 z 值
  local 95VaR "-1.96*rev_sd-rev_mean"
  di `95VaR'   // -.04246785  (2020/6/15 22:37)

* 置信度为 90% 时的 VaR
* 按照公式 R* = -Z_10*σ - u 计算 VaR值,其中 Z_10 代表标准正太分布下 90% 的 z 值
  local 90VaR "-1.65*rev_sd-rev_mean"
  di `90VaR'   // -.03598442  (2020/6/15 22:37)

相关课程

连享会-直播课 上线了!
http://lianxh.duanshu.com

免费公开课:


课程一览

支持回看,所有课程可以随时购买观看。

专题 嘉宾 直播/回看视频
最新专题 DSGE, 因果推断, 空间计量等
Stata数据清洗 游万海 直播, 2 小时,已上线
研究设计 连玉君 我的特斯拉-实证研究设计-幻灯片-
面板模型 连玉君 动态面板模型-幻灯片-
面板模型 连玉君 直击面板数据模型 [免费公开课,2小时]

Note: 部分课程的资料,PPT 等可以前往 连享会-直播课 主页查看,下载。


关于我们

  • Stata连享会 由中山大学连玉君老师团队创办,定期分享实证分析经验。直播间 有很多视频课程,可以随时观看。
  • 连享会-主页知乎专栏,300+ 推文,实证分析不再抓狂。
  • 公众号推文分类: 计量专题 | 分类推文 | 资源工具。推文分成 内生性 | 空间计量 | 时序面板 | 结果输出 | 交乘调节 五类,主流方法介绍一目了然:DID, RDD, IV, GMM, FE, Probit 等。
  • 公众号关键词搜索/回复 功能已经上线。大家可以在公众号左下角点击键盘图标,输入简要关键词,以便快速呈现历史推文,获取工具软件和数据下载。常见关键词:课程, 直播, 视频, 客服, 模型设定, 研究设计, stata, plus, 绘图, 编程, 面板, 论文重现, 可视化, RDD, DID, PSM, 合成控制法

连享会主页  lianxh.cn
连享会主页 lianxh.cn

连享会小程序:扫一扫,看推文,看视频……

扫码加入连享会微信群,提问交流更方便

✏ 连享会学习群-常见问题解答汇总:
https://gitee.com/arlionn/WD