Портфель с минимальной дисперсией R: решение необратимой матрицы

#r #optimization #mathematical-optimization #portfolio #quadprog

#r #оптимизация #математическая оптимизация #Портфолио #quadprog

Вопрос:

Я хочу решить задачу оптимизации, касающуюся портфеля с минимальной дисперсией, используя R, как кратко описано на этом веб-сайте: http://enricoschumann.net/R/minvar.htm

Проблема в том, что в матрице, которую я хочу использовать, больше столбцов (= активов), чем строк (= наблюдений), поэтому она не является положительно определенной и необратимой.

Вы можете воссоздать эту проблему, взяв противоположные значения для переменных, как на веб-сайте, что приводит к следующему:

 nO <- 10L  ## number of observations
nA <- 100L  ## number of assets
  
 mData <- array(rnorm(nO * nA, sd = 0.05), 
               dim = c(nO, nA)) #Creating sample stock observations

library("quadprog")
aMat <- array(1, dim = c(1,nA))
bVec <- 1
zeros <- array(0, dim = c(nA,1))

solQP <- solve.QP(cov(mData), zeros, t(aMat), bVec, meq = 1) #Minimize optimization
solQP$solution
  

что приводит к следующей ошибке:

  matrix D in quadratic function is not positive definite! 
  

Кто-нибудь знает другие функции для решения оптимизации с помощью mData или способы сделать mData обратимым без потери информации?

Желаемым результатом являются веса для каждого актива для портфеля с минимальной дисперсией.

Ответ №1:

Вы можете попробовать:

 library(Matrix)
Q = nearPD(cov(mData))$mat
  

а затем используйте Q вместо cov(mData) .

Существует также альтернативная модель средней дисперсии, основанная на скорректированной доходности, которая обрабатывает ваш случай напрямую. Смотрите ссылку. К сожалению, это не так просто реализовать с помощью QuadProg (ссылка).

Комментарии:

1. Я просмотрел альтернативную формулировку по предоставленной вами ссылке. Предположим, у меня есть матрица возвратов R , умноженная на размер T n (количество наблюдений, умноженное на количество активов). Затем ваша модель, IIUC, минимизируется (Rx)'IRx = x'R'Rx . Но тогда, если R не имеет полного ранга столбца, то и не имеет R'R .

2. Основная проблема с QuadProg заключается в том, что он хочет (1) строго положительно определенную матрицу (не положительно-полуопределенную) и (2) все переменные должны быть квадратичными. Большинство решателей QP не похожи на это. Простой обходной путь только для QuadProg — добавить небольшое диагональное значение к Q для линейных переменных. Опять же, широко доступны лучшие решатели QP, которые в этом не нуждаются.