【问题标题】:Simulate a portfolio with active weights between [-0.02,0.02] and absolute weights sum to 1模拟活跃权重在 [-0.02,0.02] 之间且绝对权重总和为 1 的投资组合
【发布时间】:2018-06-28 16:44:28
【问题描述】:

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

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

但问题在于,现在我的活动权重通过让我的绝对权重总和为 1 来扩大,然后它们超出 [-0.02,0.02] 活动权重界限。

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

任何建议将不胜感激!

【问题讨论】:

  • 欢迎来到 Stack Overflow!您可以为您现在正在做的事情添加示例代码吗?您对如何分配权重变化(绝对或相对)有任何要求吗?

标签: r


【解决方案1】:

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

首先我们定义两个函数来生成随机数,它们的和等于给定的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) 
}

这是一个典型的重量变化直方图:

正如人们所看到的,它们远非统一,但重量变化满足所有要求。

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

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

使用dqrng 包中的快速RNG

【讨论】:

    猜你喜欢
    • 2016-09-12
    • 1970-01-01
    • 2020-01-22
    • 2022-01-18
    • 1970-01-01
    • 2016-08-18
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    相关资源
    最近更新 更多