3

現在、以下の機能を最小限に抑えるために、Simulated Annealing パッケージ GenSA を使用しようとしています。

efficientFunction <- function(v) {
  t(v)  %*% Cov_Mat   %*%  v
 }

ここで、Cov_Mat は 4 つのアセットから取得された共分散行列で、v は次元 4 の重みベクトルです。

この方法でマーコウィッツの資産配分アプローチを解決しようとしています。すべての係数の合計が 1 に等しくなければならないなどの数学的制約を導入する方法を知りたいです。

sum(v) = 1

さらに、GenSA関数に依存するつもりなので、制約で次のようなものを使用したいと思います:

v <- c(0.25, 0.25, 0.25, 0.25)
dimension <- 4
lower <- rep(0, dimension)
upper <- rep(1, dimension)

out <- GenSA(v, lower = lower, upper = upper, fn = efficientFunction)

私はこの論文で見つけました:http ://citeseerx.ist.psu.edu/viewdoc/download ?doi=10.1.1.97.6091&rep=rep1&type=pdfシミュレーテッドアニーリングアルゴリズム内でそのような制約を処理する方法ですが、わかりませんRでどのように実装できますか。

アドバイスをいただければ幸いです。SO を使用するのは初めてなので、質問の仕方が間違っている場合は遠慮なく教えてください。

4

2 に答える 2

4

考えられるアプローチは、いわゆるラグランジュ乗数を利用することです ( http://en.wikipedia.org/wiki/Lagrange_multiplierを参照)。たとえば、

efficientFunction <- function(v) {
  lambda <- 100
  t(v)  %*% Cov_Mat   %*%  v + lambda * abs( sum(v) - 1 )
}

、その結果、目的関数を最小化するためにefficientFunction、結果のパラメーターもペナルティ項を最小化しますlambda * abs( sum(v) - 1 )。ラグランジュ乗数lambdaは任意ですが、十分に高いレベルに設定されています。

于 2014-05-23T13:39:21.363 に答える
1

したがって、関数自体には、設定できる制約がないようです。ただし、関数を再パラメーター化して制約を強制することができます。どうですか

efficientFunction <- function(v) {
    v <- v/sum(v)
    t(v) %*% Cov_Mat %*%  v
}

ここでは、v合計が 1 になるように の値を正規化します。次に、出力パラメータを取得したら、同じ変換を実行する必要があります。

out <- GenSA(v, lower = lower, upper = upper, fn = efficientFunction)
out$par/sum(out$par)
于 2014-05-22T18:37:20.917 に答える