[GSoC-PortA] Volatility weighted benchmark constructor

Ross Bennett rossbennett34 at gmail.com
Mon Oct 7 21:12:23 CEST 2013


Peter,

Thanks for sharing. I think it would be great to include the volatility
weighted like we have the equal weight portfolio. I will work on adding
that.

Thanks,
Ross


On Sun, Oct 6, 2013 at 6:25 PM, Peter Carl <peter at braverock.com> wrote:

> Ross,
>
> I mimicked your equal-weight constructor to create an "inverse volatility"
> benchmark.  I see this used more frequently in managed futures trading,
> where the position is proportioned as one over the volatility of the
> asset.
>
> In effect, this gives an interesting metric relative to the equal standard
> deviation portfolio, and is a special case where the covariance matrix is
> homogeneous. When comparing the two, the inverse volatility benchmark
> allows you to ask the question of how much information about sizing is in
> the covariance assumptions, relative to that in the volatility
> assumptions.  I think it's useful for making that tradeoff between
> volatility and correlation much more explicit.
>
> There may be another, more formal name.  Usually we just refer to it as
> "volatility weighted" as being similar to "equal weighted".
>
> ### Construct BUOY 8: Volatility Weighted Portfolio
> # There's only one, so create a portfolio object with all the objectives
> we want calculated.
> VolWgt.portf <- portfolio.spec(assets=colnames(R))
> VolWgt.portf <- add.constraint(portfolio=VolWgt.portf, type="leverage",
> min_sum=0.99, max_sum=1.01)
> VolWgt.portf <- add.objective(portfolio=VolWgt.portf, type="return",
> name="mean")
> VolWgt.portf <- add.objective(portfolio=VolWgt.portf, type="risk_budget",
> name="ES", arguments=list(p=p, clean=clean))
> VolWgt.portf <- add.objective(portfolio=VolWgt.portf, type="risk_budget",
> name="StdDev", arguments=list(clean=clean))
>
> ### Evaluate BUOY 8: Inverse Volatility Portfolio
> inverse.volatility <- function (R, portfolio, ...)
> {
>   if (!is.portfolio(portfolio))
>       stop("portfolio object passed in must be of class 'portfolio'")
>   assets <- portfolio$assets
>   nassets <- length(assets)
>   weights <- as.vector((1/StdDev(R))/sum(1/StdDev(R)))
>   names(weights) <- names(assets)
>   if (ncol(R) != nassets) {
>       if (ncol(R) > nassets) {
>           R <- R[, 1:nassets]
>           warning("number of assets is less than number of columns in
> returns object, subsetting returns object.")
>       }
>       else {
>           stop("number of assets is greater than number of columns in
> returns object")
>       }
>   }
>   out <- constrained_objective(w = weights, R = R, portfolio = portfolio,
>       trace = TRUE, ...)$objective_measures
>   return(structure(list(R = R, weights = weights, objective_measures = out,
>       call = match.call(), portfolio = portfolio), class =
> c("optimize.portfolio.invol",
>       "optimize.portfolio")))
> }
>
> # Calculate the objective measures for the vol weight portfolio
> VolWgt.opt <- volatility.weight(R=R, portfolio=VolWgt.portf)
>
> At any rate, I think it probably makes sense to include alongside the
> equal weight function as another special case.  Let me know what you
> think.
>
> pcc
> --
> Peter Carl
> http://www.braverock.com/peter
>
>
> _______________________________________________
> GSoC-PortA mailing list
> GSoC-PortA at lists.r-forge.r-project.org
> http://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/gsoc-porta
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.r-forge.r-project.org/pipermail/gsoc-porta/attachments/20131007/1e4be1b5/attachment-0001.html>


More information about the GSoC-PortA mailing list