scipy.optimize.shgo никогда не заканчивается, не придерживается ограничений
import pandas as pd
import numpy as np
from scipy.optimize import shgo
def my_function(w, *args):
P = X @ w
print(np.mean(P))
print(w)
return -np.mean(P)
file_path = "stock returns data of e.g. 10 companies.xlsx"
df = pd.ExcelFile(file_path).parse('Sheet1', header=6, index_col=0)
X = df.to_numpy()
cons = {'type': 'eq', 'fun': lambda w: 1 - np.sum(w)}
w0 = []
for i in range(df.shape[1]):
w0.append(1 / df.shape[1])
b = (0, 1)
bnds = []
for i in range(df.shape[1]):
bnds.append(b)
optimal = shgo(my_function, bounds=bnds, args=X, constraints=cons)
Чтобы увидеть, что происходит, скрипт печатает значение и веса в каждой итерации. Он не придерживается ограничения, что весам нужно добавить до 1, так как он пытается значения, такие как [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] и [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]. Почему он это делает? Кажется, что для проверки значений на всех границах функции, даже если они не подчиняются ограничениям. Похоже, это приводит к почти бесконечному количеству итераций по мере увеличения количества активов в портфеле.