math
math

Reputation: 2022

why does solve.QP returns infeasible solution

I wanted to try an example of mean variance optimization in R. For the start I used this simple example:

> data(edhec)
> col.mean <- colMeans(edhec)
> Dmat <- cov(edhec)
> Amat <- matrix(1,nrow=nrow(Dmat))
> Amat <- cbind(Amat,col.mean)
> Amat <- cbind(Amat,diag(nrow(Dmat)))
> bvec <- c(1,0.005,rep(0,nrow(Dmat)))
> sol <- solve.QP(Dmat = 2*Dmat,dvec = 0.5*col.mean,Amat = Amat,bvec = bvec,meq = 1)
> sol$solution
 [1]  8.882101e-17  0.000000e+00  6.661437e-01  1.990021e-17  1.900749e-15 -3.685111e-17  2.419712e-16  3.338563e-01
 [9] -3.903081e-16  7.237917e-18  1.093498e-15  0.000000e+00  1.243608e-15
> 

However it seems that this solution is not feasible. There are two weights which are negative contradicting one of the constraint:

> Amat
                            col.mean                          
Convertible Arbitrage  1 0.006408553 1 0 0 0 0 0 0 0 0 0 0 0 0
CTA Global             1 0.006489474 0 1 0 0 0 0 0 0 0 0 0 0 0
Distressed Securities  1 0.007953289 0 0 1 0 0 0 0 0 0 0 0 0 0
Emerging Markets       1 0.008246053 0 0 0 1 0 0 0 0 0 0 0 0 0
Equity Market Neutral  1 0.006002632 0 0 0 0 1 0 0 0 0 0 0 0 0
Event Driven           1 0.007622368 0 0 0 0 0 1 0 0 0 0 0 0 0
Fixed Income Arbitrage 1 0.004230921 0 0 0 0 0 0 1 0 0 0 0 0 0
Global Macro           1 0.007672368 0 0 0 0 0 0 0 1 0 0 0 0 0
Long/Short Equity      1 0.007759868 0 0 0 0 0 0 0 0 1 0 0 0 0
Merger Arbitrage       1 0.006784868 0 0 0 0 0 0 0 0 0 1 0 0 0
Relative Value         1 0.006701316 0 0 0 0 0 0 0 0 0 0 1 0 0
Short Selling          1 0.004161184 0 0 0 0 0 0 0 0 0 0 0 1 0
Funds of Funds         1 0.005918421 0 0 0 0 0 0 0 0 0 0 0 0 1

The first column corresponds to the constraint of weighted sum should be 1. Second column is a target return constraint. The remaining columns are exactly the one, excluding negative weights. Regarding the help of solve.QP the constraints are called as A^T b>= b_0. The transposed Amatlooks as

> t(Amat)
         Convertible Arbitrage  CTA Global Distressed Securities Emerging Markets Equity Market Neutral Event Driven
                   1.000000000 1.000000000           1.000000000      1.000000000           1.000000000  1.000000000
col.mean           0.006408553 0.006489474           0.007953289      0.008246053           0.006002632  0.007622368
                   1.000000000 0.000000000           0.000000000      0.000000000           0.000000000  0.000000000
                   0.000000000 1.000000000           0.000000000      0.000000000           0.000000000  0.000000000
                   0.000000000 0.000000000           1.000000000      0.000000000           0.000000000  0.000000000
                   0.000000000 0.000000000           0.000000000      1.000000000           0.000000000  0.000000000
                   0.000000000 0.000000000           0.000000000      0.000000000           1.000000000  0.000000000
                   0.000000000 0.000000000           0.000000000      0.000000000           0.000000000  1.000000000
                   0.000000000 0.000000000           0.000000000      0.000000000           0.000000000  0.000000000
                   0.000000000 0.000000000           0.000000000      0.000000000           0.000000000  0.000000000
                   0.000000000 0.000000000           0.000000000      0.000000000           0.000000000  0.000000000
                   0.000000000 0.000000000           0.000000000      0.000000000           0.000000000  0.000000000
                   0.000000000 0.000000000           0.000000000      0.000000000           0.000000000  0.000000000
                   0.000000000 0.000000000           0.000000000      0.000000000           0.000000000  0.000000000
                   0.000000000 0.000000000           0.000000000      0.000000000           0.000000000  0.000000000
         Fixed Income Arbitrage Global Macro Long/Short Equity Merger Arbitrage Relative Value Short Selling
                    1.000000000  1.000000000       1.000000000      1.000000000    1.000000000   1.000000000
col.mean            0.004230921  0.007672368       0.007759868      0.006784868    0.006701316   0.004161184
                    0.000000000  0.000000000       0.000000000      0.000000000    0.000000000   0.000000000
                    0.000000000  0.000000000       0.000000000      0.000000000    0.000000000   0.000000000
                    0.000000000  0.000000000       0.000000000      0.000000000    0.000000000   0.000000000
                    0.000000000  0.000000000       0.000000000      0.000000000    0.000000000   0.000000000
                    0.000000000  0.000000000       0.000000000      0.000000000    0.000000000   0.000000000
                    0.000000000  0.000000000       0.000000000      0.000000000    0.000000000   0.000000000
                    1.000000000  0.000000000       0.000000000      0.000000000    0.000000000   0.000000000
                    0.000000000  1.000000000       0.000000000      0.000000000    0.000000000   0.000000000
                    0.000000000  0.000000000       1.000000000      0.000000000    0.000000000   0.000000000
                    0.000000000  0.000000000       0.000000000      1.000000000    0.000000000   0.000000000
                    0.000000000  0.000000000       0.000000000      0.000000000    1.000000000   0.000000000
                    0.000000000  0.000000000       0.000000000      0.000000000    0.000000000   1.000000000
                    0.000000000  0.000000000       0.000000000      0.000000000    0.000000000   0.000000000
         Funds of Funds
            1.000000000
col.mean    0.005918421
            0.000000000
            0.000000000
            0.000000000
            0.000000000
            0.000000000
            0.000000000
            0.000000000
            0.000000000
            0.000000000
            0.000000000
            0.000000000
            0.000000000
            1.000000000

and the vector b0 seems also to be correct:

> bvec
 [1] 1.000 0.005 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
> 

The question is, why does solve.QP return an infeasible solution?

Upvotes: 1

Views: 524

Answers (1)

Hong Ooi
Hong Ooi

Reputation: 57686

A value of +/-3e-16 is numerically zero, within the limits of floating-point representation. There are basically two nonzero weights in your solution, both of which are positive.

You may be interested in this:
What Every Computer Scientist Should Know About Floating-Point Arithmetic

Upvotes: 1

Related Questions