Optimization 基于CVXpy-CVX101-Boyd的投资组合优化

Optimization 基于CVXpy-CVX101-Boyd的投资组合优化,optimization,finance,portfolio,cvxpy,Optimization,Finance,Portfolio,Cvxpy,我正在研究boyd MOOC,CVX101,我正在尝试用Python做第三个家庭作业,我遇到了一些问题 我们必须解决以下程序 我们通过以下方式生成数据: 数据生成--# np.随机种子(5) n=20 #协方差矩阵 S=np.random.rand(n,n) S=S.T.点(S) S=S/np.max(np.abs(np.diag))*.2 S[:,-1]=0 S[-1,:]=0 #等权向量 x_unif=np.one((n,1))/n #价格向量 pbar=np.ones((n,1))*.0

我正在研究boyd MOOC,CVX101,我正在尝试用Python做第三个家庭作业,我遇到了一些问题

我们必须解决以下程序

我们通过以下方式生成数据:

数据生成--#
np.随机种子(5)
n=20
#协方差矩阵
S=np.random.rand(n,n)
S=S.T.点(S)
S=S/np.max(np.abs(np.diag))*.2
S[:,-1]=0
S[-1,:]=0
#等权向量
x_unif=np.one((n,1))/n
#价格向量
pbar=np.ones((n,1))*.03+np.数组(np.append(np.random.random.rand(n-1,1),0))。重塑((-1,1))*.12
我做了什么

from cvxpy import quad_form
from cvxpy import sum as cvxsum

x_unconstrained = cp.Variable(n)

constraints = [cvxsum(x_unconstrained) == 1,
               pbar.T * x_unconstrained == x_unif.T * pbar
              ]

obj_3 = cp.Minimize(quad_form(x_unconstrained, S))
prob = cp.Problem(obj_3, constraints)
prob.solve()

print("status:", prob.status)
print("optimal value", prob.value)
print("optimal var", x_unconstrained.value)
这就是我得到的结果

status: infeasible
optimal value inf
optimal var None
作为旁注,我有matlab中的解决方案

简单的投资组合数据;
%%第一部分
%最小风险无约束投资组合
%与统一的预期收益相同
%分配
cvx_开始
cvx_安静(真实)
变量x_无约束(n)
最小化(四边形(x_无约束,S))
从属于
和(x_无约束)=1;
pbar'*x_unconstraint==x_unif'*pbar;
cvx_端

我想你打算用
x_unif'
pbar
进行矩阵乘法。令人困惑的是,由于这两个数组都是numpy数组,因此使用
*
操作符将尝试执行元素乘法,并在可能的情况下进行广播。因此

(x_unif.T * pbar).shape
(20,20)
。所以你只需要用矩阵乘法来代替它。如果您使用的是Python 3.5或更新版本,则可以执行以下操作:

x_unif.T @ pbar
否则,这将适用于所有地方:

np.dot(x_unif.T, pbar)
那么你应该得到一个可行的结果:

status: optimal
optimal value 6.593319112947055e-06
optimal var [-0.04367061  0.14013956 -0.165039    0.11715289  0.26894204  0.19991486
 -0.18222916 -0.06746431 -0.28428226 -0.1740003   0.14624092 -0.29178846
  0.0979433   0.02320117 -0.29351406  0.06030019  0.13121461  0.14653953
  0.24223093  0.92816817]