Пользовательские ожидаемые доходы в пакете Portfolio Analytics
У меня проблемы с включением ожидаемых пользовательских возвратов в пакет Portfolio Analytics. Обычно ожидаемые доходы представляют собой некоторые профессиональные ожидания / взгляды или рассчитываются отдельно от фундаментальных показателей. Portfolio Analytics позволяет создать пользовательскую функцию моментов для вычисления моментов из прошлых результатов, но я не понимаю, как включить уже рассчитанные результаты в задачу оптимизации. Любая помощь приветствуется, и вот небольшой примерный набор данных:
#Download package and sample returns
library(PortfolioAnalytics)
library(PerformanceAnalytics)
data(edhec)
returns <- tail(edhec[,1:4], 10)
#Example expected return xts that I'm usually working with. Calculated separately.
N <- 10
M <- 4
views <- as.xts(data.frame(matrix(rnorm(N*M,mean=0,sd=0.05), N, M)), order.by = index(returns))
colnames(views) <- colnames(returns)
Давайте создадим базовое портфолио с некоторыми целями.
pf <- portfolio.spec(assets = colnames(returns))
pf <- add.constraint(portfolio = pf, type = "full_investment")
pf <- add.constraint(portfolio = pf, type = "long_only")
pf <- add.objective(portfolio = pf, type = "return", name = "mean")
pf <- add.objective(portfolio = pf, type = "risk", name = "StdDev")
Теперь я хотел бы оптимизировать портфель pf для каждого периода и принимать во внимание представления (ожидаемые доходы за этот период), но на данный момент у меня заканчиваются идеи.
2 ответа
Теперь, после определения щедрости, я понимаю, что здесь уже даны ответы на вопросы. Я подведу итоги как можно лучше.
Когда вы звоните optimize.portfolio
есть необязательный параметр momentFUN
, который определяет моменты вашего портфолио. Одним из его аргументов является momentargs
, через который вы можете пройти через optimize.portfolio
,
Во-первых, вам нужно выбрать набор ожидаемых доходов. Я возьму на себя последнюю запись в вашем views
Временные ряды:
my.expected.returns = views["2009-08-31"]
Вам также понадобится ваша собственная ковариационная матрица. Я вычислю это из твоего returns
:
my.covariance.matrix = cov(returns)
Наконец, вам нужно определить momentargs
, который представляет собой список, состоящий из mu
(ваш ожидаемый доход), sigma
(ваша ковариационная матрица), а также третий и четвертый моменты (которые мы установим на ноль):
num_assets = ncol(current.view)
momentargs = list()
momentargs$mu = my.expected.returns
momentargs$sigma = my.covariance.matrix
momentargs$m3 = matrix(0, nrow = num_assets, ncol = num_assets ^ 2)
momentargs$m4 = matrix(0, nrow = num_assets, ncol = num_assets ^ 3)
Теперь вы готовы оптимизировать свое портфолио:
o = optimize.portfolio(R = returns, portfolio = pf, momentargs = momentargs)
Когда вы оптимизируете с ROI, и вы оправдаете свои ожидания как momentargs = expectations
вам нужно добавить
add.objective(eff.port, type = "return", name = "mean")
Как в коде функции optimize.portfolio
в строке 382 или около того указано, что он принимает аргумент моментальных значений только тогда, когда цель возвращается. Даже если вы уже заявили, что это ограничение.