4

R とポートフォリオの最適化を初めて使用します。資産番号 3 と 4 の最小ウェイトがそれぞれ 0.35 で、7 つの資産すべての合計が 1 になるように、7 つの資産を持つポートフォリオを最適化しようとしています。以下は、私が試したコードです。

library(quadprog)
dmat <- cov(dr) #dr stores the daily return of the 7 assets and is a timeSeries object
dvec <- colMeans(dr)
c1 <- c(0,0,1,0,0,0,0)
c2 <-  c(0,0,0,1,0,0,0)
amat <- t(rbind(matrix(1, ncol = ncol(dmat)), c1, c2)) #used transpose because earlier when I didn't use the transpose I got an error saying amat and dvec are not compatible
bvec <- matrix(c(1,0.35, 0.35), nrow =3)
meq <- 1
sol <- solve.QP(dmat, dvec, amat, bvec, meq)

上記のコードから得られる答えは次のとおりです。

$solution
[1] -0.01619018 -2.10640140  0.35000000  0.35000000 -0.82522310  1.27499728  1.97281741

$value
[1] -0.0007364101

$unconstrained.solution
[1]  0.026872891 12.595238193 -0.256430652  0.008918392  0.743618974  2.212816019  3.749097189

$iterations
[1] 4 0

$Lagrangian
[1] 0.0002874682 0.0002846590 0.0003015167

$iact
[1] 1 3 2

ソリューションには 1 を超える 2 つのアセットの重みがあるため、Amat または bvec または meq で間違いを犯したに違いありません。しかし、その間違いが何であるかを理解することはできません。

この問題に取り組むためにこれらの行列を構築する方法について誰かが私を案内してもらえますか? 助けてくれてありがとう。

4

1 に答える 1

2

あなたの答えの合計は 1 ですが、一部の重みが 1 より大きくなったのは、重みが正になるように制限しなかったためです。それが必要な場合は、変数ごとに 1 つの制約を追加する必要があります。これは機能します:

dr <- matrix(runif(100*7), 100, 7) # made up data for this example
n <- ncol(dmat)
dmat <- cov(dr)
dvec <- colMeans(dr)
c1 <- c(0,0,1,0,0,0,0)
c2 <-  c(0,0,0,1,0,0,0)
amat <- t(rbind(matrix(1, ncol = n), c1, c2, diag(n)))
bvec <- c(1, 0.35, 0.35, rep(0, n))
meq <- 1
solve.QP(dmat, dvec, amat, bvec, meq)
# $solution
# [1] 0.0000000  0.0291363  0.3500000  0.4011211  0.0000000
# [6] 0.0000000  0.2197425
# [...]

ショートの可能性についてのコメントに続いて、変数を-1と1で制限する必要があるように聞こえます。次に、次を使用します。

amat <- t(rbind(matrix(1, ncol = n), c1, c2, diag(n), -diag(n)))
bvec <- c(1, 0.35, 0.35, rep(-1, n), -rep(1, n))
solve.QP(dmat, dvec, amat, bvec, meq)
# $solution
# [1] -0.51612776  0.30663800  0.35000000  0.54045253 -0.14679397
# [6] 0.02342572  0.44240548
# [...]
于 2013-05-15T11:35:43.853 に答える