【问题标题】:Cvxpy portfolio optimization with constraint on the maximum number of assets限制最大资产数量的 Cvxpy 投资组合优化
【发布时间】:2021-08-20 10:08:59
【问题描述】:

我正在使用cvxpy 库来执行投资组合优化。 但是,我不想使用Markowitz covariance model,而是介绍new variables,其中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) 

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

【问题讨论】:

    标签: python optimization portfolio cvxpy


    【解决方案1】:

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

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

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

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

    [x - y >= buy_in_threshold - 1]

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

    【讨论】:

      猜你喜欢
      • 2021-01-11
      • 2016-10-08
      • 2019-09-08
      • 1970-01-01
      • 1970-01-01
      • 2023-01-13
      • 2020-04-09
      • 2022-11-18
      • 2017-12-04
      相关资源
      最近更新 更多