3

我目前正在尝试使用模拟退火包 GenSA 以最小化以下功能:

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

其中 Cov_Mat 是从 4 个资产获得的协方差矩阵,v 是维度为 4 的权重向量。

我正在尝试以这种方式解决 Markowitz 资产分配方法,我想知道如何引入数学约束,例如所有系数的总和必须等于 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 回答