我正在尝试在约束下找到最佳解决方案,并将 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}
)
分别使用这些约束中的每一个,它都可以正常工作,我不能让它同时与它们一起工作。我相信,如果我能够解决“更简单”的问题,我将能够优化真正的问题。
每个约束优化的结果都是正确的,两个约束问题的结果是默认使用的权重(初始猜测)