我正在使用 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)
orig_weight = [0.15,0.25,0.15,0.05,0.20,0,0.1,0,0.1,0]
w = Variable(n)
mu = np.abs(np.random.randn(n, 1))
ret = mu.T*w
lambda_ = Parameter(sign='positive')
lambda_ = 5
risk = quad_form(w, Sigma)
constraints = [sum_entries(w) == 1, w >= 0, sum_entries(abs(w-orig_weight)) <= 0.750]
prob = Problem(Maximize(ret - lambda_ * risk), constraints)
prob.solve()
print 'Solver Status : ',prob.status
print('Weights opt :', w.value)
我限制完全投资,只做多,营业额<= 75%。但是,我想将营业额用作“软”约束,因为求解器将尽可能少地使用但尽可能多地使用,目前求解器将几乎完全最大化营业额。
我基本上想要这样的东西,它是凸的并且不违反 DCP 规则
sum_entries(abs(w-orig_weight)) >= 0.05
我认为这应该设置一个最小阈值(此处为 5%),然后使用尽可能多的营业额,直到找到可行的解决方案。
我尝试将我的目标函数重写为
prob = Problem(Maximize(lambda_ * ret - risk - penalty * max(sum_entries(abs(w-orig_weight))+0.9,0)) , constraints)
其中惩罚是例如2,我的约束对象仍然看起来像
constraints = [sum_entries(w) == 1, w >= 0, sum_entries(abs(w-orig_weight)) <= 0.9]
我从未使用过软约束,任何解释都将不胜感激。