[R-SIG-Finance] Quadratic programming solve.QP's Lagrangians
Bob Jansen
bobjansen at gmail.com
Wed May 27 16:49:01 CEST 2015
Hi,
Careful this does rm(list=ls()) and has been cross posted to Quant.SE:
http://quant.stackexchange.com/q/17997/848
On Wed, May 27, 2015 at 2:41 PM, Ton Jean-Claude <jean-claude.ton at epfl.ch>
wrote:
> Hi I am currently playing a little with Markowitz's portfolio optimization
> problem and from my computations I get that if we start from the following
> problem :
>
> $$ \underset{w}{\arg \max} \quad w'r - \frac{\gamma}{2} w' Q w \quad
> \text{s.t} \sum_i w_i=1, \quad w_i \geq 0\quad
> $$
>
> Then $\gamma$ should be of the form :
> $$\gamma = \frac{w'(r-\beta)-\alpha}{w' \Sigma w},$$
>
> where $\alpha$ is the Lagrangian multiplier due to the sum of weights
> being equal to one and $\beta$ the Lagrangian multipliers due to the no
> short selling condition.
> Using `solve.QP` from the package `quadprog` I have coded the
> mean-variance formulation. And the function `ComputeRho` which you may find
> attached below computes the $\gamma$ (Sorry for the bad notations)
>
>
> My problem is the following
> depending on the r.a (risk aversion that is $\gamma$ in my case),
> `ComputeRho` gets me the correct answer or not.
>
> rm(list=ls())
> ###################################### begin : packages
> ####################################
> require(tseries)
> require(quantmod)
> require(quadprog)
> require(MASS)
> require(PerformanceAnalytics)
> require(corpcor)
> require(quantmod)
> require(parallel)
> require(ggplot2)
> #require(mvtnorm)
> ###################################### end : packages
> ######################################
> LogRet <- function(x,lag=5){
> #require(quantmod)
> #return(na.omit(apply(x,2,function(x) Delt(x,k=lag))) )
> require(zoo)
> return(na.omit(diff(log(x),lag=lag)))
> }
>
> ##########################################################################
> # Input : sol = solution from solve.qp
> # lr = logreturns
> # Output : rho
> ComputeRho<-function(sol,lr){
> lr<-as.matrix(lr)
> alpha<-sol$lagrange_mults[1] # Lagrangian due to
> normalizing constraint
> beta<-sol$lagrange_mults[2:length(sol$lagrange_mults)] #
> Lagrangians due to no short sell constraint
>
> weights<-sol$weights
> cov.mat<-cov(lr)
> # unconstrained form
> uncons
> <-(t(weights)%*%colMeans(lr))/(t(weights)%*%cov.mat%*%weights)
> # due to Lagrangian multipliers
> cons1 <-
> (t(weights)%*%beta)/(t(weights)%*%cov.mat%*%weights)
> cons2 <- alpha/(t(weights)%*%cov.mat%*%weights)
> cons<-cons1+cons2
>
> rho<-uncons+cons # lagrangians change sign...
> rho
> }
>
>
> ############################################################
> # Input : data = usually logreturns
> # r.aversion = risk aversion coefficient usually
> between 1 to 10
> # Output : er = expected return
> # sd = standard deviation
> # weights = weights
> # Lagrangians = Lagrange multipliers
>
> MeanVariance<-function(data,r.aversion=10,method="MeanVariance")
> {
> # compute probability beliefs mean and risk ( here sample
> covariance)
> er<-colMeans(data)
> cov.mat<-cov(data)
> # get length of data
> n_asset <- length(er)
>
> # quad problem
> Dmat <- r.aversion*as.matrix(cov.mat)
> dvec <- er
> meq <- 1
>
> bvec <- c(1, rep(0,n_asset))
> Amat <- matrix( c(rep(1,n_asset), diag(nrow=n_asset)),
> nrow=n_asset)
>
> sol<-solve.QP(Dmat, dvec,Amat, bvec=bvec, meq=meq)
>
> # fetch returns from solve.QP
> weights<-sol$solution
> exp.ret <- t(er)%*%weights
> std.dev <- sqrt(weights %*% cov.mat %*% weights)
>
> # return results
> ret <- list(er = as.vector(exp.ret),
> sd = as.vector(std.dev),
> weights = weights,
> lagrange_mults=sol$Lagrangian,
> weights2=sol$unconstrained.solution)
>
> }
> # load asset prices
> data <- read.table("~/data.csv", header=TRUE, quote="\"")
> # risk aversion
> r.a<- 17 # for values below 18 r.a is different from rho
> lr<-LogRet(as.matrix(data))
>
> sol<-MeanVariance(lr,r.aversion = r.a)
> rho<-ComputeRho(sol,lr)
> rho
>
> r.a2<- 18 # for values below 18 r.a is different from rho
> sol2<-MeanVariance(lr,r.aversion = r.a2)
> rho2<-ComputeRho(sol2,lr)
> rho2
>
>
> I was able to cern the problem to the sign of the Lagranians (here `cons1`
> and `cons2` in `ComputeRho` ) which switch signs depending on the `r.a.` I
> choose.
>
> Does someone knows how the Lagrangians are computed explicitly ? Since It
> seems that this is done in FORTRAN.
>
> Best,
> Jc
>
> here is the data set
> https://www.dropbox.com/s/ynlnmdgfm9w4rq0/data.csv?dl=0
>
> [[alternative HTML version deleted]]
>
> _______________________________________________
> R-SIG-Finance at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-sig-finance
> -- Subscriber-posting only. If you want to post, subscribe first.
> -- Also note that this is not the r-help list where general R questions
> should go.
>
--
Met vriendelijke groeten,
Bob Jansen
[[alternative HTML version deleted]]
More information about the R-SIG-Finance
mailing list