Как исправить вывод массивов cvxpy? - PullRequest
0 голосов
/ 31 мая 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])

результат = prob.solve () После решения значение w.value имеет вид [[0,02], [0,02], [0,04] ​​...]

Мне нужно добавить больше ограничений, таких как abs (list_final_weights-w)> 0.005, но это будет возможно, если w.value имеет форму массива значений вместо массива массивов. Как я могу исправить эту ошибку?

1 Ответ

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

cvxpy выполняет поэлементные операции для вычитания, если они имеют одинаковую форму. Вы можете преобразовать ваш плоский массив в соответствующую форму, которая нужна решателю - в данном случае это (N, 1) вместо плоского массива формы (N,).

list_final_weights = np.reshape(list_final_weights, [len(list_final_weights), 1])

Тогда вы сможете выполнить вычитание для ограничения:

list_final_weights - w >= 0.005 

Также cvxpy не допускает жестких > или < неравенств. Только <= и >=. https://www.cvxpy.org/tutorial/intro/index.html#constraints

...