2013-05-07 4 views
3

Я хочу построить свою собственную оптимизацию с использованием функции оптимизации R.Оптимизация для векторного использования Оптимизация R

Целевая функция представляет собой отношение диверсификации, чтобы максимизировать его (надеюсь, что его правильно):

div.ratio<-function(weight,vol,cov.mat){ 
    dr<-(t(weight) %*% vol)/(sqrt(t(weight) %*% cov.mat %*% (weight))) 
    return(-dr) 
} 

А пример:

rm(list=ls()) 
require(RCurl) 
sit = getURLContent('https://github.com/systematicinvestor/SIT/raw/master/sit.gz',  binary=TRUE, followlocation = TRUE, ssl.verifypeer = FALSE) 
con = gzcon(rawConnection(sit, 'rb')) 
source(con) 
close(con) 
load.packages('quantmod') 


data <- new.env() 

tickers<-spl("VTI,VGK,VWO,GLD,VNQ,TIP,TLT,AGG,LQD") 
getSymbols(tickers, src = 'yahoo', from = '1980-01-01', env = data, auto.assign = T) 
for(i in ls(data)) data[[i]] = adjustOHLC(data[[i]], use.Adjusted=T) 

bt.prep(data, align='remove.na', dates='1990::2013') 

prices<-data$prices[,-10] #don't include cash 
ret<-na.omit(prices/mlag(prices) - 1) 
vol<-apply(ret,2,sd) 
cov.mat<-cov(ret) 

optimize(div.ratio, 
    weight, 
    vol=vol, 
    cov.mat=cov.mat, 
    lower=0, #min constraints 
    upper=1, #max 
    tol = 0.00001)$minimum 

Я получаю следующее сообщение об ошибке, которое, кажется, это что пакет оптимизации не выполняет векторную оптимизацию. Что я сделал не так?

Error in t(weight) %*% cov.mat : non-conformable arguments 
+0

Также как вы устанавливаете ограничение, которое оно суммирует с 1 для функции? – user1234440

ответ

8

Прежде всего, weight не имеет никаких оснований, чтобы быть в вызове оптимизируют, если это то, что вы пытаетесь оптимизировать. Затем optimize предназначен для одномерной оптимизации, пока вы пытаетесь решить задачу для вектора весов. Вместо этого вы можете использовать функцию optim.

Что касается вашего второго вопроса в комментариях, как вы устанавливаете ограничение, которое оно суммирует до 1 для функции? Вы можете использовать трюк, предложенный здесь: How to set parameters' sum to 1 in constrained optimization, т.е. переписать целевую функцию следующим образом:

div.ratio <- function(weight, vol, cov.mat){ 
    weight <- weight/sum(weight) 
    dr <- (t(weight) %*% vol)/(sqrt(t(weight) %*% cov.mat %*% (weight))) 
    return(-dr) 
} 

Это дает:

out <- optim(par  = rep(1/length(vol), length(vol)), # initial guess 
      fn  = div.ratio, 
      vol  = vol, 
      cov.mat = cov.mat, 
      method = "L-BFGS-B", 
      lower = 0, 
      upper = 1) 

Ваши оптимальные веса:

opt.weights <- out$par/sum(out$par) 
# [1] 0.154271776 0.131322307 0.073752360 0.030885856 0.370706931 0.049627627 
# [7] 0.055785740 0.126062746 0.007584657 

pie(opt.weights, names(vol)) 

enter image description here

Смежные вопросы