The minimum variance portfolios have slightly reduced correlations to assets in weight-constrained portfolios.
- exactly 20 names, weights between 1% and 10%
- exactly 200 names, weights between 0.1% and 1%
- exactly 20 names, maximum asset-portfolio correlation of 60%
- exactly 200 names, maximum asset-portfolio correlation of 60%
Here we see what the asset correlations with the respective minimum variance portfolios look like.
Figures 1 through 4 show the asset-portfolio correlation distribution for the minimum variance portfolio with each set of constraints.
The maximum correlation in Figure 1 is 66.9% and the maximum in Figure 2 is 76.5%.
The asset-portfolio correlation distributions for the minimum variance portfolios don’t seem to be too different from those of typical portfolios (shown in “Portfolio diversity”). The correlations are somewhat smaller for the minimum variance weight constraint portfolios, and somewhat larger for the correlation constraint portfolios.
The following commands need the Portfolio Probe software.
get minimum variance portfolios
> divop.200w <- trade.optimizer(sp5.price10, sp5.var10, + long.only=TRUE, gross=1e7, max.weight=.01, + threshold=1e7 * .001/sp5.price10, + port.size=c(200,200))
The command as written here will produce a warning about switching from the default utility of maximizing the information ratio. In production code it is better to avoid such warnings by specifying the utility or suppressing that particular warning.
add asset-portfolio correlations
In this case where the asset-portfolio correlations are not part of the problem, we need to compute them. An easy way to do this is to evaluate the optimization problem at its solution with correlations added as a constraint:
> divop.200wc <- update(divop.200w, risk.fraction=1, + rf.style='corport', start.sol=divop.200w, funev=0)
funev=0 is saying to limit the maximum number of function evaluations to zero. It takes the liberty of performing one function evaluation — with the answer given by
The correlations are in the
risk.fraction component of the new object. An example of their use is:
> max(divop.200wc$risk.fraction)  0.7648725 > which.max(divop.200wc$risk.fraction)  332 > rownames(divop.200wc$risk.fraction)  "PCAR"