我试图在约束条件下找到最佳解决方案,并通过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}
)
分别使用这些约束中的每个约束,它都可以正常工作,我无法使其同时适用于这两个约束。 我相信,如果我能够解决“较简单”的问题,那么我将能够优化实际问题。
每个约束优化的结果都是正确的,两个约束问题的结果是默认的使用权重(初始猜测)
答案 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}
)