我想在R中尝试一个均值方差优化的例子,在开始时,我使用了这个简单的例子:
> 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
> 然而,这一解决办法似乎不可行。有两个负数与约束之一相矛盾:
> 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第一列对应于加权和的约束为1,第二列是目标返回约束。其余的列完全相同,不包括负重。对于solve.QP的帮助,这些约束称为A^T b>= b_0。转置的Amat看起来像
> 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向量b0似乎也是正确的:
> 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
> 问题是,为什么solve.QP返回一个不可行的解决方案?
发布于 2014-09-20 10:14:36
在浮点表示范围内,+/-3e-16的数值为零.在你的解中基本上有两个非零的权重,它们都是正的。
你可能会对此感兴趣:
关于浮点算法,每个计算机科学家应该知道什么?
https://stackoverflow.com/questions/25947313
复制相似问题