Проблема конвергенции с использованием SciPy для оптимизации портфеляPython

Программы на Python
Ответить
Anonymous
 Проблема конвергенции с использованием SciPy для оптимизации портфеля

Сообщение Anonymous »

Я использую scipy.optimize.minimize с алгоритмом доверия-constr для запуска оптимизации. Цель вполне стандартная: оптимизация весов w портфеля при некоторых ограничениях, где w0 — это веса эталонного портфеля.
Это в рамках перехода от Matlab и его оптимизатора fmincon к Python. Итак, я провожу оптимизацию для каждого решателя и сравниваю результаты. С matlab fmincon проблем обычно не возникает. В каждом случае допуск был установлен на 1e-12.
Функция для минимизации имеет форму fun = -(signal @ x) с якобианом jac = -signal и гессианским hess = np.zeros((len(signal), len(signal)). Здесь x представляет собой массив весов.
Существуют как границы, так и ограничения. (линейные и нелинейные).
Линейное ограничение просто утверждает, что сумма весов должна равняться 1:

LinearConstraint(np.ones((1, w0.size)), lb=1, ub=1,
keep_feasible=False)

Ограничения утверждают, что большинство весов допускается наклон на +/-0,03 от эталонных значений, в то время как некоторые из них привязаны к их эталонному значению. Например, если эталонное значение равно w0 = np.array([0.1, 0.2, 0.15, 0.05, 0.3, 0.2]), мы могли бы иметь:

lb = np.array([0.1 - 0.03, 0.2, 0.15 - 0.03, 0.05 - 0.03, 0.3, 0.2 - 0.03])
ub = np.array([0.1 + 0.03, 0.2, 0.15 + 0.03, 0.05 - 0.03, 0.3, 0.2 + 0.03])

=> веса в индексах [0, 2, 3, 5] можно наклонять на +/- 0,03, тогда как веса в индексах [1, 4] фиксируются на опорном значении.
Нелинейное ограничение имеет функцию вида fun = (x-w0) @ covariance_matrix @ (x-w0) с его якобианом jac = 2 * (covariance_matrix @ (x-w0)) и гессианским методом ub конечно и lb = -np.inf для определения одностороннего ограничения.
Наконец, начальное предположение x0 является опорным значением w0.
Для моего теста я исправьте границы и линейное ограничение, затем запустите последовательную оптимизацию, одновременно уменьшая нелинейное ограничение ub. Для первых двух значений ub matlab fmincon и scipytrust-constr возвращают очень похожие результаты (они равны с абсолюцией/относительным допуском 1e-13... Однако в какой-то момент matlab fmincon продолжает сходиться, но scipytrust-constr этого не делает, и я едва понимаю, почему, поскольку я не думаю, что проблема очень серьезна). Кроме того, первоначальное предположение w0 всегда удовлетворяет всем ограничениям и границам. Итак, хотя это и не хорошее решение в том смысле, что оно не минимизирует целевую функцию, не должно ли оно все же быть решением?
Чтобы попытаться немного лучше понять, что происходит, я добавил обратный вызов в функцию минимизации, позволяющую сохранять все промежуточные результаты и отображать их:
Изображение

Я попробовал несколько вещей:
  • Использовал результаты fmincon в качестве начального предположения x0 (строка графика №6), затем сходится после некоторой итерации.
  • Пытался установить Keep_feasible = True для границ и линейного ограничения и только для границ (строка графика). #6 и #7). Затем сходится, но с очень небольшой оптимизацией целевой функции.
Одно ясно, что в каждом случае резкое падение радиуса доверительной области приводит к (примерно) плоской эволюции значений как оптимальности, так и нарушений ограничений для оставшихся итераций.
Я не понимаю, что происходит и почему она не сходится. Мне кажется, что задача поставлена правильно, что подтверждается тем, что. результаты оптимизации с более расслабленным ub для нелинейного ограничения соответствуют значениям matlab fmincon. Я знаю, что Trust-constr допускает другие входные аргументы, такие как Initial_tr_radius, Initial_constr_penalty и т. д., но я наивно полагал, что в моем случае вполне подойдет использование значения по умолчанию.
Я открыт для использования другого алгоритма, кроме Trust-constr, если необходимо, но я также хотел бы понять, что происходит.

Подробнее здесь: https://stackoverflow.com/questions/798 ... timization
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»