#python #scipy #mathematical-optimization #nonlinear-optimization
#python #scipy #математическая оптимизация #нелинейная оптимизация
Вопрос:
Я пытаюсь максимизировать коэффициент Шарпа с помощью scipy.minimize
Я делаю это для поиска линии рынка безопасности CAPM
Итак, у меня есть уравнение:
Необязательно (если короткие позиции не разрешены):
0″/>
Итак, я пытаюсь решить эту проблему:
def target_func(x, cov_matix, mean_vector, virtual_mean):
f = float(-(x.dot(mean_vector) - virtual_mean) / np.sqrt(x.dot(cov_matix).dot(x.T)))
return f
def optimal_portfolio_with_virtual_mean(profits, virtual_mean, allow_short=False):
x = np.zeros(len(profits))
mean_vector = np.mean(profits, axis=1)
cov_matrix = np.cov(profits)
cons = ({'type': 'eq',
'fun': lambda x: np.sum(x) - 1})
if not allow_short:
bounds = [(0, None,) for i in range(len(x))]
else:
bounds = None
minimize = optimize.minimize(target_func, x, args=(cov_matrix, mean_vector, virtual_mean,), bounds=bounds,
constraints=cons)
return minimize
Но я всегда получаю Success: False (превышен лимит итерации). Я попытался установить параметр maxiter = 10000, но это не помогло.
Я буду благодарен за любую помощь
PS Я использую python 2.7
Комментарии:
1. В качестве первого шага для отладки: добавьте
options={'disp': True}
вoptimize.minimize
функцию и опубликуйте весь результат. Кстати: вы установили переменную maxiter в качестве dict-entry, как в приведенном выше примере disp? Это способ сделать!2. @sascha Да, я это сделал. Мой параметр options похож на options={‘maxiter’: 10000} . И scipy.optimize output подтверждают, что maxiter был установлен правильно
3. Затем покажите выходные данные, включая. disp.
4. ОК. Очевидно, что это нарушено! Вы не хотите соблюдать Nan. Поскольку мы не знаем данные / весь код, вы должны проверить причины nan для себя, я думаю.
5. Начальная точка 0 действительно плоха: цель не может быть оценена там. Обратите внимание, что часто проблемы, связанные с коэффициентом Шарпа, могут быть переформулированы в выпуклую ссылку QPs.
Ответ №1:
Я не знаю почему, но он отлично работает, когда я заменяю
x = np.zeros(len(profits))
С
x = np.ones(len(profits))
Комментарии:
1. Потому что гарантируется только локальная конвергенция, и вектор единиц кажется гораздо лучшей отправной точкой.