Я написал некоторый код, чтобы продемонстрировать преимущества диверсификации по ряду активов при планировании портфеля.
#Portfolio variance
y <- function(x) {
vars <- rnorm(n = x, mean = 0.7, sd = 0.07)
# rho generating function:
ranrho <- function(z) {
c(rep(0, times = z), runif(n = x-z, min = -1, max = 0.9)) + 0.1
}
#you get the lower diagonal of the covar matrix:
rhold <- sapply(1:x, ranrho)
rhold
#and the full corr matrix
corr <- rhold + t(rhold)
corr <- corr * sqrt(vars)
corr <- t(t(corr) * sqrt(vars))
#And the variance-covariance matrix:
vcov <- corr + if(x==1) {vars
} else {diag(vars)}
#And recover the portfolio variance through the following equation
portvar <- (1/x^2)*sum(vars) + if(x==1) { as.numeric(0)
} else {(1/x^2)*(sum(corr)/2)}
return(portvar)
}
y(1)
y(5)
y(10)
y(20)
y(50)
y(100)
plot(1:100, y(1:100))
y возвращает одно значение для каждого введенного значения x. х - целое число, представляющее количество активов, а у - последующая дисперсия портфеля. У меня есть примеры для различных значений x, и каждый возвращает разумное значение для y без проблем.
Моя проблема в том, что я получаю следующую ошибку при попытке построить свою функцию:
Ошибка в rhold + t (rhold): недопустимые массивы
Дополнительно: предупреждающее сообщение:
В 1: x: числовое выражение имеет 100 элементов: используется только первый
Во-первых, поскольку код работает, когда я пишу y ([что угодно]), rhold и t (rhold) явно согласуются. Я не уверен, что означает вторая ошибка. Я неправильно использую функцию заговора?
Другая проблема - я смотрел, но не могу найти, как можно построить функцию, которая принимает только целочисленные значения x в своей области, но возвращает значения y на непрерывной вещественной линии.
Благодарен за любую помощь.