我试着用CVXR软件包建立简单的短期销售投资组合模型。下面是众所周知的目标函数(预期收益减去预期收益的sd与已知的teta).但R返回如下:“construct_intermediate_chain中的错误(object,candidate_solvers,gp = gp):问题不遵循DCP规则。”我试图在下面的代码中修复这个问题,但是没有什么有用的。同样,这种类型的obj函数是凹形的。同时,还可以方便地生成凸函数和求最小值。错误在这种情况下也不会消失。请您解释一下错误在哪里,可能的解决方案是什么。
library(CVXR)
n = 3
w = Variable(n)
c = matrix(1, nrow = 3, ncol = 3)
mu = matrix(1, ncol = 3, nrow = 1)
m1 = rnorm(100)
m2 = rnorm(100)
m3 = rnorm(100)
mu[1, 1] = mean(m1)
mu[1, 2] = mean(m2)
mu[1, 3] = mean(m3)
c[1, 2] = cov(m1, m2)
c[1, 3] = cov(m1, m3)
c[2, 1] = cov(m1, m2)
c[2, 3] = cov(m2, m3)
c[3, 1] = cov(m1, m3)
c[3, 2] = cov(m2, m3)
c[1, 1] = cov(m1, m1)
c[2, 2] = cov(m2, m2)
c[3, 3] = cov(m3, m3)
teta = 0.5
obj1 = mu %*% w - teta * sqrt(quad_form(w, c))
constr <- list(sum(w) == 1)
pro <- Problem(Maximize((obj)), constr)
sol <- solve(pro)
sol$w发布于 2021-10-06 22:42:18
问题是sqrt(quad_form(w, c)):CVXR并不认为它是凸的,尽管它是凸的。您需要计算矩阵c的Cholesky分解,并使用Frobenius范数中的上三角。它相当于sqrt(quad_form(w, c))。
我是说,所以
u = chol(c)
norm(u %*% w, "2")
obj1将四边形的平方根替换为norm(u %*% w, "2")
要获得优化后的解决方案,必须使用sol$getValue(w)
您的代码已更新:
> library(CVXR)
> n = 3
> w = Variable(n)
> c = matrix(1, nrow = 3, ncol = 3)
> mu = matrix(1, ncol = 3, nrow = 1)
>
> m1 = rnorm(100)
> m2 = rnorm(100)
> m3 = rnorm(100)
> mu[1, 1] = mean(m1)
> mu[1, 2] = mean(m2)
> mu[1, 3] = mean(m3)
>
> c[1, 2] = cov(m1, m2)
> c[1, 3] = cov(m1, m3)
> c[2, 1] = cov(m1, m2)
> c[2, 3] = cov(m2, m3)
> c[3, 1] = cov(m1, m3)
> c[3, 2] = cov(m2, m3)
> c[1, 1] = cov(m1, m1)
> c[2, 2] = cov(m2, m2)
> c[3, 3] = cov(m3, m3)
>
> teta = 0.5
> u = chol(c)
> obj1 = mu %*% w - teta * norm(u %*% w, "2")
> constr <- list(sum(w) == 1)
> pro <- Problem(Maximize((obj1)), constr)
> sol <- solve(pro)
> sol$getValue(w)这就是我查到的:
> sol$getValue(w)
[,1]
[1,] -0.07160006
[2,] 0.44897448
[3,] 0.62261508https://stackoverflow.com/questions/66634862
复制相似问题