как использовать пакет fportfolio в R для ввода не временных рядов? - PullRequest
1 голос
/ 08 октября 2019

Для пакета fportfolio вам необходимо ввести в качестве входных данных временной ряд возвратов, и он внутренне рассчитывает ожидаемый доход и дисперсию временного ряда для того, чтобы затем использовать его в таких функциях, как портфель границы или тангентность порта. Но в моем случае у меня уже есть ожидаемая матрица возврата и ковариационная матрица дисперсии, и я хочу использовать функции fportfolio. Как я могу это сделать? заранее благодарю.

1 Ответ

0 голосов
/ 09 октября 2019

Я не пользуюсь fportfolio;но если вам нужны только средние значения и дисперсионно-ковариационная матрица, вы можете смоделировать возвраты, которые имеют точно желаемую статистику.

Предположим, у вас есть ожидаемая дисперсионно-ковариационная матрица S и ожидаемый вектор возврата m. Я составляю пример данных для 5 активов. (Я только создаю матрицу A, потому что это простой способ вычислить действительную матрицу дисперсии-ковариации.)

na <- 5 
nobs <- 6
A <- array(rnorm(nobs*na),
           dim = c(nobs, na))*0.01

S <- cov(A)
m <- runif(na, min = 0, max = 0.0005)

Так что теперь у нас есть S и m. Мы начнем с создания вашей входной матрицы;назовите его B.

B <- array(rnorm(  nrow(S)+1 * nrow(S)),
           dim = c(nrow(S)+1,  nrow(S)))

Поскольку в конечном итоге он должен содержать именно вашу статистику, мы должны очистить его: удалить все остаточные корреляции, установить все значения волатильности равными 1, а средние значения равными 0.

B <- B %*% backsolve(chol(cov(B)),
                     diag(1, nrow(S)))
B <- t(B) - colMeans(B)
B <- B / apply(B, 1, sd)
B <- t(B)

Проверка. (Из-за числовой точности среднее значение не будет точно равно 0 и т. Д.)

round(apply(B, 2, sd), 10)
## [1] 1 1 1 1 1
round(apply(B, 2, mean), 10)
## [1] 0 0 0 0 0
round(cov(B), 10)
##      [,1] [,2] [,3] [,4] [,5]
## [1,]    1    0    0    0    0
## [2,]    0    1    0    0    0
## [3,]    0    0    1    0    0
## [4,]    0    0    0    1    0
## [5,]    0    0    0    0    1

А теперь убедитесь, что B имеет правильные свойства.

B <- B %*% chol(S)
B <- t(B) + m
B <- t(B)

all.equal(cov(B), S)
## [1] TRUE

all.equal(colMeans(B), m)
## [1] TRUE
...