让我开始关注DCP规则。我正在看CVXPY网站上提供的投资组合优化示例(请参见下面的原始代码)。看看其他一些处理DCP规则的查询,但是找不到我想要的答案。
我尝试用某些资产类别的某些历史收益生成的cov替换其代码(随机生成)中的Sigma(即协方差)。其他一切都一样。 但是我得到了cvxpy.error.DCPError:问题没有遵循DCP规则。
我还添加了两个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()
答案 0 :(得分:0)
观察:投资组合优化中的方差-协方差矩阵可能不是正半定的。从理论上讲,方差矩阵可以证明是正半定的。但是,由于浮点舍入误差,我们实际上可能会看到(略有)负特征值。 (注意:一个正半定矩阵具有非负特征值)。
我知道三种处理方法:
有关详细信息,请参见link。