Оптимизация портфеля с дифференциальной эволюцией

Я столкнулся с проблемой оптимизации. Мне нужно оптимизировать портфель для возвращения омега мера. Я нашел предположения, что это можно сделать, используя дифференциальную эволюцию с помощью DEoptim(очень хорошие слайды Йоллина по инструментам R для оптимизации портфеля. Там можно найти оригинальный код).

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

optOmega <-function(x,ret,L){                     #function I want to optimize and 
retu = ret %*% x                                  # x is vector of asset weights
obj = -Omega(retu,L=L,method="simple")            #Omega from PerformanceAnalytics
weight.penalty = 100*(1-sum(x))^2
return( obj + weight.penalty )
}
L=0                                               #Parameter which defines loss 
                                                  #in Omega calculation
lower = rep(0,30)                                 #I want weight to be in bounds 
upper = rep(1,30)                                 # 0<=x<=1
res = DEoptim(optOmega,lower,upper,               #I have 30 assets in StockReturn
control=list(NP=2000,itermax=100,F=0.2,CR=0.8),
ret=coredata(StockReturn),L=L)

Омега рассчитывается как среднее значение (pmax(retu-L,0))/ среднее значение (pmax (l-retu 0))

Когда число активов очень мало (например, 5), я получаю результаты, которые в значительной степени меня удовлетворяют: вес активов в сумме составляет 0,999. который довольно близок к единице, и Омега такого портфеля больше, чем Омега любого отдельного актива (иначе, почему бы не инвестировать все в этот единственный актив). Этого можно достичь за 100 итераций. Но когда я увеличиваю количество активов до 30, результат не удовлетворяет. Сумма весов составляет 3 и более, а Омега ниже, чем у отдельных активов. Я думал, что это может быть из-за небольшого количества итераций (я использовал 1000), поэтому я пробовал 10 000, что мучительно медленно. Но результат в значительной степени тот же: весы в сумме превышают 1, а Омега не кажется оптимальной. Алгоритм с 10 активами, кажется, находит веса, близкие к 1, но Omega ниже, чем у одного актива.

Мой компьютер довольно старый и имеет Intel Core Duo 2 GHZ. Впрочем, нормально ли для такой оптимизации с 1000 итерациями работать ~40 минут?

В чем может быть проблема здесь? Является ли число итераций слишком маленьким, или моя интерпретация предоставленного алгоритма совершенно неверна. Спасибо за помощь!

1 ответ

Если я закомментирую control аргумент в вашем призыве к DEoptimУ меня гораздо лучшие результаты: сумма весов ближе к 1 (это было 3), и цель лучше, чем для портфелей с 1 активом (это было хуже).

# Sample data
library(xts)
n <- 600
k <- 26
StockReturn <- matrix( rnorm(n*k), nc=k )
colnames(StockReturn) <- LETTERS[1:k]
StockReturn <- xts( StockReturn, seq.Date(Sys.Date(), length=n, by=1) )

# Objective
library(PerformanceAnalytics)
optOmega <- function(x, ret = coredata(StockReturn), L=0) {
  penalty <- (1-sum(x))^2
  x <- x/sum(x)
  objective <- -Omega( ret %*% x, L=L, method="simple" ) 
  objective + penalty
}

# Optimization
library(DEoptim)
lower <- rep(0,k)
upper <- rep(1,k)
res <- DEoptim(
  optOmega, lower, upper,
#  control = list(NP=2000, itermax=100, F=0.2, CR=0.8),
  ret = coredata(StockReturn), L = L
)

# Check the results
w <- res$optim$bestmem
sum(w)       # Close to 1
w <- w / sum(w)
optOmega(w)  # Better (lower) that for the 1-asset portfolios
min( apply( diag(k), 2, optOmega ) )
Другие вопросы по тегам