14.3 Portfolio risk reports
A portfolio risk report summarizes asset and portfolio risk measures as well as risk budgets. Table 14.1 shows a typical portfolio risk report. The individual asset information is in rows with the portfolio information at the bottom. The total dollar amount invested in the portfolio is W0 and the dollar amounts invested in each asset are di=xiW0. The asset specific (standalone) risk measures are RMi and the portfolio risk measure is RM(x).
Asset | $di | xi | RMi | MCRRMi | CRRMi | PCRRMi |
---|---|---|---|---|---|---|
Asset 1 | $d1 | x1 | RM1 | MCRRM1 | CRRM1 | PCRRM1 |
Asset 2 | $d2 | x2 | RM2 | MCRRM2 | CRRM2 | PCRRM2 |
⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ |
Asset N | $dN | xN | RMN | MCRRMN | CRRMN | PCRRMN |
Portfolio (Sum) | $W0 | 1 | RM(x) | 1 |
Consider creating a portfolio volatility risk report from an equally weighted portfolio of Microsoft, Nordstrom, and Starbucks stock. The initial wealth invested in the portfolio is $100,000. The expected return vector and covariance matrix is based on sample statistics computed over the five-year period January, 1995 through January, 2000. The asset and portfolio expected return and volatility information is:
# asset information
c("MSFT", "NORD", "SBUX")
asset.names <- c(0.0427, 0.0015, 0.0285)
mu.vec = matrix(c(0.0100, 0.0018, 0.0011,
sigma.mat =0.0018, 0.0109, 0.0026,
0.0011, 0.0026, 0.0199),
nrow=3, ncol=3)
sqrt(diag(sigma.mat))
sig.vec =names(mu.vec) = names(sig.vec) = asset.names
dimnames(sigma.mat) = list(asset.names, asset.names)
# equally weighted portfolio information
100000
W0 = rep(1/3, 3)
x = x*W0
d =names(x) = asset.names
as.numeric(crossprod(x, mu.vec))
mu.px = as.numeric(sqrt(t(x)%*%sigma.mat%*%x)) sig.px =
The volatility risk budgeting calculations are:
(sigma.mat%*%x)/sig.px
MCR.vol.x = x*MCR.vol.x
CR.vol.x = CR.vol.x/sig.px PCR.vol.x =
The volatility risk report is computed using:
cbind(d, x, sig.vec, MCR.vol.x,
riskReportVol.px =
CR.vol.x, PCR.vol.x) c(W0, 1, NA, NA, sum(CR.vol.x), sum(PCR.vol.x))
PORT = rbind(riskReportVol.px, PORT)
riskReportVol.px =colnames(riskReportVol.px) = c("Dollar", "Weight", "Vol",
"MCR", "CR", "PCR")
riskReportVol.px
## Dollar Weight Vol MCR CR PCR
## MSFT 33333 0.333 0.100 0.0567 0.0189 0.249
## NORD 33333 0.333 0.104 0.0672 0.0224 0.295
## SBUX 33333 0.333 0.141 0.1037 0.0346 0.456
## PORT 100000 1.000 NA NA 0.0759 1.000
In the equally weighted portfolio, the risk contributions are not equal across assets. Predictably, the ranking of the risk contributions follows the ranking of the individual asset volatilities σi, with Starbucks giving the highest contributions to portfolio volatility. So if the portfolio manager wants to reduce portfolio volatility the allocation to Starbucks should be reduced first.
To interpret the marginal contributions to risk, suppose that the portfolio manager wants to reduce portfolio volatility and chooses the rebalancing strategy: ΔxMSFT=−ΔxSBUX=0.1 (i.e., xMSFT increases to 0.433 and xSBUX decreases to 0.233). Then, from (14.16) the predicted change in portfolio standard deviation is:
(MCR.vol.x["MSFT",] - MCR.vol.x["SBUX",])*0.1
delta.vol.px = delta.vol.px
## MSFT
## -0.0047
Hence, the predicted volatility after rebalancing is:
+ delta.vol.px sig.px
## MSFT
## 0.0712
The exact change in volatility from rebalancing is:
x + c(0.1, 0, -0.1)
x1 = as.numeric(sqrt(t(x1)%*%sigma.mat%*%x1))
sig.px1 = sig.px1
## [1] 0.0729
The difference between the approximate change in portfolio volatility computed from the risk report and the actual change is:
- sig.px sig.px1
## [1] -0.00293
◼
Using the asset and portfolio data from the previous example, consider creating a normal portfolio VaR report, where VaR is computed with 5% probability. The R calculations are:
# portfolio 5% normal VaR
0.05
alpha =# risk budget calculations
abs(W0*(mu.px + sig.px*qnorm(alpha)))
VaR.px = abs(W0*(mu.vec + MCR.vol.x*qnorm(alpha)))
MCR.VaR.x = x*MCR.VaR.x
CR.VaR.x = CR.VaR.x/VaR.px
PCR.VaR.x =# risk report
abs(W0*(mu.vec + sig.vec*qnorm(alpha)))
VaR.vec = cbind(d, x, VaR.vec, MCR.VaR.x,
riskReportVaR.px =
CR.VaR.x, PCR.VaR.x) c(W0, 1, NA, NA, sum(CR.VaR.x), sum(PCR.VaR.x))
PORT = rbind(riskReportVaR.px, PORT)
riskReportVaR.px =colnames(riskReportVaR.px) = c("Dollar", "Weight", "VaR",
"MCR", "CR", "PCR")
riskReportVaR.px
## Dollar Weight VaR MCR CR PCR
## MSFT 33333 0.333 12179 5053 1684 0.168
## NORD 33333 0.333 17023 10907 3636 0.362
## SBUX 33333 0.333 20354 14206 4735 0.471
## PORT 100000 1.000 NA NA 10055 1.000
The qualitative information in the portfolio normal VaR report is essentially the same as in the portfolio volatility report. Because the VaR calculation involve the asset expected returns, μ, the results are not exactly the same. If we set μ=0 in the VaR calculations then the two reports would give same risk information but on different scales (volatility is in return and VaR is in dollars).
To interpret the marginal contributions to risk, suppose that the portfolio manager wants to reduce portfolio VaR and chooses the rebalancing strategy: ΔxMSFT=−ΔxSBUX=0.1 (i.e., xMSFT increases to 0.433 and xSBUX decreases to 0.233). Then, from (14.16) the predicted change in portfolio VaR and new portfolio VaR are:
(MCR.VaR.x["MSFT",] - MCR.VaR.x["SBUX",])*0.1
delta.VaR.px = delta.VaR.px
## MSFT
## -915
+ delta.VaR.px VaR.px
## MSFT
## 9140
The exact change in portfolio VaR from rebalancing is:
as.numeric(crossprod(x1, mu.vec))
mu.px1 = abs(W0*(mu.px1 + sig.px1*qnorm(alpha)))
VaR.px1 =- VaR.px VaR.px1
## [1] -624
VaR.px1
## [1] 9431
Here, the predicted reduction in VaR is about $300 more than the actual change in VaR.
◼