Матрица задачи оптимизации с нелинейной целью - PullRequest
0 голосов
/ 04 февраля 2019

У меня есть проблема оптимизации с одной нелинейной целью и линейными ограничениями.

Переменная для оптимизации представляет собой матрицу A , которая представляет суммы денег, которые будут инвестированы каждымпортфель ( m ) по каждому из продуктов ( n ) (поэтому каждая строка представляет один портфель, а каждый столбец представляет один доступный продукт):

matrix

  • Существует вектор a p0 , который сообщает нам за каждый n (портфель) уже вложенную сумму.
  • Существует вектор y p0 , который сообщает нам для каждого n (портфеля) средний процент от уже вложенной суммы.
  • Существует вектор a p , который сообщает нам для каждого n (портфолио) общую доступную сумму.
  • Существует вектор y L , который сообщает нам для каждой m (продукта) процентную ставку.
  • Существует вектор а L , который сообщает нам для каждого m (продукта) общую доступную сумму.

vectors

  • У нас есть y target , к которому мы хотим, чтобы портфели были как можно ближе.

Мы хотим заполнить A (Матрица сумм), чтобы все портфели были как можно ближе к y target .

Итак, наша цель - сделать сумму разностей междусредневзвешенное значение прогнозируемой доходности портфеля и минимальная цель y .

objective

У нас есть три ограничения:

Сумма всех инвестиций для каждого инвестора должна быть меньше общей суммы, доступной для этого инвестора.

constraint1

Сумма всех инвестиций для каждого продукта должнабыть равным стоимости этого продукта.

constraint2

Инвестиции в каждый продукт в портфеле должны быть меньше X.

constraint3

Чтобы решить эту проблему, я попытался: - Библиотека 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')


В настоящий момент я заблокирован.я получаю сообщение об ошибке в памяти и не уверен, что работаю по правильному пути.

Может ли кто-нибудь помочь мне оценить:

  1. Если эту проблему оптимизации можно решить
  2. Если подход, который я выбрал, правильный

Спасибо.

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