1

我正在尝试在约束下找到最佳解决方案,并将 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}
                            )

分别使用这些约束中的每一个,它都可以正常工作,我不能让它同时与它们一起工作。我相信,如果我能够解决“更简单”的问题,我将能够优化真正的问题。

每个约束优化的结果都是正确的,两个约束问题的结果是默认使用的权重(初始猜测)

4

1 回答 1

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}
                            )
于 2019-06-28T19:22:57.873 回答