portEsDecomp | R Documentation |
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.
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,
...
)
object |
fit object of class |
... |
other optional arguments passed to |
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. |
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.
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.
Douglas Martin, Lingjie Yi
fitTsfm
, fitFfm
for the different factor model fitting functions.
portSdDecomp
for factor model Sd decomposition.
portVaRDecomp
for factor model VaR decomposition.
# 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)
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.