chart.Style
calculates and displays style weights calculated over a single period. chart.RollingStyle
calculates and displays those weights in rolling windows through time. style.fit
manages the calculation of the weights by method. style.QPfit
calculates the specific constraint case that requires quadratic programming.chart.Style(R.fund, R.style, method = c("constrained", "unconstrained", "normalized"), leverage = FALSE, main = NULL, ylim = NULL, unstacked=TRUE, ...)chart.RollingStyle(R.fund, R.style, method = c("constrained","unconstrained","normalized"), leverage = FALSE, width = 12, main = paste(colnames(R.fund)[1]," Rolling ", width ,"-Month Style Weights", sep=""), space = 0, ...)
style.fit(R.fund, R.style, model = FALSE, method = c("constrained", "unconstrained", "normalized"), leverage = FALSE, ...)
style.QPfit(R.fund, R.style, model = FALSE, leverage = FALSE, ...)
style.fit
style.fit
style.QPfit
, the full result set is shown from the output of solve.QP
.barplot
. Default for chart.RollingStyle
is 0; for chart.Style
the default is 0.2.plot
plot
barplot
. These can include further arguments (such as 'axes', 'asp' and 'main') and graphical parameters (see 'par') which are passed to 'plotstyle.fit
and style.QPfit
produce a list of data frames containing 'weights' and 'R.squared' results. If 'model' = TRUE in style.QPfit
, the full result set is shown from the output of solve.QP
.The "unconstrained" method implements a simple factor model for style analysis, as in: $$Ri = bi1*F1+bi2*F2+...+bin*Fn+ei$$ where $Ri$ represents the return on asset i, $Fj$ represents each factor, and $ei$ represents the "non-factor" component of the return on i. This is simply a multiple regression analysis with fund returns as the dependent variable and asset class returns as the independent variables. The resulting slope coefficients are then interpreted as the fund's historic exposures to asset class returns. In this case, coefficients do not sum to 1.
The "normalized" method reports the results of a multiple regression analysis similar to the first, but with one constraint: the coefficients are required to add to 1. Coefficients may be negative, indicating short exposures. To enforce the constraint, coefficients are normalized.
The "constrained" method includes the constraint that the coefficients sum to 1, but adds
that the coefficients must lie between 0 and 1. These inequality constraints require a
quadratic programming algorithm using solve.QP
from the 'quadprog' package,
and the implementation is discussed under style.QPfit
. If set to TRUE,
"leverage" allows the sum of the coefficients to exceed 1.
According to Sharpe (1992), the calculation for the constrained case is represented as: $$min var(Rf - sum[wi * R.si]) = min var(F - w*S)$$ $$s.t. sum[wi] = 1; wi > 0$$
Remembering that:
$$\sigma(aX + bY) = a^2 \sigma(X) + b^2 \sigma(Y) + 2ab cov(X,Y) = \sigma(R.f) + w'*V*w - 2*w'*cov(R.f,R.s)$$
we can drop $var(Rf)$ as it isn't a function of weights, multiply both sides by 1/2:
$$= min (1/2) w'*V*w - C'w$$ $$s.t. w'*e = 1, w_i > 0$$
Which allows us to use solve.QP
, which is specified as:
$$min(-d' b + 1/2 b' D b)$$
and the constraints
$$A' b >= b.0$$
so: b is the weight vector, D is the variance-covariance matrix of the styles d is the covariance vector between the fund and the styles
The chart functions then provide a graphical summary of the results. The underlying
function, style.fit
, provides the outputs of the analysis and more
information about fit, including an R-squared value.
Styles identified in this analysis may be interpreted as an average of potentially
changing exposures over the period covered. The function chart.RollingStyle
may be useful for examining the behavior of a manager's average exposures to asset classes over time, using a rolling-window analysis.
barplot
, par
data(edhec)
data(managers)
style.fit(managers[97:132,2,drop=FALSE],edhec[85:120,], method="constrained", leverage=FALSE)
chart.Style(managers[97:132,2,drop=FALSE],edhec[85:120,], method="constrained", leverage=FALSE, unstack=TRUE)
chart.RollingStyle(managers[,2,drop=FALSE],edhec[,1:11], method="constrained", leverage=FALSE, width=36, cex.legend = .7, colorset=rainbow12equal, las=1)
Run the code above in your browser using DataLab