cvxpy.error.DCPError: Проблема не соответствует правилам DCP - PullRequest
0 голосов
/ 27 октября 2019

Разобраться с правилами DCP. Я смотрю на пример оптимизации портфеля, представленный на веб-сайте CVXPY (см. Ниже исходные коды). Посмотрел некоторые другие запросы, связанные с правилами DCP, но не смог получить нужный мне ответ.

Я попытался заменить сигму (то есть ковариацию) в их коде (который генерируется случайным образом) на cov. генерируется из некоторых исторических доходов для некоторых классов активов. Все остальное тоже самое. Тем не менее, я получаю cvxpy.error.DCPError: Проблема не соответствует правилам DCP.

Я также добавил фотографии двух сигм (одна сгенерирована случайным образом с помощью кода CVXPY, а другая Сигма (1) - это исторический код). массив, который я использую)

Оба являются массивами 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()

enter image description here enter image description here

1 Ответ

0 голосов
/ 28 октября 2019

Наблюдение: возможно, что матрица дисперсии-ковариации в оптимизации портфеля не является положительной полуопределенной. Теоретически матрица ковариации может быть показана как положительно-полуопределенная. Тем не менее, из-за ошибок округления с плавающей точкой, мы можем увидеть (немного) отрицательные собственные значения. (Примечание: положительная полуопределенная матрица имеет неотрицательные собственные значения).

Мне известны три подхода для решения этой проблемы:

  1. Используйте статистический метод, называемый сжатие ,
  2. Немного измените диагональ , добавив небольшую константу к каждому диагональному элементу,
  3. Используйте вариант стандартной модели портфеля, основанной на среднем значении возвращает .

Подробнее см. ссылка .

...