Оптимизация портфеля с дифференциальной эволюцией
Я столкнулся с проблемой оптимизации. Мне нужно оптимизировать портфель для возвращения омега мера. Я нашел предположения, что это можно сделать, используя дифференциальную эволюцию с помощью 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 ) )