1. 程式人生 > >VaR的三種計算方法

VaR的三種計算方法

一、基礎概念篇

VaR是value at risk的縮寫,是指在市場的正常波動下,在給定的置信水平下,某一金融資產或者證券投資組合在未來的特定的一段時間內的最大可能損失。如果我們選擇置信水平為p,則VaR是對應損益分佈上的p分位點。

CVaR是conditional value at risk,是指在損失超過VaR的情況下的平均損失值。

舉個例子,可以從連結下載歷史資料,用R來計算VaR和CVaR。

# 讀取資料
dat <- read.csv("^FCHI.csv")
dim(dat)
head(dat)
tail(dat)

# 僅僅需要調整後的收盤價
price <- dat[,"Adj.Close"]

# 計算對數收益率
returns <- log(price[-1]/price[-length(price)])

# 置信水平為0.95時,計算VaR與CVaR
(var <- quantile(returns,0.05))
-0.01480279 
(cvar <- mean(returns[which(returns <= var)]))
-0.01857502

# 置信水平為0.99時,計算VaR與CVaR
(var <- quantile(returns,0.01))
-0.02063472
(cvar <- mean(returns[which(returns <= var)]))
-0.02310635

二、計算方法篇

引數方法,假定收益率分佈服從一定的分佈來估計VaR:方差-協方差、delta-gamma

非引數方法,不需要對收益率的分佈做任何假設,它通過對已有歷史資料的分析、模擬來估計VaR的值:歷史模擬、重抽樣

本文介紹三種:1.方差-協方差法,2.歷史模擬法,3.蒙特卡洛模擬法

1. 方差-協方差法

# 載入必要的包
library(corpcor)
library(tseries)
library(quantmod)

# 挑三支股票
aapl <- getSymbols("AAPL",type="xts")
cbs <- getSymbols("CBS",type="xts")
efx <- getSymbols("EFX",type="xts")

aapl <- diff(log(AAPL$AAPL.Adjusted),1)
cbs <- diff(log(CBS$CBS.Adjusted),1)
efx <- diff(log(EFX$EFX.Adjusted),1)

portfolio <- data.frame(aapl, cbs, efx)[-1,]
colnames(portfolio) <- c("AAPL","CBS","EFX")
head(portfolio)
#                 AAPL          CBS           EFX
# 2007-01-04  0.021952862 -0.008581001  0.0087097056
# 2007-01-05 -0.007146660 -0.014143622 -0.0154806479
# 2007-01-08  0.004926367  0.005166291  0.0035164341
# 2007-01-09  0.079799621 -0.005166291 -0.0037678829
# 2007-01-10  0.046745577  0.008702617  0.0022625990
# 2007-01-11 -0.012448090  0.001282902  0.0007529109

# 初始投資
initial_investment <- 100000

# 權重
weights <- c(0.4,0.35,0.25)

# 方差-協方差矩陣
volmatrix <- cov(portfolio)

# 每支股票的均值
avgmatrix <- apply(portfolio,2,mean)

# 投資組合的均值
port_mean <- avgmatrix %*% weights

# 投資組合的標準差
port_stdev <- sqrt(weights %*% volmatrix %*% weights)

# 計算var
var <- initial_investment * qnorm(0.05,mean = port_mean,sd = port_stdev)
# -2702.827

如果資產組合總價值為100,000元,那麼有95%的把握認為損失不會超過2702.927元。

2. 歷史模擬法

# 計算投資組合的日收益率
total.return <- as.matrix(portfolio) %*% weights
head(total.return)

# 計算var
var <- quantile(total.return,0.05) * initial_investment
# -2552.956

如果資產組合總價值為100,000元,那麼有95%的把握認為損失不會超過2552.956元。

3. 蒙特卡洛模擬法

# 模擬產生10000個收益率
sim <- rnorm(10000,mean = port_mean,sd = port_stdev)
# 計算var
var <- quantile(sim,0.05) * initial_investment
# -2724.585

如果資產組合總價值為100,000元,那麼有95%的把握認為損失不會超過2724.585元。