Оптимизация с квадратичными ограничениями и логарифмической функцией на R

Я пытаюсь решить эту проблему оптимизации в R:

Проблема оптимизации

Чтобы было ясно, вектор — это переменная, которую нужно оптимизировать. а матрица постоянна

Я не знаю, как изменить проблему, чтобы использовать один решатель R, все мои попытки были неудачными...

Это следует из этой статьи о количественных финансах:

https://papers.ssrn.com/sol3/papers.cfm?abstract_id=2673124

Спасибо за помощь,

Артур

Это то, что я пробовал, используя R и пакет nloptr.

  #Compute the covariance matrix with asset returns
  Cov<-cov(Asset)

  #fonction to optimize
  D <- function(P) {
    -sum(log(abs(P)))
  }

  #gradient of the objective function
  D_g <- function(P) {
    -1/P
    }

  #inequality function with the Jacobian
  ineq <- function(P) {
    cont<-rep(0,length(P))
    for(i in 1: length(P)){
      cont[i]<-sum(P[-i]*Cov[i,-i])
    }
    return(list(
      "constraints" = sqrt(t(P) %*% Cov %*% P) - target,
      "jacobian" = (P * diag(Cov)+cont) / sqrt(t(P) %*% Cov %*% P)
    ))

  }

  # Optimisation under constraints
  # Poids is the initial weight: 1/vol
  # D is the function to optimize
  # D_g is the gradient of this function
  # ineq is a function with constraint and jacobian of it
  Poids=Pos*1/sqrt(diag(Cov))/sum(1/sqrt(diag(Cov)))

  par0 <-
    nloptr(
      Poids,
      D,
      eval_grad_f = D_g,
      lb = NULL,
      ub = NULL,
      eval_g_ineq = ineq,
      opts = list("algorithm" = "NLOPT_LD_LBFGS",
                  "xtol_rel" = 1.0e-8)
    )

person ArthurC    schedule 27.10.2017    source источник
comment
Пожалуйста, добавьте тег домашнего задания, если это вопрос домашнего задания. Кроме того, пожалуйста, покажите нам, что вы уже пробовали.   -  person Bas Jansen    schedule 27.10.2017
comment
QCQP не будет работать.   -  person sascha    schedule 27.10.2017
comment
@саша почему не работает?   -  person ArthurC    schedule 27.10.2017
comment
Как вы выражаете лог-функцию в QCQP? Вам понадобится экспоненциальный конус и некоторая переформулировка (больше не QCQP). (и да: этот вопрос широкий, задача неполная, и похоже, что вы потратили всего 2 минуты, чтобы выразить ее, в то время как каждый ответ займет гораздо больше времени)   -  person sascha    schedule 27.10.2017
comment
@BasJansen это для работы и личного пользования   -  person ArthurC    schedule 27.10.2017
comment
@sascha я добавлю то, что пробовал, в свой первоначальный вопрос   -  person ArthurC    schedule 27.10.2017
comment
Этот вопрос все еще очень низкого качества. Посмотрите на это и подумайте о том, чтобы говорить такие вещи, как все мои попытки были неудачными..., не сообщая при этом никакой дополнительной информации (ошибка, отсутствие конвергенции, взорванный компьютер...). Кроме того: сначала вы говорили о QCQP (что является четко определенной проблемой!), теперь вы представили общий подход к нелинейному программированию, который является чем-то совершенно другим! Без использования R или этой библиотеки я также скажу вам, что я на 99,9% уверен, что NLOPT_LD_LBFGS не может использовать ограничения (это классический неограниченный решатель, поддерживающий только границы), что, очевидно, было бы проблемой здесь!   -  person sascha    schedule 27.10.2017
comment
Не нужно быть грубым. Если я спрашиваю, это потому, что мои познания в оптимизации очень ограничены. Я понимаю, что мой вопрос, безусловно, очень большой, но я пытаюсь сделать это правильно   -  person ArthurC    schedule 27.10.2017
comment
Я просто указываю, что это, как представлено, не привлечет здесь много полезных людей, так как с ним сложно работать (см. Мои пункты + внешний документ без собственного резюме и деталей; нет воспроизводимого примера, до сих пор нет описания ошибки).   -  person sascha    schedule 27.10.2017
comment
Я понимаю, что вы говорите, но все, что мне нужно знать, это какой тип алгоритма может решить проблему такого типа и как ее решить в R... Описания ошибок бессмысленны, потому что я даже не знаю, какой алгоритм мне нужно использовать с nlopr   -  person ArthurC    schedule 27.10.2017


Ответы (1)


Вот код, который сработал. После некоторых исследований я обнаружил, что алгоритм COBYLA пакета nlopr может решить проблему такого типа. Извините за непонимание расширенной оптимизации и того, как это сделать в R.

Вот код, если кому-то из финансовой индустрии нужно сделать это быстро:

  #Asset is simply returns from financial asset 
  target=0.1/sqrt(252)
  #Compute the covariance matrix
  Cov<-cov(Asset)

  #fonction to optimize
  D <- function(P) {
    -sum(log(abs(P)))
  }

  #gradient of the objective function
  D_g <- function(P) {
    -1/P
    }

  #inequality function with the Jacobian
  ineq <- function(P) {
    return(sqrt(t(P) %*% Cov %*% P) - target
    )
  }

  LoB=rep(0,length(Pos))
  UpB=rep(0,length(Pos))
  for(i in 1:length(Pos)){
    if(Pos[i]>0){
      LoB[i]<-0.00001
      UpB[i]<-10
    }else{
      LoB[i]<- -10
      UpB[i]<- -0.00001
    }
  }

  # Optimisation under constraints
  # Poids is the initial weight: 1/vol
  # D is the function to optimize
  # ineq is a function with constraints

  Poids=Pos*1/sqrt(diag(Cov))/sum(1/sqrt(diag(Cov)))

  par0 <-
    nloptr(
      Poids,
      D,
      eval_grad_f = NULL,#D_g,
      lb = LoB,
      ub = UpB,
      eval_g_ineq = ineq,
      opts = list("algorithm" = "NLOPT_LN_COBYLA",
                  "xtol_rel" = 1.0e-12,
                  "maxeval"=10000,
                  "xtol_abs"=1.0e-12)
    )

Я прекрасно понимаю, что для некоторых вопрос был слишком большим и теоретическая проблема не решена. Еще раз, у меня недостаточно знаний по расширенной оптимизации...

person ArthurC    schedule 27.10.2017