Пользовательские ожидаемые доходы в пакете 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 или около того указано, что он принимает аргумент моментальных значений только тогда, когда цель возвращается. Даже если вы уже заявили, что это ограничение.

Другие вопросы по тегам