如何解决限制最大资产数量的 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 举报,一经查实,本站将立刻删除。