оптимизатор scipy — ограничение количества ценных бумаг с wgt> 0

#python #optimization #scipy #constraints #minimize

#python #оптимизация #scipy #ограничения #свернуть

Вопрос:

У меня есть оптимизация портфеля акций (scipy optimizer> минимизировать), и я хочу установить ограничение, которое ограничивает количество акций (nosec = 50) в портфеле. Я попробовал следующее ограничение:

 constr_nosec = {'type': 'eq',
    'fun': lambda weights: (nosec - sum(1 for x in weights if x > 0.0000001))}
 

К сожалению, оптимизация не приносит ожидаемого результата с портфелем из 50 акций.

Комментарии:

1. Вы не можете сделать это точно без методов дискретной оптимизации, которые недоступны в scipy: ключевые слова с переходом и привязкой, целочисленное программирование. На эвристической стороне существуют прокси-модели , такие как штрафы за норму l1. Сама проблема часто называется оптимизацией с ограничением мощности (и является NP-трудной) или, возможно, выбором функций в ML. Кроме того, большинство решателей scipy ожидают двойной дифференцируемости в целях и ограничениях, которые не могут работать с ifs . См. Соответствующее академическое введение .

2. Спасибо. Но есть ли какой-либо решатель в Python, который способен справиться с такого рода проблемами?

3. Мы не знаем вашей проблемы. Вероятно, есть, но совершенно неясно, выполняете ли вы выпуклую дискретную оптимизацию (вероятно) или общую нелинейную дискретную оптимизацию.

4. Это часто моделируется как проблема MIQP (смешанного целочисленного квадратичного программирования). Решатели MIQP легко доступны.

5. Общая проблема заключается в следующем: 1) основная цель — максимизировать ожидаемую доходность (при игнорировании риска) 2) ограничение 1: максимум 50 ценных бумаг с wgt> 0 (из 500 в тесте) 3) ограничение безопасности: установить нижнюю и верхнюю границы wgt для каждой ценной бумаги в отдельности ( /- 50 бит / с против веса эталона) 4) групповое ограничение: максимальный вес сектора относительно эталона = 5% 5) групповое ограничение: максимальный вес региона относительно эталона = 5% Итак, является ли MIQP подходящим решателем для решения этой проблемы?