R 模拟活动权重介于[-0.02,0.02]和绝对权重总和为1之间的投资组合

R 模拟活动权重介于[-0.02,0.02]和绝对权重总和为1之间的投资组合,r,R,我有一套投资组合的原始权重,需要生成与原始数据偏差不超过2%的新权重。新的绝对权重(原始权重+新增量)之和必须为1,绝对权重也必须大于0(即,它是一个只做多的投资组合) 我使用runif(n=40,-0.02,0.02)生成活动权重 我将活动权重添加到原始权重中,以获得新的绝对权重 然后,我计算所有权重的总和,并将每个权重除以总和,以得到所有权重的总和为1 然后,我获取任何小于零的新绝对权重,并在正权重之间重新分配多余的“负权重” 但问题是,现在我的活动权重通过将绝对权重之和增加到1而增大,然后

我有一套投资组合的原始权重,需要生成与原始数据偏差不超过2%的新权重。新的绝对权重(原始权重+新增量)之和必须为1,绝对权重也必须大于0(即,它是一个只做多的投资组合)

  • 我使用runif(n=40,-0.02,0.02)生成活动权重
  • 我将活动权重添加到原始权重中,以获得新的绝对权重
  • 然后,我计算所有权重的总和,并将每个权重除以总和,以得到所有权重的总和为1
  • 然后,我获取任何小于零的新绝对权重,并在正权重之间重新分配多余的“负权重”
  • 但问题是,现在我的活动权重通过将绝对权重之和增加到1而增大,然后它们超出了[-0.02,0.02]活动权重界限

    有什么方法可以让我的权重总和为一,同时确保我的活动权重保持在边界内,我的投资组合只有绝对权重大于零


    如有任何建议,将不胜感激

    只要您没有任何特定的分发需求,就可以使用以下暴力方法

    首先,我们定义两个函数来生成随机数,其总和为给定的
    total>0

    get_weights <- function(N, total = 1)
      total * diff(c(0, sort(runif(N-1)), 1))
    
    这里是结果权重变化的典型直方图:

    正如人们所看到的,它们远非均匀的,但重量的变化满足了所有的要求

    旁注:由于可能需要很多随机数,我使用

    library(dqrng)
    dqRNGkind("Xoroshiro128+")
    dqset.seed(42)
    runif <- dqrunif
    
    库(dqrng)
    dqRNGkind(“Xoroshiro128+”)
    dqset.种子(42)
    
    runif欢迎使用堆栈溢出!你能为你现在正在做的事情添加示例代码吗?您是否要求如何分配重量变化(绝对或相对)?
    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