# solnp Problem Inverting Hessian

13 messages
Open this post in threaded view
|

## solnp Problem Inverting Hessian

 I must admit to being flummoxed here, mainly because my linear algebra was 25 years ago and I can't remember what a Hessian is. I have a matrix of 60 securities' weekly returns, along with 60 projected returns. The returns are in a vector called Ret.vect and the covariance matrix of weekly returns in cov.mat . I have the minConstraints and maxConstraints that the parameters are permitted to take. I cycle through targeted risks and get the same error for each risk targeted...below I have removed the loop to focus on the risk=0.002. wgt.vect=c(rep(1/60, 60)) constr.fun <- function(wgt.vect) {;                 c1 = sqrt(crossprod(t(wgt.vect %*% cov.mat),wgt.vect));                 c2 = sum(wgt.vect);                 return(c(c1,c2));                 } ineqconstr.fun <- function(wgt.vect) {                 wgt.vect[1:60];                 } opt.fun <- function(wgt.vect) {-crossprod(wgt.vect,t(Ret.vect))} OptimSolution <- solnp(wgt.vect,opt.fun,constr.fun,eqB=c(0.002,1),ineqconstr.fun,ineqLB=minConstraints,ineqUB=maxConstraints) I get the following error: solnp--> Solution not reliable....Problem Inverting Hessian. Well, that doesn't tell me very much! The parameters (weights) that are output for each run, as I cycle through the weights, are very scrambled...lots of little allocations, rather than clumping as you would expect to happen especially at the risky and riskless ends of the spectrum. Can anyone with more math than me give me a helping hand on the Hessian? Thanks, Mike Michael Ashton, CFA Managing Principal Enduring Investments LLC W: 973.457.4602 C: 551.655.8006 ________________________________ This email and any attachments are confidential and inte...{{dropped:9}} _______________________________________________ [hidden email] 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.
Open this post in threaded view
|

## Re: solnp Problem Inverting Hessian

 The Hessian is the matrix of second derivatives (https://en.wikipedia.org/wiki/Hessian_matrix) -- in scalar terms, you're finding a point where the second derivative is zero and then trying to divide by the second derivative to calculate the step size. I haven't gone through your code in any detail, but I'd start by checking the covariance matrix since that's proportional to the Hessian of your objective function. Is it (comfortably) non-singular? Since you're just solving the standard Markowitz problem, you might try a simpler (quadratic/convex) solver instead of a general non-linear solver. Should behave a bit better. Michael On Mon, Dec 14, 2015 at 6:13 PM, Michael Ashton <[hidden email]> wrote: > I must admit to being flummoxed here, mainly because my linear algebra was 25 years ago and I can't remember what a Hessian is. > > I have a matrix of 60 securities' weekly returns, along with 60 projected returns. The returns are in a vector called Ret.vect and the covariance matrix of weekly returns in cov.mat . I have the minConstraints and maxConstraints that the parameters are permitted to take. I cycle through targeted risks and get the same error for each risk targeted...below I have removed the loop to focus on the risk=0.002. > > wgt.vect=c(rep(1/60, 60)) > constr.fun <- function(wgt.vect) {; >                 c1 = sqrt(crossprod(t(wgt.vect %*% cov.mat),wgt.vect)); >                 c2 = sum(wgt.vect); >                 return(c(c1,c2)); >                 } > ineqconstr.fun <- function(wgt.vect) { >                 wgt.vect[1:60]; >                 } > opt.fun <- function(wgt.vect) {-crossprod(wgt.vect,t(Ret.vect))} > > OptimSolution <- solnp(wgt.vect,opt.fun,constr.fun,eqB=c(0.002,1),ineqconstr.fun,ineqLB=minConstraints,ineqUB=maxConstraints) > > I get the following error: > solnp--> Solution not reliable....Problem Inverting Hessian. > > Well, that doesn't tell me very much! The parameters (weights) that are output for each run, as I cycle through the weights, are very scrambled...lots of little allocations, rather than clumping as you would expect to happen especially at the risky and riskless ends of the spectrum. > > Can anyone with more math than me give me a helping hand on the Hessian? > > Thanks, > > > Mike > > Michael Ashton, CFA > Managing Principal > > Enduring Investments LLC > W: 973.457.4602 > C: 551.655.8006 > > > ________________________________ > This email and any attachments are confidential and inte...{{dropped:9}} > > _______________________________________________ > [hidden email] 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. _______________________________________________ [hidden email] 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.
Open this post in threaded view
|

## Re: solnp Problem Inverting Hessian

 Do you have a suggestion for such? I have in the past tried fPortfolio, but it would not allow me to specify my own projected return vectors rather than the historical returns of the series (which is exactly backwards). As for whether the matrix is comfortably non-singular...I suppose it depends in a Clintonian way on the meaning of "comfortably," but I can create a Cholesky decomposition without it blowing up, which is usually how I can tell if I have done something stupid. Well, stupider than normal. -----Original Message----- From: Michael Weylandt [mailto:[hidden email]] Sent: Monday, December 14, 2015 8:32 PM To: Michael Ashton Cc: [hidden email] Subject: Re: [R-SIG-Finance] solnp Problem Inverting Hessian The Hessian is the matrix of second derivatives (https://en.wikipedia.org/wiki/Hessian_matrix) -- in scalar terms, you're finding a point where the second derivative is zero and then trying to divide by the second derivative to calculate the step size. I haven't gone through your code in any detail, but I'd start by checking the covariance matrix since that's proportional to the Hessian of your objective function. Is it (comfortably) non-singular? Since you're just solving the standard Markowitz problem, you might try a simpler (quadratic/convex) solver instead of a general non-linear solver. Should behave a bit better. Michael On Mon, Dec 14, 2015 at 6:13 PM, Michael Ashton <[hidden email]> wrote: > I must admit to being flummoxed here, mainly because my linear algebra was 25 years ago and I can't remember what a Hessian is. > > I have a matrix of 60 securities' weekly returns, along with 60 projected returns. The returns are in a vector called Ret.vect and the covariance matrix of weekly returns in cov.mat . I have the minConstraints and maxConstraints that the parameters are permitted to take. I cycle through targeted risks and get the same error for each risk targeted...below I have removed the loop to focus on the risk=0.002. > > wgt.vect=c(rep(1/60, 60)) > constr.fun <- function(wgt.vect) {; >                 c1 = sqrt(crossprod(t(wgt.vect %*% cov.mat),wgt.vect)); >                 c2 = sum(wgt.vect); >                 return(c(c1,c2)); >                 } > ineqconstr.fun <- function(wgt.vect) { >                 wgt.vect[1:60]; >                 } > opt.fun <- function(wgt.vect) {-crossprod(wgt.vect,t(Ret.vect))} > > OptimSolution <- > solnp(wgt.vect,opt.fun,constr.fun,eqB=c(0.002,1),ineqconstr.fun,ineqLB > =minConstraints,ineqUB=maxConstraints) > > I get the following error: > solnp--> Solution not reliable....Problem Inverting Hessian. > > Well, that doesn't tell me very much! The parameters (weights) that are output for each run, as I cycle through the weights, are very scrambled...lots of little allocations, rather than clumping as you would expect to happen especially at the risky and riskless ends of the spectrum. > > Can anyone with more math than me give me a helping hand on the Hessian? > > Thanks, > > > Mike > > Michael Ashton, CFA > Managing Principal > > Enduring Investments LLC > W: 973.457.4602 > C: 551.655.8006 > > > ________________________________ > This email and any attachments are confidential and > inte...{{dropped:9}} > > _______________________________________________ > [hidden email] 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. This email and any attachments are confidential and intended only for the recipient noted above. You are hereby notified that any use, printing, copying or disclosure is strictly prohibited without the permission of Enduring Investments LLC. For further information please contact: [hidden email]; (973) 457-4602. _______________________________________________ [hidden email] 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.
Open this post in threaded view
|

## Re: solnp Problem Inverting Hessian

 Michael, Perhaps your covariance matrix is singular (non positive definite) so you can "fix" this matrix by finding the nearest correlation matrix that is non singular. The simplest recipe is to  set the negative eigenvalues to a small positive number and rescale the  matrix. Also look at nearPD in the Matrix package. Best Krishna ---- > On Dec 14, 2015, at 9:06 PM, Michael Ashton <[hidden email]> wrote: > > Do you have a suggestion for such? I have in the past tried fPortfolio, but it would not allow me to specify my own projected return vectors rather than the historical returns of the series (which is exactly backwards). > > As for whether the matrix is comfortably non-singular...I suppose it depends in a Clintonian way on the meaning of "comfortably," but I can create a Cholesky decomposition without it blowing up, which is usually how I can tell if I have done something stupid. Well, stupider than normal. > > -----Original Message----- > From: Michael Weylandt [mailto:[hidden email]] > Sent: Monday, December 14, 2015 8:32 PM > To: Michael Ashton > Cc: [hidden email] > Subject: Re: [R-SIG-Finance] solnp Problem Inverting Hessian > > The Hessian is the matrix of second derivatives > (https://en.wikipedia.org/wiki/Hessian_matrix) -- in scalar terms, you're finding a point where the second derivative is zero and then trying to divide by the second derivative to calculate the step size. > > I haven't gone through your code in any detail, but I'd start by checking the covariance matrix since that's proportional to the Hessian of your objective function. Is it (comfortably) non-singular? > > Since you're just solving the standard Markowitz problem, you might try a simpler (quadratic/convex) solver instead of a general non-linear solver. Should behave a bit better. > > Michael > > >> On Mon, Dec 14, 2015 at 6:13 PM, Michael Ashton <[hidden email]> wrote: >> I must admit to being flummoxed here, mainly because my linear algebra was 25 years ago and I can't remember what a Hessian is. >> >> I have a matrix of 60 securities' weekly returns, along with 60 projected returns. The returns are in a vector called Ret.vect and the covariance matrix of weekly returns in cov.mat . I have the minConstraints and maxConstraints that the parameters are permitted to take. I cycle through targeted risks and get the same error for each risk targeted...below I have removed the loop to focus on the risk=0.002. >> >> wgt.vect=c(rep(1/60, 60)) >> constr.fun <- function(wgt.vect) {; >>                c1 = sqrt(crossprod(t(wgt.vect %*% cov.mat),wgt.vect)); >>                c2 = sum(wgt.vect); >>                return(c(c1,c2)); >>                } >> ineqconstr.fun <- function(wgt.vect) { >>                wgt.vect[1:60]; >>                } >> opt.fun <- function(wgt.vect) {-crossprod(wgt.vect,t(Ret.vect))} >> >> OptimSolution <- >> solnp(wgt.vect,opt.fun,constr.fun,eqB=c(0.002,1),ineqconstr.fun,ineqLB >> =minConstraints,ineqUB=maxConstraints) >> >> I get the following error: >> solnp--> Solution not reliable....Problem Inverting Hessian. >> >> Well, that doesn't tell me very much! The parameters (weights) that are output for each run, as I cycle through the weights, are very scrambled...lots of little allocations, rather than clumping as you would expect to happen especially at the risky and riskless ends of the spectrum. >> >> Can anyone with more math than me give me a helping hand on the Hessian? >> >> Thanks, >> >> >> Mike >> >> Michael Ashton, CFA >> Managing Principal >> >> Enduring Investments LLC >> W: 973.457.4602 >> C: 551.655.8006 >> >> >> ________________________________ >> This email and any attachments are confidential and >> inte...{{dropped:9}} >> >> _______________________________________________ >> [hidden email] 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. > > This email and any attachments are confidential and in...{{dropped:10}} _______________________________________________ [hidden email] 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.
Open this post in threaded view
|

## Re: solnp Problem Inverting Hessian

 In reply to this post by Michael Ashton-3 What's the condition number of your correlation/covariance matrix? (?kappa) I think I've used quadprog for portfolio optimization with success, but it's been a while. MW On Mon, Dec 14, 2015 at 8:06 PM, Michael Ashton <[hidden email]> wrote: > Do you have a suggestion for such? I have in the past tried fPortfolio, but it would not allow me to specify my own projected return vectors rather than the historical returns of the series (which is exactly backwards). > > As for whether the matrix is comfortably non-singular...I suppose it depends in a Clintonian way on the meaning of "comfortably," but I can create a Cholesky decomposition without it blowing up, which is usually how I can tell if I have done something stupid. Well, stupider than normal. > > -----Original Message----- > From: Michael Weylandt [mailto:[hidden email]] > Sent: Monday, December 14, 2015 8:32 PM > To: Michael Ashton > Cc: [hidden email] > Subject: Re: [R-SIG-Finance] solnp Problem Inverting Hessian > > The Hessian is the matrix of second derivatives > (https://en.wikipedia.org/wiki/Hessian_matrix) -- in scalar terms, you're finding a point where the second derivative is zero and then trying to divide by the second derivative to calculate the step size. > > I haven't gone through your code in any detail, but I'd start by checking the covariance matrix since that's proportional to the Hessian of your objective function. Is it (comfortably) non-singular? > > Since you're just solving the standard Markowitz problem, you might try a simpler (quadratic/convex) solver instead of a general non-linear solver. Should behave a bit better. > > Michael > > > On Mon, Dec 14, 2015 at 6:13 PM, Michael Ashton <[hidden email]> wrote: >> I must admit to being flummoxed here, mainly because my linear algebra was 25 years ago and I can't remember what a Hessian is. >> >> I have a matrix of 60 securities' weekly returns, along with 60 projected returns. The returns are in a vector called Ret.vect and the covariance matrix of weekly returns in cov.mat . I have the minConstraints and maxConstraints that the parameters are permitted to take. I cycle through targeted risks and get the same error for each risk targeted...below I have removed the loop to focus on the risk=0.002. >> >> wgt.vect=c(rep(1/60, 60)) >> constr.fun <- function(wgt.vect) {; >>                 c1 = sqrt(crossprod(t(wgt.vect %*% cov.mat),wgt.vect)); >>                 c2 = sum(wgt.vect); >>                 return(c(c1,c2)); >>                 } >> ineqconstr.fun <- function(wgt.vect) { >>                 wgt.vect[1:60]; >>                 } >> opt.fun <- function(wgt.vect) {-crossprod(wgt.vect,t(Ret.vect))} >> >> OptimSolution <- >> solnp(wgt.vect,opt.fun,constr.fun,eqB=c(0.002,1),ineqconstr.fun,ineqLB >> =minConstraints,ineqUB=maxConstraints) >> >> I get the following error: >> solnp--> Solution not reliable....Problem Inverting Hessian. >> >> Well, that doesn't tell me very much! The parameters (weights) that are output for each run, as I cycle through the weights, are very scrambled...lots of little allocations, rather than clumping as you would expect to happen especially at the risky and riskless ends of the spectrum. >> >> Can anyone with more math than me give me a helping hand on the Hessian? >> >> Thanks, >> >> >> Mike >> >> Michael Ashton, CFA >> Managing Principal >> >> Enduring Investments LLC >> W: 973.457.4602 >> C: 551.655.8006 >> >> >> ________________________________ >> This email and any attachments are confidential and >> inte...{{dropped:9}} >> >> _______________________________________________ >> [hidden email] 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. > > This email and any attachments are confidential and in...{{dropped:6}} _______________________________________________ [hidden email] 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.
Open this post in threaded view
|

## Re: solnp Problem Inverting Hessian

Open this post in threaded view
|

## Re: solnp Problem Inverting Hessian

Open this post in threaded view
|

## Re: solnp Problem Inverting Hessian

Open this post in threaded view
|

## Re: solnp Problem Inverting Hessian

Open this post in threaded view
|

## Re: solnp Problem Inverting Hessian

Open this post in threaded view
|