【问题标题】:cvxpy.error.DCPError: Problem does not follow DCP rulescvxpy.error.DCPError:问题不遵循 DCP 规则
【发布时间】:2019-10-27 02:13:35
【问题描述】:

了解 DCP 规则。我正在查看 CVXPY 网站上提供的投资组合优化示例(参见下面的原始代码)。查看了其他一些处理 DCP 规则但无法得到我想要的答案的查询。

我尝试用从某些资产类别的一些历史回报中生成的 cov 替换其代码(随机生成)中的 Sigma(即协方差)。其他一切都是一样的。 然而我得到 cvxpy.error.DCPError: Problem does not follow DCP rules.

我还添加了两个 Sigma 的图片(一个由 CVXPY 代码随机生成,另一个 Sigma(1) 是我使用的历史 cov 数组)

两者都是 9*9 数组,但正如我提到的,用具有历史数字的数组替换随机生成的数组会给我这个错误,所有其他代码保持不变。知道是什么导致了这个问题吗?


# Generate data for long only portfolio optimization.
import numpy as np
import pandas as pd
import matplotlib
matplotlib.use('TkAgg')
import matplotlib.pyplot as plt

np.random.seed(1)
n = 10
mu = np.abs(np.random.randn(n, 1))
Sigma = np.random.randn(n, n)
Sigma = Sigma.T.dot(Sigma)


# Long only portfolio optimization.
import cvxpy as cp


w = cp.Variable(n)
gamma = cp.Parameter(nonneg=True)
ret = mu.T*w
risk = cp.quad_form(w, Sigma)
prob = cp.Problem(cp.Maximize(ret - gamma*risk),
               [cp.sum(w) == 1,
                w >= 0])


# Compute trade-off curve.
SAMPLES = 100
risk_data = np.zeros(SAMPLES)
ret_data = np.zeros(SAMPLES)
gamma_vals = np.logspace(-2, 3, num=SAMPLES)
for i in range(SAMPLES):
    gamma.value = gamma_vals[i]
    prob.solve()
    risk_data[i] = cp.sqrt(risk).value
    ret_data[i] = ret.value


# Plot long only trade-off curve.
import matplotlib.pyplot as plt
#%matplotlib inline
#%config InlineBackend.figure_format = 'svg'

markers_on = [29, 40]
fig = plt.figure()
ax = fig.add_subplot(111)
plt.plot(risk_data, ret_data, 'g-')
for marker in markers_on:
    plt.plot(risk_data[marker], ret_data[marker], 'bs')
    ax.annotate(r"$\gamma = %.2f$" % gamma_vals[marker], xy=(risk_data[marker]+.08, ret_data[marker]-.03))
for i in range(n):
    plt.plot(cp.sqrt(Sigma[i,i]).value, mu[i], 'ro')
plt.xlabel('Standard deviation')
plt.ylabel('Return')
plt.show()

【问题讨论】:

  • 检查协方差矩阵是否为正定矩阵。例如。通过检查特征值。
  • 感谢 Erwin,矩阵确实不是半正定的。如何将其转换为一个?

标签: python optimization cvxpy


【解决方案1】:

观察:投资组合优化中的方差-协方差矩阵可能不是半正定的。理论上,可以证明协方差矩阵是半正定的。但是,由于浮点舍入误差,我们实际上可能会看到(略微)负特征值。 (注:正半定矩阵具有非负特征值)。

我知道处理此问题的三种方法:

  1. 使用一种称为收缩率的统计技术,
  2. 通过向每个对角线元素添加小常数来稍微扰动对角线
  3. 使用基于调整后平均回报的标准投资组合模型的变体。

详情见link

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多