Как написать сложные ограничения в cvxpy? - PullRequest
0 голосов
/ 30 мая 2019

Я пытаюсь написать задачу оптимизации портфеля, используя cvxpy.

initial_weights = [0.045, 0.035, 0.024, 0.028...]
rets = (np.log(data/data.shift(1))
w = cvx.Variable(38)
ret = np.sum(rets.mean()*w)*252
prob = cvx.Problem(cvx.Maximize(ret), [cvx.sum_entries(w)==1, w>0.02, w<0.06])
result = prob.solve()

После решения значение w.value имеет вид [[0,02], [0,02], [0,04] ​​...]

Я хочу добавить ограничение, которое работает примерно так:

for i in range(len(initial_weights)):
    abs(initial_weights[i]-w[1][i])>0.005 

Есть ли у кого-нибудь предложения о том, как включить это в ограничения?

1 Ответ

0 голосов
/ 30 мая 2019

Если вы хотите добавить ограничения в цикл for, этот ответ , кажется, обеспечивает решение.

Меня также удивляет, что возвращаемое значение является массивом массивов, а не массивом значений. Если вы гарантируете, что размер rets.mean() правильный, то w должен быть простым массивом с 38 значениями. В этом случае ваше ограничение упрощается до abs(initial_weights-w)>0.005

...