SciPy可以通过SLSQP最小化来处理多个非线性约束吗?

时间:2019-06-26 01:48:53

标签: python scipy mathematical-optimization minimize scipy-optimize

我试图在约束条件下找到最佳解决方案,并通过SLSQP使用SciPy Minimum。只需一个约束,它就可以完美地工作。 添加其他约束后,它会成功完成,但没有达到优化目标。

我假设我的问题出在约束函数定义上(约束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 个答案:

答案 0 :(得分:1)

已解决: 显然,问题出在最初的猜测中。它遇到了:

{'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}
                            )