Cvxpy投资组合优化,对最大资产数量进行约束



我正在使用cvxpy库来执行Portfolio Optimization。然而,我不想使用Markowitz协方差模型,而是想引入新的变量,其中yi变量是一个二元变量,如果资产I包括在投资组合中,则假设值为1,否则为0;m是我希望包含在投资组合中的最大资产数量;r是我想要得到的回报。

Markowitz模型对收益率有约束,如下所示:

import numpy as np
import pandas as pd
from cvxpy import *
# assets names
tickers = ["AAA", "BBB", "CCC", "DDD", "EEE", "FFF"]
# return matrix
ret = pd.DataFrame(np.random.rand(1,6), columns = tickers)
# Variance_Coviariance matrix
covm = pd.DataFrame(np.random.rand(6,6), columns = tickers, index = tickers)
# problem setting
x = Variable(len(tickers))              # xi variables
er = np.asarray(ret.T) * x              # expected return
min_ret = 0.2                           # minimum return
risk = quad_form(x, np.asmatrix(covm))  # risk
prob = Problem(Minimize(risk),          # problem setting function
[sum(x) == 1, er >= min_ret, x >= 0])
prob.solve()

这个问题的解决方案给出了投资于每种资产的百分比。但是,如果我想投资数量有限的资产m,该怎么办?为了做到这一点,我需要实现yi变量,并确保它们的和等于m因此,它应该是这样的:

x = Variable(n)             
er = np.asarray(ret.T) * x 
risk = quad_form(x, np.asmatrix(covm))  
y = Variable(n, boolean=True)            #adding boolean variables
prob = Problem(Minimize(risk), [sum(x) == 1, er >= min_ret, x >= 0, sum(y) == k, sum(x) <= sum(y)])
prob.solve()
print(x.value)
print(y.value) 

不幸的是,最后一段代码没有产生任何结果。你知道为什么吗?有其他方法可以解决这个问题吗?

简而言之,您必须链接变量x和y。

如果存在仅限长的约束:eps=1e-5[-1+eps<=x-y,x-y<=0]

如果x>0并且如果x==0则y为0。

为了使其正常工作,并且不被略高于0的资产所困扰,您还应该引入买入阈值。

[x-y>=buy_in_threshold-1]

注意,这个问题是一个混合整数问题。如果问题仍然很小,ECOS BB求解器可以处理这个问题。否则,您将需要一个商业级优化器。

最新更新