我为投资组合设置了一组原始权重,并且需要生成新的权重,其与原始数据的偏差不会超过2%。新的绝对权重(原始权重+新的增量)必须总和为1,并且绝对权重也必须大于0(即,这是一个只能做多的投资组合)
但是问题是,现在我的有效体重增加了,方法是将我的绝对体重加起来等于1,然后它们超出[-0.02,0.02]有效体重界限。
有什么方法可以使我的权重总和达到统一,以及确保我的活动权重保持在边界之内,并且我的投资组合的绝对权重仅大于零。
任何建议将不胜感激!
答案 0 :(得分:0)
只要您没有任何特定的发行要求,就可以使用以下蛮力方法。
首先,我们定义两个函数以生成与给定total > 0
相加的随机数:
get_weights <- function(N, total = 1)
total * diff(c(0, sort(runif(N-1)), 1))
并归零:
get_weight_changes <- function(N, ratio = N)
(get_weights(N) - 1/N) / ratio
有关该算法的说明,请参见this question。 ratio
参数是一个经验参数,用于控制将典型更改与典型绝对权重进行比较的大小。如果尺寸太小,您将不得不尝试很多随机的重量变化,然后才能满足您的条件。如果太大,您的相对体重变化将大大小于允许的范围。
接下来,我们生成随机权重和随机权重变化。直到我们达到满足最小变化要求的随机权重变化向量为止,后者都会完成:
N <- 40
ratio <- 300
w <- get_weights(N)
dw <- get_weight_changes(N, ratio)
while (any(abs(dw/w) > 0.02)) {
dw <- get_weight_changes(N, ratio)
}
以下是体重变化的典型直方图:
正如人们所看到的,它们远非均匀,但重量变化可以满足所有要求。
侧面说明:由于可能需要很多随机数,因此我使用
library(dqrng)
dqRNGkind("Xoroshiro128+")
dqset.seed(42)
runif <- dqrunif
使用dqrng
包中的快速RNG