几周前,我问了一个有关如何在R(Optimizing for Vector Using Optimize 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需要额外的参数,因此执行上述操作似乎会产生错误,因此我正在寻求一些有助于结构化问题的帮助,以便能够产生最佳答案。我希望上面的编辑可以使事情变得清晰。
谢谢
最佳答案
这是您需要的:
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))
(请参见上面的第一行和最后一行)。
问题是:
weight
和vol
必须匹配长度。 evalFunc
使用单个参数调用,导致其他参数丢失。据我了解,您只想在weight
向量中进行优化,保持vol
和cov.mat
固定不变。 weight
视为连续变量,请改用rbga
。 关于r - 遗传算法优化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17476203/