制約の下で最適なソリューションを見つけようとしており、SciPy の最小化を SLSQP で使用しようとしています。単一の制約で問題なく完全に機能します。別の制約を追加すると、正常に終了しますが、最適化の目標を達成できません。
私の問題は制約関数の定義 (制約 2 は少しトリッキーです) にあると想定し、最小化を適切に使用する方法を学ぶことにしました。
単純な 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}
)
これらの制約のそれぞれを個別に使用すると、正常に機能します。両方で機能させることはできません。「より単純な」問題を解決できれば、実際の問題を最適化できると思います。
各制約付き最適化の結果は正しく、2 つの制約問題の結果はデフォルトで使用された重み (最初の推測) でした。