【问题标题】:Portfolio optimization with CVXpy - CVX101 Boyd使用 CVXpy 进行投资组合优化 - CVX101 Boyd
【发布时间】:2019-09-08 22:41:48
【问题描述】:

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

我们必须解决以下程序

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

# ---- Data Generation ---- #
np.random.seed(5)
n = 20
# Covariance matrix
S = np.random.rand(n,n)
S = S.T.dot(S)
S = S/np.max(np.abs(np.diag(S)))*.2
S[:,-1] = 0
S[-1,:] = 0

# Uniform weight vector
x_unif = np.ones((n,1)) / n

# Price vector 
pbar = np.ones((n,1))*.03 + np.array(np.append(np.random.rand(n-1,1),0)).reshape((-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 中有解决方案

simple_portfolio_data;
%% part i
%minimum-risk unconstrained portfolio
%with same expected return as uniform
%allocation
cvx_begin
cvx_quiet(true)
variable x_unconstrained(n)
minimize(quad_form(x_unconstrained,S))
subject to
sum(x_unconstrained)==1;
pbar’*x_unconstrained==x_unif’*pbar;
cvx_end

【问题讨论】:

    标签: optimization finance portfolio cvxpy


    【解决方案1】:

    我认为您打算用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]
    

    【讨论】:

      猜你喜欢
      • 2018-03-06
      • 2020-10-15
      • 2021-08-20
      • 1970-01-01
      • 2021-01-11
      • 1970-01-01
      • 2020-04-09
      • 2017-12-25
      • 1970-01-01
      相关资源
      最近更新 更多