Работа над стандартной проблемой в теории портфеля. Учитывая набор возвратов, хотите найти веса, которые означают, что mean_returns / portfolio_variance максимизируется. Я установил код, и он работает, за исключением ограничения, что max (portfolio_variance) составляет 3%. В большинстве случаев он может найти такой набор весов, однако это не всегда возможно. Это нормально, но у меня есть требование: «если весов не существует, увеличьте ограничение на portfolio_variance с шагом 0,25%, пока такой портфель не будет найден». Как я могу реализовать это в коде? см. код ниже:
def portfolio_annualised_performance(weights, mean_returns, cov_matrix):
returns = np.sum(mean_returns * weights)
std = np.sqrt(np.dot(weights.T, np.dot(cov_matrix, weights)))
return std, returns
def neg_sharpe_ratio(weights, mean_returns, cov_matrix):
p_var, p_ret = portfolio_annualised_performance(weights, mean_returns, cov_matrix)
return -252*(p_ret) / p_var
def max_sharpe_ratio(mean_returns, cov_matrix):
num_assets = len(mean_returns)
args = (mean_returns, cov_matrix)
def portfolio_volatility(weights):
return portfolio_annualised_performance(weights, mean_returns, cov_matrix)[0]
constraints = ({'type': 'eq', 'fun': lambda x: np.sum(x) - 1},{'type': 'ineq', 'fun': lambda x: portfolio_volatility(x) - 0.03000000})
bound = [(0.0,0.5),(0.0,0.5),(0.0,0.5),(0.0,0.4),(0.0,0.3),(0.0,0.4)]
bounds = tuple(bound[asset] for asset in range(num_assets))
result = sco.minimize(neg_sharpe_ratio, num_assets*[1./num_assets,], args=args,
method='SLSQP', bounds=bounds, constraints=constraints)