CVXPY ограничения, подобные стране/сектору/индустрии, для оптимизации минимальной дисперсии

Я пытаюсь реализовать оптимизацию портфеля, которая использует ограничения для определения, например. максимальное воздействие на страну/сектор/отрасль и т. д. Я реализовал следующий код ниже, где я передаю вектор «Африка», чтобы сопоставить запасы со страной Африки, в своих ограничениях я затем привязал их к весу не более 40%. общий. Единственный способ, которым мне удалось это реализовать, — использовать sum_weights для индексов, где africa = 1. Я также пытался использовать функцию Parameter, но безуспешно. Надеюсь, должен быть более элегантный способ применить такие ограничения. Любое предложение приветствуется. Кроме того, если кто-нибудь знает о примере, который показывает использование ограничений отслеживания ошибок, ограничений оборота или ограничений волатильности, это те, с которыми я также все еще борюсь.

import numpy as np
from cvxpy import *

np.random.seed(1)
n = 10 # number of assets

mu = np.abs(np.random.randn(n,1)) #mean
Sigma = np.random.randn(n,n)
Sigma = Sigma.T.dot(Sigma)


# Long only PFO Opt
w = Variable(n)

#africa = Parameter(10, sign='positive') 
#africa.value = [1,1,1,0,0,0,0,0,0,0]

africa = [0,0,0,0,0,0,0,1,1,1]

gamma = Parameter(sign='positive')
ret = mu.T*w
risk = quad_form(w,Sigma)

filters = [i for i in range(len(africa)) if africa[i] == 1]

constraints = [sum_entries(w) == 1, w >=0, w[1] > 0.50, w[0] == 0,   sum_entries(w[filters]) == 0.4]

#prob = Problem(Maximize(ret - gamma*risk), [sum_entries(w) == 1, w >=0])  

prob = Problem(Minimize(risk), constraints)

SAMPLE = 1000
risk_data = np.zeros(SAMPLE)
ret_data = np.zeros(SAMPLE)
gamma_vals = np.logspace(-2,3,num=SAMPLE)

for i in range(SAMPLE):
    gamma.value = gamma_vals[i]
    prob.solve()
    risk_data[i] = sqrt(risk).value
    ret_data[i] = ret.value

print(prob.status)
print(prob.value)

print('OPT WEIGHTS : ')
for i in range(n):
    print(round(w[i].value,3))

person ThatQuantDude    schedule 05.07.2016    source источник


Ответы (1)


Думаю, вам стоит взглянуть на эти примеры. Разработчик включил ограничение риска портфеля следующим образом:

import cvxpy as cp

w = cp.Variable(n)
gamma = cp.Parameter(nonneg=True)
ret = mu.T*w 
risk = cp.quad_form(w, Sigma)
Lmax = cp.Parameter()

# Portfolio optimization with a leverage limit and a bound on risk.
prob = cp.Problem(cp.Maximize(ret), 
              [cp.sum(w) == 1, 
               cp.norm(w, 1) <= Lmax,
               risk <= 2])

Вот ссылка на jupyter nbviewer

person wanna_be_quant    schedule 21.01.2021