У меня есть проблема оптимизации с одной нелинейной целью и линейными ограничениями.
Переменная для оптимизации представляет собой матрицу A , которая представляет суммы денег, которые будут инвестированы каждымпортфель ( m ) по каждому из продуктов ( n ) (поэтому каждая строка представляет один портфель, а каждый столбец представляет один доступный продукт):
- Существует вектор a p0 , который сообщает нам за каждый n (портфель) уже вложенную сумму.
- Существует вектор y p0 , который сообщает нам для каждого n (портфеля) средний процент от уже вложенной суммы.
- Существует вектор a p , который сообщает нам для каждого n (портфолио) общую доступную сумму.
- Существует вектор y L , который сообщает нам для каждой m (продукта) процентную ставку.
- Существует вектор а L , который сообщает нам для каждого m (продукта) общую доступную сумму.
- У нас есть y target , к которому мы хотим, чтобы портфели были как можно ближе.
Мы хотим заполнить A (Матрица сумм), чтобы все портфели были как можно ближе к y target .
Итак, наша цель - сделать сумму разностей междусредневзвешенное значение прогнозируемой доходности портфеля и минимальная цель y .
У нас есть три ограничения:
Сумма всех инвестиций для каждого инвестора должна быть меньше общей суммы, доступной для этого инвестора.
Сумма всех инвестиций для каждого продукта должнабыть равным стоимости этого продукта.
Инвестиции в каждый продукт в портфеле должны быть меньше X.
Чтобы решить эту проблему, я попытался: - Библиотека Python PuLP - не работала, так как целевая функция имеет нелинейное отношение) - scipy.optimize, что я и пытаюсьмомент.Тем не менее, есть проблемы, которые я не знаю, смогу ли я когда-либо преодолеть их.
Демонстрационная версия с кодом:
import pandas as pd
import scipy
from scipy import optimize
import numpy as np
import random
n = 100
m = 5000
a_p0 = np.random.rand(1,m)*100000
y_p0 = np.random.rand(1,m)*4
a_p = np.random.rand(1,m)*10000
y_l = np.random.rand(1,n)*4
a_l = np.random.rand(1,n)*2000
y_target = random.random()*4
A = scipy.rand(n, m)*10
y_target = random
row = n
col = m
#optimize doesn't accept matrices so I transform it to a vector
def toVector(w):
return np.hstack(w)
def toMat(vec, row, col):
return vec[:row*col].reshape(row,col)
def cons_loans_amt(v):
A = toMat(v,row, col)
return A.sum(axis=1) - a_l
def constrain_invst_amt(v):
A = toMat(v,row, col)
return a_p - A.sum(axis=0)
cons = [{'type':'eq', 'fun': cons_loans_amt},
{'type':'ineq', 'fun': constrain_invst_amt}]
def objective(v):
A = toMat(v,row, col)
diff = 0
for m in range(A.shape[1]):
opt_up = (y_p0[0][m] * a_p0[0][m]) + np.dot(y_l, A[m])
opt_down = a_p0[0][m] + A[m].sum()
diff += ((opt_up/opt_down) - y_target)**2
return diff.sum()
#This is the code I am running at the moment with a memory error.
x0 = scipy.rand(row, col)
x0 = toVector(x0)
optimize.minimize(objective, x0, constraints=cons, method='SLSQP')
В настоящий момент я заблокирован.я получаю сообщение об ошибке в памяти и не уверен, что работаю по правильному пути.
Может ли кто-нибудь помочь мне оценить:
- Если эту проблему оптимизации можно решить
- Если подход, который я выбрал, правильный
Спасибо.