Я строю термин риска в задаче квадратичной оптимизации (QP), используя CVXPY, и я изо всех сил пытаюсь объединить выражения с ковариационной матрицей, используя quad_form
.
from cvxpy import Variable, quad_form
from numpy import identity
from pandas import Series, DataFrame
assets = ['AAA', 'BBB', 'CCC', 'DDD']
optimal = Series(1 / 4, assets)
covariances = DataFrame(identity(4) * 0.20, index=assets, columns=assets)
covariances.iloc[2, 3] += 0.01
covariances.iloc[3, 2] = covariances.iloc[2, 3]
target = Series([Variable(name=asset) for asset in assets], index=assets)
difference = target - optimal
active_variance = quad_form(difference.values, covariances.values)
Я получаю следующую ошибку:
ValueError: setting an array element with a sequence.
Я могу просто сделать расчет в пандах, но тогда CVXPY не знает, что выражение выпукло.
active_variance = difference.T.dot(covariances).dot(difference)
print(active_variance.curvature)
Эта проблема связана с моим предыдущий вопрос с docplex, хотя решение здесь не работает, поскольку docplex не требует, чтобы проблема была выпуклой, но CVXPY требует. Есть ли правильная форма в CVXPY?
quad_form
здесь имеет смысл только в том случае, еслиdifference
будет вектором переменных решения (или констант). Из-за того, что вы используете панды (я не уверен, намеренно это или нет) здесь,difference
становится нечисловым / dtype=object, который никогда не может использоваться в cvxpy. Подсказка:AAA + -0.25
. В общем, я бы не рекомендовал смешивать pandas и cvxpy, не зная толком обо всех внутренностях: скрытых приведениях и прочем. - person sascha   schedule 31.01.2021