Я пытаюсь найти оптимальное решение при ограничениях и использовать сворачивание 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}
)
С каждым из этих ограничений в отдельности он работает нормально, я не могу заставить его работать с ними обоими.
Я верю, что если мне удастся решить «более простую» проблему, я смогу оптимизировать реальную проблему.
Результаты для каждой ограниченной оптимизации были правильными, результатом для проблемы двух ограничений был используемый по умолчанию вес (начальное предположение)