R: sample.int() 错误:NMOF 包
R: Error in sample.int(): NMOF Package
我正在尝试复制以下代码(基于@EnricoSchumann 的 R 中的财务优化),但出现以下错误。该代码试图解决带有基数约束的 Markowitz 模型。此外,它还尝试将最小权重 (winf
) 的值限制为非零。
错误:
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))
欢迎提出建议!
您将需要不同的邻域函数来实现您想要的,或者需要不同的方式来实现约束。
要查看邻里不工作,请设置
w0 <- numeric(data$na)
w0[1:2] <- 0.5
离开这个投资组合的有效举措是什么?该函数将减少两个权重之一。然后
它会增加任何零重量,因为它们都是
满足w < data$wsup
;但它会完全忽略
您设置的winf
。这不是错误
功能,因为它从来就不是为了这种情况
winf > 0
.
强制执行最大基数的邻域是
提供于
关于'A comparison of some heuristic optimization methods'.
的评论
但可能最简单的方法就是做到这一点
两步优化:在外部优化中,你
只需 select 项资产即可投入
文件夹。 (有关示例,请参见
Asset selection with Local Search.)
然后,对于给定的 selection 资产,解决你的
均值-方差问题。
我正在尝试复制以下代码(基于@EnricoSchumann 的 R 中的财务优化),但出现以下错误。该代码试图解决带有基数约束的 Markowitz 模型。此外,它还尝试将最小权重 (winf
) 的值限制为非零。
错误:
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))
欢迎提出建议!
您将需要不同的邻域函数来实现您想要的,或者需要不同的方式来实现约束。
要查看邻里不工作,请设置
w0 <- numeric(data$na)
w0[1:2] <- 0.5
离开这个投资组合的有效举措是什么?该函数将减少两个权重之一。然后
它会增加任何零重量,因为它们都是
满足w < data$wsup
;但它会完全忽略
您设置的winf
。这不是错误
功能,因为它从来就不是为了这种情况
winf > 0
.
强制执行最大基数的邻域是 提供于 关于'A comparison of some heuristic optimization methods'.
的评论但可能最简单的方法就是做到这一点 两步优化:在外部优化中,你 只需 select 项资产即可投入 文件夹。 (有关示例,请参见 Asset selection with Local Search.) 然后,对于给定的 selection 资产,解决你的 均值-方差问题。