首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >具有最大资产数量约束的Cvxpy投资组合优化

具有最大资产数量约束的Cvxpy投资组合优化
EN

Stack Overflow用户
提问于 2021-06-02 16:51:25
回答 1查看 273关注 0票数 0

我正在使用cvxpy库来执行投资组合优化。但是,我不想使用Markowitz covariance model,而是引入new variables,其中yi变量是一个二进制变量,如果资产i包含在投资组合中,则假设该变量的值为1,否则为0;m是我希望包括在投资组合中的最大资产数量;r是我希望获得的回报。

带有回报约束的Markowitz模型如下:

代码语言:javascript
运行
复制
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,因此应该是这样的:

代码语言:javascript
运行
复制
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) 

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

EN

回答 1

Stack Overflow用户

发布于 2021-06-10 19:26:33

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

在long only约束的情况下: eps = 1e-5 -1 + eps <= x- y,x-y <= 0

如果x> 0,则将y设置为1,如果x ==为0,则将y设置为0。

为了使其正常工作,并且不受资产仅略高于0的影响,您还应该引入买入阈值。

X-y >= buy_in_threshold -1

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67801908

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档