[R] [R言語] [2次計画法] [2次計画問題] [非線形計画法] [数理計画法] [最適化]
2次計画法の典型的な例として、3資産を組み合わせてリスクを最小にするようなポートフォリオの各資産のウエイトを求めてみましょう.
3資産を資産A・資産B・資産Cとします.各資産の例えば月次のリターンを
資産A : 3%、-1.5%、1%、 7%、4%
資産B : -2%、 1.5%、7%、 8%、3%
資産C : 4%、 8.5%、3%、-7%、6%
とします.
各資産のウエイトですからそれをWA、WB、WCと置き、また各資産は必ずロングポジションで保有することにすると、制約条件は
WA+WB+WC = 1.0
WA ≧ 0.0
WB ≧ 0.0
WC ≧ 0.0
となります.1番目の制約条件が、等式になっています.
それではRで各変数を設定していきましょう.
目的関数はWA、WB、WCで構成されるポートフォリオのリスクですからまずは共分散行列を求めなければなりません.
retA <- c(0.03,-0.015,0.01,0.07,0.04) #資産Aのリターンの系列
retB <- c(-0.02,0.015,0.07,0.08,0.03) #資産Bのリターンの系列
retC <- c(0.04,0.085,0.03,-0.07,0.06) #資産Cのリターンの系列
ret <- cbind(retA,retB,retC)
C <- cov(ret)
C
retA retB retC
retA 0.0010200 0.0004875 -0.0015475
retB 0.0004875 0.0016750 -0.0015750
retC -0.0015475 -0.0015750 0.0035050
Cをそのまま使っても良いのですがDmatに代入しておきます.
Dmat <- C
目的関数に1次の項はありませんので
dvec <- c(0,0,0)
を設定します.
制約条件の左辺から
## WA+WB+WC → (1,1,1)
## WA → (1,0,0)
## WB → (0,1,0)
## WC → (0,0,1)Amat <- cbind(c(1,1,1), c(1,0,0), c(0,1,0), c(0,0,1))
Amat
[,1] [,2] [,3] [,4]
[1,] 1 1 0 0
[2,] 1 0 1 0
[3,] 1 0 0 1
制約条件の右辺から
bvec <- c(1,0,0,0)
です.
ここで1番目の制約条件だけが等式制約であることを思い出してください.ですのでmeq引数に1をセットしてsolve.QPを実行します.
res <- solve.QP(Dmat, dvec, Amat, bvec, meq=1, factorized=FALSE)
結果を見てみます.
res
$solution
[1] 0.4624505 0.2148457 0.3227038$value
[1] 3.852634e-05$unconstrained.solution
[1] 0 0 0$iterations
[1] 2 0$Lagrangian
[1] 7.705267e-05 0.000000e+00 0.000000e+00 0.000000e+00$iact
[1] 1
$solutionが求めたい変数の結果ですので、これがウエイトになっています.合計すると1になっていて制約条件をちゃんと満たしていますね.
sum(res$solution)
[1] 1
これで、これらの資産のリスクが最小になるウエイトを求めることができました.