portEsDecomp: Decompose portfolio ES into individual factor contributions

View source: R/portEsDecomp.R

portEsDecompR Documentation

Decompose portfolio ES into individual factor contributions

Description

Compute the factor contributions to Expected Tail Loss or Expected Shortfall (ES) of portfolio returns based on Euler's theorem, given the fitted factor model. The partial derivative of ES with respect to factor beta is computed as the expected factor return given portfolio return is less than or equal to its value-at-risk (VaR). Option to choose between non-parametric and Normal.

Usage

portEsDecomp(object, ...)

## S3 method for class 'tsfm'
portEsDecomp(
  object,
  weights = NULL,
  p = 0.05,
  type = c("np", "normal"),
  invert = FALSE,
  use = "pairwise.complete.obs",
  ...
)

## S3 method for class 'ffm'
portEsDecomp(
  object,
  weights = NULL,
  factor.cov,
  p = 0.05,
  type = c("np", "normal"),
  invert = FALSE,
  ...
)

Arguments

object

fit object of class tsfm, or ffm.

...

other optional arguments passed to quantile and optional arguments passed to cov

weights

a vector of weights of the assets in the portfolio, names of the vector should match with asset names. Default is NULL, in which case an equal weights will be used.

p

tail probability for calculation. Default is 0.05.

type

one of "np" (non-parametric) or "normal" for calculating Es. Default is "np".

invert

a logical variable to choose if change ES to positive number, default is False

use

an optional character string giving a method for computing factor covariances in the presence of missing values. This must be (an abbreviation of) one of the strings "everything", "all.obs", "complete.obs", "na.or.complete", or "pairwise.complete.obs". Default is "pairwise.complete.obs".

factor.cov

optional user specified factor covariance matrix with named columns; defaults to the sample covariance matrix.

Details

The factor model for a portfolio's return at time t has the form

R(t) = beta'f(t) + e(t) = beta.star'f.star(t)

where, beta.star=(beta,sig.e) and f.star(t)=[f(t)',z(t)]'. By Euler's theorem, the ES of the portfolio's return is given by:

ES.fm = sum(cES_k) = sum(beta.star_k*mES_k)

where, summation is across the K factors and the residual, cES and mES are the component and marginal contributions to ES respectively. The marginal contribution to ES is defined as the expected value of F.star, conditional on the loss being less than or equal to portVaR. This is estimated as a sample average of the observations in that data window.

Value

A list containing

portES

factor model ES of portfolio returns.

mES

length-(K + 1) vector of marginal contributions to Es.

cES

length-(K + 1) vector of component contributions to Es.

pcES

length-(K + 1) vector of percentage component contributions to Es.

Where, K is the number of factors.

Author(s)

Douglas Martin, Lingjie Yi

See Also

fitTsfm, fitFfm for the different factor model fitting functions.

portSdDecomp for factor model Sd decomposition. portVaRDecomp for factor model VaR decomposition.

Examples

# Time Series Factor Model

 # load data
data(managers, package = 'PerformanceAnalytics')

fit.macro <- fitTsfm(asset.names = colnames(managers[,(1:6)]),
                     factor.names = colnames(managers[,(7:9)]),
                     rf.name = colnames(managers[,10]), 
                     data = managers)
                     
ES.decomp <- portEsDecomp(fit.macro, invert = TRUE)

# get the component contributions
ES.decomp$cES

# random weights 
wts = runif(6)
wts = wts/sum(wts)
names(wts) <- colnames(managers)[1:6]

portEsDecomp(fit.macro, wts)

# Fundamental Factor Model
data("stocks145scores6")
dat = stocks145scores6
dat$DATE = zoo::as.yearmon(dat$DATE)
dat = dat[dat$DATE >=zoo::as.yearmon("2008-01-01") & dat$DATE <= zoo::as.yearmon("2012-12-31"),]

# Load long-only GMV weights for the return data
data("wtsStocks145GmvLo")
wtsStocks145GmvLo = round(wtsStocks145GmvLo,5)  
                                                     
# fit a fundamental factor model
fit.cross <- fitFfm(data = dat, 
              exposure.vars = c("SECTOR","ROE","BP","SIZE", "EP"),
              date.var = "DATE", 
              ret.var = "RETURN", 
              asset.var = "TICKER", 
              fit.method="WLS", 
              z.score = "crossSection")
              
decomp = portEsDecomp(fit.cross) 

#get the factor contributions of risk 
decomp$cES

portEsDecomp(fit.cross, weights = wtsStocks145GmvLo)  

braverock/factorAnalytics documentation built on Dec. 16, 2024, 1:05 p.m.