制約最適化の問題を解決するためにメタヒューリスティックを使用するために、私は、ラムダは、0と1の間の値をとるR.ローカル検索を使用したMarkowitzモデル/ポートフォリオの最適化R
Min
lambda * [sum{i=1 to N}sum{j = 1 to N}w_i*w_i*Sigma_ij] - (1-lambda) * [sum{i=1 to N}(w_i*mu_i)]
subject to
sum{i=1 to N}{w_i} = 1
0 <= w_i <= 1; i = 1,...,N
でNMOF
パッケージを使用して(下記の)基本的なマーコウィッツ平均分散最適化モデルを解決しようとしています、Nは、資産の数です。私は目的関数(OF)でラムダを含める方法を確認していない
library(NMOF)
na <- dim(fundData)[2L]
ns <- dim(fundData)[1L]
Sigma <- cov(fundData)
winf <- 0.0
wsup <- 1.0
m <- colMeans(fundData)
resample <- function(x,...) x[sample.int(length(x),...)]
data <- list(R = t(fundData),
m = m,
na = dim(fundData)[2L],
ns = dim(fundData)[1L],
Sigma = Sigma,
eps = 0.5/100,
winf = winf,
wsup = wsup,
nFP = 100)
w0 <- runif(data$na); w0 <- w0/sum(w0)
OF <- function(w,data){
wmu <- crossprod(w,m)
res <- crossprod(w, data$Sigma)
res <- tcrossprod(w,res)
result <- res - wmu
}
neighbour <- function(w, data){
toSell <- w > data$winf
toBuy <- w < data$wsup
i <- resample(which(toSell), size = 1L)
j <- resample(which(toBuy), size = 1L)
eps <- runif(1) * data$eps
eps <- min(w[i] - data$winf, data$wsup - w[j], eps)
w[i] <- w[i] - eps
w[j] <- w[j] + eps
w
}
algo <- list(x0 = w0, neighbour = neighbour, nS = 5000L)
system.time(sol1 <- LSopt(OF, algo, data))
:(:金融における数値解法と最適化ブックに基づいて)後
は私のコードです。上記のコードには、OFのラムダは含まれていません。私はfor
ループを使用してみましたが、それは、次のエラーが発生しました:
OF <- function(w,data){
lambdaSeq <- seq(.001,0.999, length = data$nFP)
for(lambda in lambdaSeq){
wmu <- crossprod(w,m)
res <- crossprod(w, data$Sigma)
res <- tcrossprod(w,res)
result <- lambda*res - (1-lambda)*wmu
}
}
エラー:誰かがこの点で私を助けることができれば
Local Search.
Initial solution:
| | 0%
Error in if (xnF <= xcF) { : argument is of length zero
Timing stopped at: 0.01 0 0.03
それはいいだろう。
p.s:これは、2次計画法を使用して解決できることも認識しています。これは単なる他の制約を含む開始です。
だから、どうやって内側の 'for'ループを使う予定ですか?今、シーケンスの最後のラムダに到達するまで繰り返します。エラーを起こさなかったとしても、最初のn-1回の繰り返しは実際には何もしないので、私はその点を見ません。あなたはすべての反復または何かの「最小」結果を見つけたいですか? –
@ Hack-R:いいえ、すべての反復の「最小」結果ではありません。私はラムダの異なる値に対して目的関数の最小値を求めたい。 'lambda'の値は0から1の範囲です。 –
' for'ループのすべての反復の 'min'結果とどのように違いますか? 'for'ループには目的関数のコードがすべて含まれています。したがって、OFの最小値をラムダ以上にするには、 'for'ループのすべての反復の' min'があなたが望むものです。とにかく、現在のところ、すべての反復が前の反復を上書きするので、最後の反復の値だけを返します。したがって、 'lambda'も1と同じです。さらに、' for'ループは ' LSopt機能を有する。 –