Python 最大资产数约束下的Cvxpy投资组合优化

Python 最大资产数约束下的Cvxpy投资组合优化,python,optimization,portfolio,cvxpy,Python,Optimization,Portfolio,Cvxpy,我正在使用cvxpy库来执行投资组合优化。 但是,我不想使用,而是想介绍其中yi变量是一个二进制变量,如果资产I包含在投资组合中,则该变量的值为1,否则为0m是我希望包含在投资组合中的最大资产数量r是我想要得到的回报 马科维茨模型(对收益有约束)如下所示: import numpy as np import pandas as pd from cvxpy import * # assets names tickers = ["AAA", "BBB", &

我正在使用
cvxpy
库来执行投资组合优化。 但是,我不想使用,而是想介绍其中
yi
变量是一个二进制变量,如果资产I包含在投资组合中,则该变量的值为1,否则为0
m
是我希望包含在投资组合中的最大资产数量
r
是我想要得到的回报

马科维茨模型(对收益有约束)如下所示:

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=变量(n)
er=np.asarray(ret.T)*x
风险=四元形式(x,np.A矩阵(covm))
y=变量(n,布尔值=真)#添加布尔值变量

prob=Problem(最小化(风险),[sum(x)=1,er>=min_-ret,x>=0,sum(y)=k,sum(x)简言之,您必须将变量x和y链接起来

在仅限长时间约束的情况下: eps=1e-5 [-1+eps=买入阈值-1]

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