-1

我试图在 5 个约束条件下最大化投资组合回报:

1.- 一定程度的投资组合风险

2.- 与上面相同,但符号相反(我需要风险正好是那个数字)

3.- 权重之和必须为 1

4.-所有权重必须大于或等于cero

5.- 所有权重最多只能为 1

我正在使用 optiSolve 包,因为我没有找到任何其他允许我编写此问题的包(或者至少我了解如何使用它)。

我这里有三个大问题,第一个是生成的权重向量总和大于 1,第二个问题是我不能在二次约束中声明t(w) %*% varcov_matrix %*% w == 0因为它只允许“<=”,最后我不知道如何设置约束以仅获得正面权重

vector_de_retornos <- rnorm(5)  
matriz_de_varcov <- matrix(rnorm(25), ncol = 5)

library(optiSolve)

restriccion1 <- quadcon(Q = matriz_de_varcov, dir = "<=", val = 0.04237972)

restriccion1_neg <- quadcon(Q = -matriz_de_varcov, dir = "<=",
                            val = -mean(limite_inf, limite_sup))

restriccion2 <- lincon(t(vector_de_retornos),
                       d=rep(0, nrow(t(vector_de_retornos))), 
                       dir=rep("==",nrow(t(vector_de_retornos))),
                       val = rep(1, nrow(t(vector_de_retornos))),
                       id=1:ncol(t(vector_de_retornos)),
                       name = nrow(t(vector_de_retornos)))
restriccion_nonnegativa <- lbcon(rep(0,length(vector_de_retornos)))

restriccion_positiva <- ubcon(rep(1,length(vector_de_retornos)))

funcion_lineal <- linfun(vector_de_retornos, name = "lin.fun")
funcion_obj <- cop(funcion_lineal, max = T, ub = restriccion_positiva,
                   lc = restriccion2, lb = restriccion_nonnegativa, restriccion1,
                   restriccion1_neg)
porfavor_funciona <- solvecop(funcion_obj, solver = "alabama")

> porfavor_funciona$x
            1             2             3             4             5 
-3.243313e-09 -4.709673e-09  9.741379e-01  3.689040e-01 -1.685290e-09 

> sum(porfavor_funciona$x)
[1] 1.343042

有人知道如何用前面提到的所有约束来解决这个最大化问题,或者告诉我我做错了什么?我真的很感激,因为结果似乎没有考虑到约束。谢谢!

4

2 回答 2

0
  1. restriccion2使 x 的加权和为 1,如果您还想确保 x 的常规和为 1,您可以修改约束如下:
restriccion2 <- lincon(rbind(t(vector_de_retornos),
                             # make a second row of coefficients in the A matrix
                             t(rep(1,length(vector_de_retornos)))),
                       d=rep(0,2), # the scalar value for both constraints is 0
                       dir=rep('==',2), # the direction for both constraints is '=='
                       val=rep(1,2), # the rhs value for both constraints is 1
                       id=1:ncol(t(vector_de_retornos)), # the number of columns is the same as before
                       name= 1:2)

如果您只希望常规总和为 1 而不是加权和,您可以lincon按照您定义的那样替换函数中的第一个参数,这只t(rep(1,length(vector_de_retornos)))会将常规总和限制x为 1。

  1. 要仅使用不等式进行不等式约束,您需要两次相同的约束,但系数上的符号相反,并且两者之间的右侧值(例如:2 x <= 4 和 -2 x <= -4 结合起来以使约束 2*x == 4)。在您上面的编辑中,您为参数提供了不同的值,val因此这两个约束不会组合成等式约束,除非它们匹配,但下面的相反符号除外。

restriccion1_neg <- quadcon(Q = -matriz_de_varcov, dir = "<=", val = -0.04237972)

  1. 我不确定,因为我在包文档中找不到精度信息,但 x 向量中的那些“负”值可能是由于四舍五入造成的。它们是如此之小,实际上是 0,所以我认为非负性约束运行正常。

restriccion_nonnegativa <- lbcon(rep(0,length(vector_de_retornos)))

于 2020-10-16T00:23:12.290 回答
0

形式的约束

 x'Qx = a

是非凸的。(更一般地说:任何非线性等式约束都是非凸的)。非凸问题比凸问题更难解决,需要专门的全局求解器。对于凸问题,有相当多的求解器可用。对于非凸问题,情况并非如此。大多数投资组合模型被表述为凸 QP(二次规划,即风险——二次项——在目标中)或凸 QCP/SOCP 问题(约束中的二次项,但以凸方式)。所以,约束

x'Qx <= a

很容易(凸),只要 Q 是半正定的。重写x'Qx=a

x'Qx <= a
-x'Qx <= -a

-Q不幸的是,不会像 PSD那样使非凸性消失。如果我们要最大化回报,我们通常只使用x'Qx <= a限制风险而忘记 >= 部分。更流行的是将回报和风险都放在目标中(即标准的均值变量投资组合模型)。

在 R 下求解非凸二次问题的可能求解器是 Gurobi。

于 2020-10-17T19:05:06.033 回答