1. 程式人生 > 實用技巧 >R語言風險價值VaR(Value at Risk)和損失期望值ES(Expected shortfall)的估計

R語言風險價值VaR(Value at Risk)和損失期望值ES(Expected shortfall)的估計

原文連結:http://tecdat.cn/?p=15929

風險價值VaR和損失期望值ES是常見的風險度量。

首先明確:

  1. 時間範圍-我們展望多少天?
  2. 概率水平-我們怎麼看尾部分佈?

在給定時間範圍內的盈虧預測分佈,示例如圖1所示。

圖1:預測的損益分佈

給定概率水平的預測的分位數。

圖2:帶有分位數的預測損益分佈

超出分位數的尾部。

圖3:帶有分位數和尾部​​標記的預測損益分佈

方法

風險值(VaR)是在所選概率水平下預測分佈分位數的負數。因此,圖2和3中的VaR約為110萬元。

損失期望值(ES)是超出VaR的尾部預期值的負值(圖3中的黃金區域)。因此,它總是比相應的VaR大。

別名

損失期望值

損失期望值有很多別名:

  • 條件風險價值(CVaR)
  • 平均短缺
  • 平均超額損失

我發現“處於風險中的條件價值”令人困惑。我可以看到人們認為在一定條件下它是一種風險價值,而不是超出風險價值的預期損失。

平均超額損失似乎是最具描述性的名稱。

在上方,我們看到一個帶有多個名稱的概念。在下面,我們看到一個具有多個概念的名稱。

概率等級

當我說5%時,有人說95%。其實我們都是在處理尾部,這意味著(在我的術語中)肯定少於50%。

縮略語

“風險價值”的縮寫有可能與其他兩個概念混淆:

  • 方差
  • 向量自迴歸

所有這些都可以避免與大寫約定衝突:

  • VaR:風險價值
  • var:方差
  • VAR:向量自迴歸

估算

初始成分

有兩種初始成分:

  • 投資組合中的資產
  • 所涉及資產的價格歷史

衍生成分

投資組合加上當前價格得出投資組合權重。

價格歷史記錄矩陣用於獲取退貨歷史記錄矩陣。

給定投資組合的回報歷史記錄,可以通過多種方式獲得預測分佈:

  • 擬合假設分佈
  • 模擬(使用一段時間內的經驗分佈)
  • 總體預測
  • 梯度模擬

如果假設正態分佈,則可以估計標準偏差以獲得預測分佈。如果假設t分佈,則還需要估計自由度或假設自由度。

通常被稱為模擬方法的方法實際上只是使用一些特定數量的投資組合收益的經驗分佈。

使用單變數garch模型可以很好地估算VaR和ES。

R語言

對於VaR和ES,

R語言是非常合適的環境。

填充區域

您可能想知道如何填充圖中的區域,如圖3所示。竅門是使用該polygon函式。

  1. plot(xseq, pd, type="l", col="steelblue", lwd=3,
  2. yaxt="n", ylab="",
  3. xlab="Predicted Profit/Loss (millions of dollars)")
  4. abline(v=qnorm(.05, mean=.5, sd=1), lty=2, lwd=3)
  5. polygon(c(xseqt, max(xseqt)), c(dnorm(xseqt,
  6. mean=.5, sd=1), 0), col="gold", border=NA)
  7. lines(xseq, pd, type="l", col="steelblue", lwd=3)
  8. abline(h=0, col="gray80", lwd=2)

投資組合方差計算

給定方差矩陣和權重向量的R命令來獲得投資組合方差:

weight %*% varianceMatrix %*% weight

假設權重向量與方差矩陣完全對齊。

  1. weight %*% varianceMatrix[names(weight),
  2. names(weight)] %*% weight

風險價值和損失期望值的估計

評估風險價值和損失期望值的簡介,以及使用R進行估算 。

基本

風險價值(VaR)和預期短缺(ES)始終與投資組合有關。

您需要兩種基本成分:

  • 投資組合
  • 所涉及資產的價格歷史

這些可以用來估計市場風險。價格歷史記錄中可能不包含其他風險,例如信用風險。

多元估計

當我們從資產級別開始時,VaR和ES在投資組合級別上都是一個風險數字。一種方法是估計資產收益的方差矩陣,然後使用投資組合權重將其摺疊為投資組合方差。

單變數估計

通過投資組合的單個時間序列收益(現在是該投資組合),估算更為簡單。

我們可以通過將投資組合中資產的簡單收益矩陣乘以投資組合權重的矩陣來獲得此資訊。

R1 <- assetSimpRetMatrix %*% portWts

或 :

R1 <- assetSimpRetMatrix[, names(portWts)] %*% portWts

R1上面計算的物件持有投資組合的(假設的)簡單收益。

r1 <- log(R1 + 1)

當然,還有其他選擇,但是一些常用方法是:

  • 歷史的(使用最近一段時間內的經驗分佈)
  • 正態分佈(根據資料估算引數)並使用適當的分位數
  • t分佈(通常假設自由度而不是估計自由度)
  • 擬合單變數garch模型並提前進行模擬

R分析

以下是示例,其中spxret11包含2011年標準普爾500指數每日對數收益的向量。因此,我們將獲得2012年第一天的風險度量(收益)。

  1. > "historical")
  2. [,1]
  3. VaR -0.02515786
  4. > "gaussian")
  5. [,1]
  6. VaR -0.0241509
  7. > "gaussian"
  8. [,1]
  9. VaR -0.03415703
  10. > "historical")
  11. [,1]
  12. ES -0.03610873
  13. > "gaussian")
  14. [,1]
  15. ES -0.03028617

如果第一個引數是矩陣,則每一列都可以視為投資組合中的資產。

  1. no weights passed in, assuming equal weighted portfolio
  2. $MVaR
  3. [,1]
  4. [1,] 0.02209855
  5. $contribution
  6. Convertible Arbitrage CTA Global
  7. 0.0052630876 -0.0001503125
  8. Distressed Securities Emerging Markets
  9. 0.0047567783 0.0109935244
  10. Equity Market Neutral
  11. 0.0012354711
  12. $pct_contrib_MVaR
  13. Convertible Arbitrage CTA Global
  14. 0.238164397 -0.006801916
  15. Distressed Securities Emerging Markets
  16. 0.215252972 0.497477204
  17. Equity Market Neutral
  18. 0.055907342

風險價值的歷史估計

這是用於風險價值的歷史估計的簡單函式的定義:

  1. VaRhistorical <- function(returnVector, prob=.05,
  2. notional=1, digits=2)
  3. {
  4. if(prob > .5) prob <- 1 - prob
  5. ans <- -quantile(returnVector, prob) * notional
  6. signif(ans, digits=digits)
  7. }

投資組合,例如:

  1. > VaRhistorical(spxret11, notional=13e6)
  2. 5%
  3. 330000

損失期望值:

  1. EShistorical <- function(returnVector, prob=.05,
  2. notional=1, digits=2)
  3. {

可以這樣使用:

  1. > EShistorical(spxret11, notional=13e6)
  2. [1] 470000

因此,風險價值為 330,000,損失期望值為 470,000。

正態分佈

稍後會有一個更好的版本(從統計意義上來說),但是這是一種假設正態分佈來獲得“風險價值”的簡單方法:

用法如下:

  1. > VaRnormalEqwt(spxret11, notional=13e6)
  2. [1] 310000
  3. > VaRnormalEqwt(spxret11, notional=13e6,
  4. + expected.return=0)
  5. [1] 310000

在這種情況下,計算損失期望值有點複雜,因為我們需要找到尾部的期望值。

  1. ESnormalEqwt <- function(returnVector, prob=.05,
  2. notional=1, expected.return=mean(returnVector),
  3. digits=2)
  4. {
  5. ans <- -tailExp * notional
  6. signif(ans, digits=digits)

這個例子的結果是:

  1. > ESnormalEqwt(spxret11, notional=13e6)
  2. [1] 390000

一個更好的辦法是用指數平滑得到的波動性:

  1. VaRnormalExpsmo <- function(returnVector, prob=.05,
  2. notional=1, expected.return=mean(returnVector),
  3. lambda=.97, digits=2)
  4. {
  5. signif(ans, digits=digits)

其中pp.exponential.smooth取自“指數衰減模型”

  1. > VaRnormalExpsmo(spxret11, notional=13e6)
  2. [1] 340000

t分佈

  1. VaRtExpsmo <- function(returnVector, prob=.05,
  2. notional=1, lambda=.97, df=7, digits=2)
  3. {
  4. if(prob > .5) prob <- 1 - prob

結果是:

  1. > VaRtExpsmo(spxret11, notional=13e6)
  2. 2011-12-30
  3. 340000

參考文獻

1.R語言基於ARMA-GARCH-VaR模型擬合和預測實證研究

2.R語言時變引數VAR隨機模型

3.R語言時變引數VAR隨機模型

4.R語言基於ARMA-GARCH過程的VAR擬合和預測

5.GARCH(1,1),MA以及歷史模擬法的VaR比較

6.R語言時變引數VAR隨機模型

7.R語言實現向量自動迴歸VAR模型

8.R語言隨機搜尋變數選擇SSVS估計貝葉斯向量自迴歸(BVAR)模型

9.R語言VAR模型的不同型別的脈衝響應分析