Как использовать cvxopt для оптимизации средней дисперсии с ограничениями?

Я могу использовать cvxopt для расчета эффективной границы в соответствии с документами:

http://cvxopt.org/examples/book/portfolio.html

Однако я не могу понять, как добавить ограничение, чтобы была верхняя граница максимально допустимого веса конкретного актива. Возможно ли это с помощью cvxopt?

Вот мой код на данный момент, который создает эффективную границу без ограничений, за исключением того, что я считаю b, который устанавливает максимальную сумму весов в 1. Я не уверен, что делают G, h, A и mus, и документы не не очень объяснить. Откуда 10**(5.0*t/N-1.0) в формуле для mus?

from math import sqrt
from cvxopt import matrix
from cvxopt.blas import dot 
from cvxopt.solvers import qp, options 

# Number of assets
n = 4
# Convariance matrix
S = matrix( [[ 4e-2,  6e-3, -4e-3,   0.0 ], 
             [ 6e-3,  1e-2,  0.0,    0.0 ],
             [-4e-3,  0.0,   2.5e-3, 0.0 ],
             [ 0.0,   0.0,   0.0,    0.0 ]] )
# Expected return
pbar = matrix([.12, .10, .07, .03])

# nxn matrix of 0s
G = matrix(0.0, (n,n))
# Convert G to negative identity matrix
G[::n+1] = -1.0
# nx1 matrix of 0s
h = matrix(0.0, (n,1))
# 1xn matrix of 1s
A = matrix(1.0, (1,n))
# scalar of 1.0
b = matrix(1.0)

N = 100
mus = [ 10**(5.0*t/N-1.0) for t in range(N) ]
options['show_progress'] = False
xs = [ qp(mu*S, -pbar, G, h, A, b)['x'] for mu in mus ]
returns = [ dot(pbar,x) for x in xs ]
risks = [ sqrt(dot(x, S*x)) for x in xs ]

#Efficient frontier
plt.plot(risks, returns)

person bobo5645    schedule 23.05.2014    source источник


Ответы (4)


Вы используете решатель квадратичного программирования из пакета cvxopt, ознакомьтесь с документацией.

Как видно из формулы, Gx <= h — ограничения неравенства, а Ax = b — ограничения равенства. G и A являются матрицами, а h и b и являются векторами.

Предположим, вы хотите ограничить свой первый актив весом от 2% до 5%, вы бы сформулировали это следующим образом:

G = matrix([[-1, 0, 0, 0],
            [ 1, 0, 0, 0]])

h = matrix([[-0.02],
            [0.05]])

Обратите внимание, что первая строка превращает условие неравенства в Gx >= h путем умножения на -1.

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

Формула, которую вы используете, объясняется здесь: ваш muявляется qв статье Википедии и, следовательно, параметр толерантности к риску. На самом деле не имеет значения, прикрепите ли вы его к ковариации или вернете часть целевой функции. Это просто означает, что вы либо идете из верхнего правого угла в нижний левый, либо наоборот для каждого значения mu. Так что это просто функция, которая дает вам устойчивость к риску от очень малого до очень большого. Я думаю, что есть ошибка в том, что серия начинается с 0,1, но на самом деле должна начинаться с 0.

person Felix Zumstein    schedule 05.09.2014
comment
Не могли бы вы добавить больше интуитивного понимания того, как вы выбрали матрицы G и h? Как бы вы добавили отдельные ограничения для первых двух ресурсов? Как бы вы добавили ограничения на сумму весов актива 1 + актива 2? - person cpage; 22.11.2018

Я знаю, что это старо, но очень трудно найти где-нибудь хороший пример ограниченной средней дисперсии;

Что ж, часть ограничений так не работает;

В этом случае G Mat должен быть 4 X 4, а h должен быть 1 X 4, как показано ниже. Если требуется минимальный порог, можно ввести в матрицу «h», как в моем примере ниже (в этом случае 20%). Тем не менее, мне не удалось добавить максимальное ограничение.

G = matrix([[-1.0, 0.0, 0.0, 0.0],
       [0.0, -1.0, 0.0, 0.0],
       [0.0, 0.0, -1.0, 0.0],
       [0.0, 0.0, 0.0, -1.0]])


 h = matrix([-0.2, 0.0, 0.0, 0.0])
person skatip    schedule 10.06.2020

главное это организовать ваши ограничения ineq и eq, например, если вы хотите разрешить короткие продажи для 2 активов, тогда -1‹=x(i)‹=1 и sum(x(i))=1. Таким образом, возьмите ineq, у одного есть 4 ineq, поэтому G должно быть 4x2, а h равно 4x1. Проверьте... G=[I/-I], где I единицы, т.е. G=[[1,0],[0,1],[-1,0],[0,-1]] x s [x1 ,x2] и h=[1,1,1,1], если вы используете Gx‹=h, вы получите x1‹=1, x2‹=1 x1>=-1 и x2>=-1/. Равенство времени равно Ax=b, b=1 и A=[1,1].. Еще раз проверьте это, x1 +x2 = 1, что соответствует ограничению. P и Q у вас уже есть. Теперь вы готовы решить.

person Berto    schedule 07.07.2015

Я думаю, что ответ, помеченный как правильный, на самом деле дал неверный пример. Матрица covxopt имеет столбец. поэтому образцы G и h необходимо транспонировать.

person casbby    schedule 29.04.2020
comment
Добро пожаловать в stackoverflow.com. Обратите внимание, что ваш ответ больше похож на комментарий к предыдущему ответу, но не на исходный вопрос. См. как ответить. - person Flickerlight; 29.04.2020
comment
спасибо за информацию, но я не мог прокомментировать предыдущий ответ, потому что у меня меньше 50 репутации. - person casbby; 29.04.2020