我试图在5个约束条件下最大化投资组合回报:
1.-一定程度的投资组合风险
2.-与上述相同,但oposite符号(我需要风险正好是那个数字(
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
有人知道如何在前面提到的所有约束条件下解决这个最大化问题,或者告诉我我做错了什么?我真的很感激,因为结果似乎没有考虑到限制。谢谢
- 您的
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。
- 若要仅使用不等式来创建不等式约束,您需要两次相同的约束,但系数上的符号和两者之间的右侧值相反(例如:2x<=4和-2x<=-4组合以使约束为2*x==4(。在上面的编辑中,您为
val
参数提供了一个不同的值,因此这两个约束不会结合起来形成相等约束,除非它们匹配,但符号相反,如下所示
restriccion1_neg <- quadcon(Q = -matriz_de_varcov, dir = "<=", val = -0.04237972)
- 我不确定,因为我在包文档中找不到精度信息,但那些"否定的";x矢量中的值可能是由于舍入引起的。它们很小,实际上是0,所以我认为非负性约束功能正常
restriccion_nonnegativa <- lbcon(rep(0,length(vector_de_retornos)))
形式的约束
x'Qx = a
是非凸。(更一般地说:任何非线性等式约束都是非凸的(。非凸问题比凸问题更难解决,需要专门的全局求解器。对于凸问题,有相当多的求解器可用。对于非凸问题,情况并非如此。大多数投资组合模型被公式化为凸QP(二次规划,即风险——二次项——在目标中(或凸QCP/SOCP问题(约束中的二次项,但以凸的方式(。因此,限制
x'Qx <= a
是容易的(凸的(,只要Q是半正定的。将x'Qx=a
重写为
x'Qx <= a
-x'Qx <= -a
不幸的是,并没有使非凸性消失,因为-Q
不是PSD。如果我们是最大化回报,我们通常只使用x'Qx <= a
来限制风险,而忽略了>=部分更流行的是将收益和风险都放在目标中(这是标准的均值-变量投资组合模型(。
Gurobi是求解R下非凸二次型问题的一个可能的求解器。