Я пытаюсь реплицировать следующий код (на основе финансовой оптимизации в R by @EnricoSchumann), но я получил следующую ошибку. Код пытается решить модель Марковица с ограничением мощности. Кроме того, он также пытается ограничить значение минимального веса (winf
) отличным от нуля.R: Ошибка в sample.int(): пакет NMOF
Ошибка:
Error in sample.int(length(toSell), size = 1L) : invalid first argument
Код
library(NMOF)
resample <- function(x,...) x[sample.int(length(x),...)]
data <- list(m = colMeans(fundData), ## expected returns
Sigma = cov(fundData), ## expected var of returns
na = dim(fundData)[2L], ## number of assets
eps = 0.2/100, ## stepsize for LS
winf = 0.03, ## minimum weight
wsup = 0.5, ## maximum weight
lambda = 1)
cat("The Portfolio will consist of at least ", ceiling(1/data$wsup),
" assets. \n", sep = "")
OF <- function(w, data){
data$lambda * (w %*% data$Sigma %*% w) -
(1 - data$lambda) * sum(w * data$m)
}
neighbour <- function(w, data){
toSell <- which(w > data$winf)
toBuy <- which(w < data$wsup)
i <- toSell[sample.int(length(toSell), size = 1L)]
j <- toBuy[sample.int(length(toBuy), size = 1L)]
eps <- runif(1) * data$eps
eps <- min(w[i] - data$winf, data$wsup - w[j], eps)
w[i] <- w[i] - eps
w[j] <- w[j] + eps
w
}
#Initial Random Solution
makex<-function(data){
resample <- function(x,...)
x[sample.int(length(x),...)]
w0 <- numeric(data$na)
nAssets <- resample(ceiling(1/data$wsup):data$na,1L)
w0[sample(seq_len(data$na),nAssets)] <- runif(nAssets)
w0/sum(w0)
}
w0 <- makex(data)
algo <- list(x0 = w0, neighbour = neighbour, nS = 5000L)
system.time(sol1 <- LSopt(OF, algo, data))
Предложения приветствуются!
Было бы хорошо, если бы вы показали, где в вашем коде произошла ошибка, это после 'makex (dat)' или ... ?? Можете ли вы поделиться примером «данных», чтобы мы могли видеть, есть ли все переменные, и код имеет смысл? спасибо – user20650
@ user20650: Я редактировал свой вопрос, чтобы показать, где происходит ошибка. Я предполагаю, что это происходит при выполнении соседней функции, т. Е. «Сосед». Я использовал данные 'fundData' из пакета NMOF. Набор данных состоит из возвращаемых значений 200 активов. –
Ваш 'сосед()' вызывает ошибку, т. Е. 'ToSell' или' toBuy' может стать 'integer (0)'. Если вы используете 'sample()' вместо 'sample.int()', ошибка не будет (но это не похоже на существенное решение). – cuttlefish44