У меня есть данные временного ряда для запасов N.Сдерживающие нормы с неравенствами
sample.data<-replicate(10,rnorm(1000))
, где каждый столбец показывает доходность различных запасов с течением времени.
Я пытаюсь построить вектор веса портфеля, чтобы минимизировать дисперсию возвратов.
целевая функция:
min w^{T}\sum w
s.t. e_{n}^{T}w=1
\left \| w \right \|\leq C
где ш вектор весов, \sum
ковариационная матрица, e_{n}^{T}
вектор из единиц, C
является константой. Где второе ограничение (\left \| w \right \|
) является ограничением неравенства.
Я использовал следующий код, чтобы решить эту проблему:
library(Rsolnp)
gamma<-1
fn<-function(x) {cov.Rt<-cov(sample.data); return(t(x)%*%cov.Rt%*%x)} #OBJECTIVE FUNCTION TO MINIMIZE
eqn<-function(x){one.vec<-matrix(1,ncol=10,nrow=1); return(one.vec%*%x)} #EQUALITY CONSTRAINT
constraints<-1 #EQUALITY CONSTRAINT
ineq<-function(x){one.vec<-matrix(1,ncol=10,nrow=1); #INEQUALITY CONSTRAINT
z1<-one.vec%*%abs(x)
return(z1)
}
uh<-gamma #UPPER BOUND
lb<-0 #LOWER BOUND
x0<-matrix(0,10,1) #STARTING PARAMETER VECTOR (NOT SURE WHAT STARTING VALUES TO PUT HERE)
sol1<-solnp(x0,fun=fn,eqfun=eqn,eqB=constraints, ineqfun=ineq,ineqUB=gamma,ineqLB=lb)
При выполнении этого кода я получаю следующее сообщение об ошибке:
Error in solve.default(cz,tol = 1e-25) : system is computationally singular: reciprocal condition number = 0 In addition: There were 50 warnings (use warnings() to see the first 50)
warnings()
1: In cbind(temp, funv): number of rows of result is not a multiple of vector length
Любые идеи, что я могу делать неправильно? Есть ли проблема с начальным параметром vector x0
?
Для начала ваша 'sample.data' неверна. Вы также можете сообщить нам, что такое 50 предупреждений. И откуда исходит функция 'solnp'. – dash2
спасибо. Я исправил ошибки, которые вы указали. – ghb