1

制約の下で最適なソリューションを見つけようとしており、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 つの制約問題の結果はデフォルトで使用された重み (最初の推測) でした。

4

1 に答える 1