Scipy Optimizer Добавочные ограничения - PullRequest
0 голосов
/ 13 февраля 2020

Работа над стандартной проблемой в теории портфеля. Учитывая набор возвратов, хотите найти веса, которые означают, что 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...