Может ли SciPy минимизировать с помощью SLSQP работу с несколькими нелинейными ограничениями? - PullRequest
1 голос
/ 26 июня 2019

Я пытаюсь найти оптимальное решение при ограничениях и использовать сворачивание SciPy с SLSQP. Он отлично работает без проблем с одним ограничением. После добавления другого ограничения оно успешно завершается, но без достижения целей оптимизации.

Я предположил, что моя проблема связана с определением функции ограничения (ограничение 2 немного сложнее), и решил научиться правильно использовать минимизацию.

Я переключился на простое второе ограничение, но снова получил неоптимизированное решение.

Функция, которая будет оптимизирована: samples_in_year = 246,5

def get_portfolio_ann_risk(weights, assets_returns_daily, samples_in_year):
   samples_in_data = len(assets_returns_daily)
   cov_matrix = np.cov(assets_returns_daily, rowvar=False, ddof=0)
   weights = np.array([weights])
   weights_mat = np.dot(weights.T, weights)
   daily_var = np.sum(weights_mat * cov_matrix) * (samples_in_data /(samples_in_data - 1))
   daily_risk = np.sqrt(daily_var)
   return daily_risk * np.sqrt(samples_in_year)

Входные данные функции оптимизации:

minimal_risk_optimization_data = (assets_returns_daily, samples_in_year)
asset_weight_max = 1
asset_weight_min = 0

bounds = ((asset_weight_min, asset_weight_max),) * asset_count

Ограничения:

two_constrain_opt_cons = (
   {'type': 'eq', 'fun': lambda weights: 0.5 - np.max(weights)},
   {'type': 'eq', 'fun': lambda weights: 1.0 - np.sum(weights)}
                        )

Функция оптимизации

two_constrain_opt = minimize(get_portfolio_ann_risk, market_weights, method='SLSQP',
   args=minimal_risk_optimization_data,
   constraints=two_constrain_opt_cons,
   bounds=bounds,
   options={'maxiter': 250, 'ftol': 1e-09}
                            )

С каждым из этих ограничений в отдельности он работает нормально, я не могу заставить его работать с ними обоими. Я верю, что если мне удастся решить «более простую» проблему, я смогу оптимизировать реальную проблему.

Результаты для каждой ограниченной оптимизации были правильными, результатом для проблемы двух ограничений был используемый по умолчанию вес (начальное предположение)

1 Ответ

1 голос
/ 28 июня 2019

Решено: Видимо, проблема была в первоначальном предположении.Он встретил:

{'type': 'eq', 'fun': lambda weights: 1.0 - np.sum(weights)}

Ограничение.

Я изменил первоначальное предположение, чтобы не соответствовать ограничению (умножил его на 0,85), и он работает как шарм.

Решение:

two_constrain_opt = minimize(get_portfolio_ann_risk, market_weights * 0.85, method='SLSQP',
   args=minimal_risk_optimization_data,
   constraints=con,
   bounds=bounds,
   options={'maxiter': 250, 'ftol': 1e-09}
                            )
...