7

Rで最適化を行う方法について数週間前に質問しました(最適化Rを使用したベクトルの最適化)。R での基本的な最適化を適切に把握したので、解を求めるために GA の採用を開始したいと思います。

与えられた目的関数:

div.ratio <- function(weight, vol, cov.mat){
  weight <- weight / sum(weight)
  dr <- (t(weight) %*% vol) / (sqrt(t(weight) %*% cov.mat %*% (weight)))  
  return(-dr)
}

genalg パッケージ、特に「rbga.bin」関数を最適化するために使用しています。しかし問題は、複数のパラメーターを渡すことができないように見えることです。つまり、vol と cov.mat を渡すことはできません。私は何かを見逃していますか、これを間違って理解していますか?

編集: genalg パッケージには、私が使用している rbga.bin という関数があります。

前の質問の簡単なコードを次に示します。

rm(list=ls())
require(RCurl)
sit = getURLContent('https://github.com/systematicinvestor/SIT/raw/master/sit.gz',     binary=TRUE, followlocation = TRUE, ssl.verifypeer = FALSE)
con = gzcon(rawConnection(sit, 'rb'))
source(con)
close(con)
load.packages('quantmod')


data <- new.env()

tickers<-spl("VTI,VGK,VWO,GLD,VNQ,TIP,TLT,AGG,LQD")
getSymbols(tickers, src = 'yahoo', from = '1980-01-01', env = data, auto.assign = T)
for(i in ls(data)) data[[i]] = adjustOHLC(data[[i]], use.Adjusted=T)

bt.prep(data, align='remove.na', dates='1990::2013')

prices<-data$prices[,-10]  
ret<-na.omit(prices/mlag(prices) - 1)
vol<-apply(ret,2,sd)
cov.mat<-cov(ret)

out <- optim(par     = rep(1 / length(vol), length(vol)),  # initial guess
         fn      = div.ratio,
         vol     = vol,
         cov.mat = cov.mat,
         method  = "L-BFGS-B",
         lower   = 0,
         upper   = 1)

opt.weights <- out$par / sum(out$par) #optimal weights

上記の最適化関数は問題なく機能しますが、これを GA アルゴリズムを使用して再現できないかと考えていました。したがって、将来、複数の目的を検索する場合、GA と比較してこれをより速く行うことができます。(速いかどうかはわかりませんが、これは調べるためのステップです)

GAmodel <- rbga.bin(size = 7, #genes
popSize = 200, #initial number of chromosomes
iters = 100, #number of iterations
mutationChance = 0.01, #chance of mutation
evalFunc = div.ratio) #objective function

div.ratio には追加のパラメーターが必要なため、上記を実行するとエラーが発生するように思われるため、最適な答えを生成できるように問題を構造化するための助けを探しています。上記の編集が物事を明確にすることを願っています。

ありがとう

4

1 に答える 1

6

これはあなたが必要とするものです:

GAmodel <- rbga(stringMin=rep(0, length(vol)), stringMax=rep(1, length(vol)),
popSize = 200,
iters = 100,
mutationChance = 0.01,
evalFunc = function(weight) div.ratio(weight, vol=vol, cov.mat=cov.mat))

(上記の最初と最後の行を参照してください)。

問題は次のとおりです。

  1. ベクトルweightであり、vol長さが一致する必要があります。

  2. 関数evalFuncが 1 つのパラメーターで呼び出されるため、他のパラメーターが失われます。weight私が理解しているように、ベクトルのみを最適化し、固定して維持volcov.matたいと考えています。

  3. weight連続変数として扱いたい場合は、rbga代わりに使用してください。

于 2013-07-07T04:10:58.227 に答える