微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

限制最大资产数量的 Cvxpy 投资组合优化

如何解决限制最大资产数量的 Cvxpy 投资组合优化

我正在使用 cvxpy 库来执行投资组合优化。 但是,我想引入 Markowitz covariance model 而不是使用 new variables,其中 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,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,x >= 0,sum(y) == k,sum(x) <= sum(y)])
prob.solve()
print(x.value)
print(y.value) 

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

解决方法

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

在只有长约束的情况下: 每股收益 = 1e-5 [-1 + eps

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

为了使其正常运行并且不被资产略高于 0 所困扰,您还应该引入一个买入门槛。

[x - y >=buy_in_threshold - 1]

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。