gpt4 book ai didi

python - 条件约束

转载 作者:行者123 更新时间:2023-12-01 09:34:09 34 4
gpt4 key购买 nike

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 函数,但似乎没有什么能够做到这一点。

最佳答案

一般来说,通常需要手动公式和整数编程方法。据我所知,任何建模工具都不支持 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 兼容性或语法;将此作为一般提示)

备注:

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

(矢量化形式:性能更高,通常更清晰)

关于python - 条件约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49681267/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com