R:sample.int() 中的错误:NMOF 包

标签 r function random heuristics portfolio

我正在尝试复制以下代码(基于 @EnricoSchumann 的 R 中的财务优化),但出现以下错误。该代码尝试用基数约束求解马科维茨模型。此外,它还尝试将最小权重 (winf) 的值限制为非零。

错误:

sample.int(length(toSell), size = 1L) 中的错误:第一个参数无效

代码

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))

欢迎提出建议!

最佳答案

您将需要不同的邻域函数来实现您想要的效果,或者需要不同的方式来实现约束。

要确保邻居不起作用,请设置

w0 <- numeric(data$na)
w0[1:2] <- 0.5

什么是离开该投资组合的有效举措?该函数将减少两个权重之一。然后 它会增加任何零重量,因为它们都 满足w < data$wsup ;但它会完全忽略 winf你设置。这不是一个错误 函数,因为它从来就不适合这种情况 winf > 0 .

强制执行最大基数的邻域是 提供于 Remarks on 'A comparison of some heuristic optimization methods' .

但可能最简单的方法就是做到这一点 两步优化:在外部优化中,您 只需选择要放入的 Assets 文件夹。 (例如,请参见 Asset selection with Local Search .) 然后,对于给定的 Assets 选择,解决您的问题 均值-方差问题。

关于R:sample.int() 中的错误:NMOF 包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40053463/

相关文章:

r - 在 R 中提取 bz2 文件

R - sqldf() 返回零行数据框

r - 从 real() 对象中减去最后 N 个值

ios - 两个数字之间随机 float 的概率是多少?

perl - Perl 的 rand 参数可以有多大?

r - 将字符串作为代码传递以使用 data.table 汇总多列

excel - 如何在 vlookup 函数中使搜索范围动态化

php - 如何循环遍历多个 MySQL 列并返回单行结果?

c++ - 无法弄清楚如何通过仅使用类的函数删除整个链表

python - 在 Swift 中返回整数列表