条件约束
Conditional Constraints
cvxpy 中有条件约束的方法吗,我正在研究一个像这样的简单凸投资组合优化问题。
from cvxpy import *
import numpy as np
np.random.seed(1)
n = 10
Sigma = np.random.randn(n, n)
Sigma = Sigma.T.dot(Sigma)
w = Variable(n)
mu = np.abs(np.random.randn(n, 1))
ret = mu.T*w
risk = quad_form(w, Sigma)
orig_w = [0.15,0.2,0.2,0.2,0.2,0.05,0.0,0.0,0.0,0.0]
lambda_ret = Parameter(sign='positive')
lambda_ret = 5
lambda_risk = Parameter(sign='positive')
lambda_risk = 1
constraints = [sum_entries(w) == 1, w >= 0]
prob = Problem(Maximize(lambda_ret * ret - lambda_risk * risk ),constraints)
prob.solve()
并且我正在尝试引入一个仅适用于特定场景的约束
sum_entries([ w[i]-orig_w[i] if w[i]-orig_w[i] >= 0 else 0 for i in range(n)]) >= some threshold
在这个python伪代码中,我只想控制正的权重变化。
我查看了 cvxpy 函数,但似乎无法做到这一点。
一般来说,通常需要手动制定和 integer-programming 方法。在我所知道的任何 modelling-tool 中都不支持 if-else 描述。
你的限制条件:
cvx.sum_entries([ w[i]-orig_w[i] if w[i]-orig_w[i] >= 0 else 0 for i in range(n)]) >= some threshold
相当于:
cvx.sum_entries([ cvx.pos(w[i]-orig_w[i]) for i in range(n)]) >= some threshold
这里使用了cvxpy的函数pos:
pos(x) <-> max{x,0} x inR
(我没有检查 DCP-compatibility 也没有检查语法;将此作为一般提示)
备注:
cvx.sum_entries([ cvx.pos(w[i]-orig_w[i]) for i in range(n)]) >= some threshold
对于您通常在 cvxpy 中所做的事情看起来很不自然:
cvx.sum_entries(cvx.pos(w-orig_w)) >= some threshold
(矢量化形式:性能更高,通常更清晰)
cvxpy 中有条件约束的方法吗,我正在研究一个像这样的简单凸投资组合优化问题。
from cvxpy import *
import numpy as np
np.random.seed(1)
n = 10
Sigma = np.random.randn(n, n)
Sigma = Sigma.T.dot(Sigma)
w = Variable(n)
mu = np.abs(np.random.randn(n, 1))
ret = mu.T*w
risk = quad_form(w, Sigma)
orig_w = [0.15,0.2,0.2,0.2,0.2,0.05,0.0,0.0,0.0,0.0]
lambda_ret = Parameter(sign='positive')
lambda_ret = 5
lambda_risk = Parameter(sign='positive')
lambda_risk = 1
constraints = [sum_entries(w) == 1, w >= 0]
prob = Problem(Maximize(lambda_ret * ret - lambda_risk * risk ),constraints)
prob.solve()
并且我正在尝试引入一个仅适用于特定场景的约束
sum_entries([ w[i]-orig_w[i] if w[i]-orig_w[i] >= 0 else 0 for i in range(n)]) >= some threshold
在这个python伪代码中,我只想控制正的权重变化。
我查看了 cvxpy 函数,但似乎无法做到这一点。
一般来说,通常需要手动制定和 integer-programming 方法。在我所知道的任何 modelling-tool 中都不支持 if-else 描述。
你的限制条件:
cvx.sum_entries([ w[i]-orig_w[i] if w[i]-orig_w[i] >= 0 else 0 for i in range(n)]) >= some threshold
相当于:
cvx.sum_entries([ cvx.pos(w[i]-orig_w[i]) for i in range(n)]) >= some threshold
这里使用了cvxpy的函数pos:
pos(x) <-> max{x,0} x inR
(我没有检查 DCP-compatibility 也没有检查语法;将此作为一般提示)
备注:
cvx.sum_entries([ cvx.pos(w[i]-orig_w[i]) for i in range(n)]) >= some threshold
对于您通常在 cvxpy 中所做的事情看起来很不自然:
cvx.sum_entries(cvx.pos(w-orig_w)) >= some threshold
(矢量化形式:性能更高,通常更清晰)