Как создать границу в scipy.optimize, чтобы оптимизатор не мог достичь более 1 в суммарном значении вектора? - PullRequest
0 голосов
/ 04 июня 2019

У меня есть функция, которая принимает параметры как вектор. Мне нужно, чтобы любая из векторных переменных была меньше 0, а вектор должен быть суммарным, равным 1

Я пытался найти что-то в документах goolge и scipy. Пока не повезло.

def portfolio_optimization(weight_vector):
    return np.sqrt(cov_table.dot(weight_vector).sum())

связано, что мне нужно применить:

sum(weight_vector) = 1
0 < weight_vector[i] < 1

1 Ответ

0 голосов
/ 04 июня 2019

Первое условие - это ограничение (sum(w)=1), а для второго вы можете использовать для него границы. Вот небольшой пример того, как использовать scipy.optimize.minimize с вектором весов, имеющим 4 элемента:

import numpy as np
from scipy.optimize import minimize


# objective function
func   = lambda w: np.sqrt(cov_table.dot(w).sum())

# constraint: sum(weights) = 1
fconst = lambda w: 1 - sum(w)
cons   = ({'type':'eq','fun':fconst})

# initial weights
w0   = [0, 0, 0, 0]

# define bounds
b    = (0.0, 1.0) 
bnds = (b, b, b, b)

# minimize
sol  = minimize(func,
                w0,
                bounds      = bnds,
                constraints = cons)
print(sol)

* Не забудьте присвоить значение cov_table, чтобы код работал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...