【发布时间】: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