r 中的 optiSolve 包

optiSolve package in r

我正在尝试最大化投资组合 return 受 5 个限制:

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

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

3.- 权重之和必须为 1

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

5.-所有的权重最多只能是一个

我正在使用 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

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

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

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

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

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

形式的约束

 x'Qx = a

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

x'Qx <= a

很容易(凸),只要 Q 是 positive-semi 确定的。将 x'Qx=a 重写为

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

不幸的是,non-convexity 并没有消失,因为 -Q 不是 PSD。如果我们最大化 return,我们通常只使用 x'Qx <= a 来限制风险而忘记 >= 部分。更流行的是将 return 和风险都放在 objective 中(即标准 mean-variable 投资组合模型)。

在 R 下解决 non-convex 二次问题的可能求解器是 Gurobi。