【发布时间】:2014-09-20 09:28:24
【问题描述】:
我想在 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 会返回一个不可行的解决方案?
【问题讨论】:
标签: r optimization