【问题标题】:Genetic Algorithm Optimization遗传算法优化
【发布时间】:2013-07-02 19:24:03
【问题描述】:

几周前我问了一个关于如何在 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

虽然上面的 optim 函数工作得很好,但我在想是否可以使用 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 需要额外的参数,所以我正在寻找一些帮助来构建我的问题,以便它能够产生最佳答案。我希望上面的编辑可以澄清事情。

谢谢

【问题讨论】:

  • 请搜索“[r] great reproducible example”并根据投票最多的答案中的说明编辑您的问题。
  • 现在检查上面,我已经改变了我的答案。抱歉含糊不清
  • 试试这个:evalFunc = function(weight) div.ratio(weight, vol=vol, cov.mat=cov.mat)

标签: r optimization genetic-algorithm


【解决方案1】:

这是你需要的:

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. 向量 weightvol 必须匹配长度。

  2. 函数evalFunc 使用单个参数调用,导致其他参数丢失。据我了解,您只想优化weight 向量,保持volcov.mat 固定。

  3. 如果您希望将weight 视为连续变量,请改用rbga

【讨论】:

  • 有限制吗?就像我想将结果权重限制在 0 和 1 或其他区间之间一样?
  • @user1234440,我更新了我的答案,将weight 视为一个连续变量。
猜你喜欢
  • 2015-02-18
  • 2011-06-07
  • 1970-01-01
  • 2021-03-03
  • 2011-05-24
  • 2020-07-08
  • 1970-01-01
  • 2023-03-11
相关资源
最近更新 更多