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
有人知道如何使用前面提到的所有约束来解决这个最大化问题,或者告诉我我做错了什么?我真的很感激,因为结果似乎没有考虑到这些限制。谢谢!
- 你的
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,所以我认为 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。
我正在尝试最大化投资组合 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
有人知道如何使用前面提到的所有约束来解决这个最大化问题,或者告诉我我做错了什么?我真的很感激,因为结果似乎没有考虑到这些限制。谢谢!
- 你的
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,所以我认为 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。