Имитация портфеля с активными весами между [-0.02,0.02] и суммой абсолютных весов до 1 - PullRequest
0 голосов
/ 28 июня 2018

У меня есть оригинальный набор весов для портфеля, и мне нужно создать новые веса, которые не отклоняются более чем на 2% от исходных данных. Новые абсолютные веса (исходные веса + новое приращение) должны быть равны единице, а абсолютные веса также должны быть больше 0 (т. Е. Это портфель только для длинных позиций)

  1. Я использовал runif (n = 40, -0.02, 0.02) для генерации своих активных весов
  2. Я добавил активные веса к исходным весам, чтобы получить новые абсолютные веса
  3. Затем я вычислил сумму всех весов и разделил каждый отдельный вес на сумму, чтобы все веса были суммированы до 1.
  4. Затем я беру любые новые абсолютные веса, которые меньше нуля, и перераспределяю избыточный «отрицательный вес» между положительными весами

Но проблема в том, что теперь мои активные веса увеличиваются, когда мои абсолютные веса равны 1, а затем они выходят за границы [-0.02,0.02] активного веса.

Можно ли каким-то образом заставить мои веса суммироваться до единицы, а также следить за тем, чтобы мои активные веса оставались в пределах границ, а мой портфель имел только абсолютные веса, которые больше нуля.

Любые предложения будут оценены!

1 Ответ

0 голосов
/ 29 июня 2018

Пока у вас нет особых требований к распространению, вы можете использовать следующий метод перебора.

Сначала мы определим две функции для генерации случайных чисел, которые суммируются с данным 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

См. этот вопрос для заметок по алгоритму. Аргумент 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) 
}

Вот типичная гистограмма результирующих изменений веса:

enter image description here

Как видно, они далеко не одинаковы, но изменения веса отвечают всем требованиям.

Примечание: поскольку потенциально требуется очень много случайных чисел, я использую

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

для использования на быстрых ГСЧ из пакета dqrng

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...