模拟有效权重在[-0.02,0.02]之间且绝对权重总和为1的投资组合

时间:2018-06-28 16:44:29

标签: r

我为投资组合设置了一组原始权重,并且需要生成新的权重,其与原始数据的偏差不会超过2%。新的绝对权重(原始权重+新的增量)必须总和为1,并且绝对权重也必须大于0(即,这是一个只能做多的投资组合)

  1. 我使用了runif(n = 40,-0.02,0.02)来产生我的有效体重
  2. 我将有效重量添加到原始重量中以获得新的绝对重量
  3. 然后我计算所有权重的总和,并将每个权重除以总和,以使所有权重之和为1。
  4. 然后我获取所有小于零的新绝对权重,并在正权重之间重新分配多余的“负权重”

但是问题是,现在我的有效体重增加了,方法是将我的绝对体重加起来等于1,然后它们超出[-0.02,0.02]有效体重界限。

有什么方法可以使我的权重总和达到统一,以及确保我的活动权重保持在边界之内,并且我的投资组合的绝对权重仅大于零。

任何建议将不胜感激!

1 个答案:

答案 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 questionratio参数是一个经验参数,用于控制将典型更改与典型绝对权重进行比较的大小。如果尺寸太小,您将不得不尝试很多随机的重量变化,然后才能满足您的条件。如果太大,您的相对体重变化将大大小于允许的范围。

接下来,我们生成随机权重和随机权重变化。直到我们达到满足最小变化要求的随机权重变化向量为止,后者都会完成:

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

以下是体重变化的典型直方图:

enter image description here

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

侧面说明:由于可能需要很多随机数,因此我使用

library(dqrng)
dqRNGkind("Xoroshiro128+")
dqset.seed(42)
runif <- dqrunif

使用dqrng包中的快速RNG