Я пытаюсь использовать функцию chart.EfficientFrontier в пакете аналитики портфолио в R для создания диаграммы эффективного пограничного объекта, который я создал, но он продолжает давать сбой. По сути, я пытаюсь найти границу, которая сведет к минимуму аннулированное стандартное отклонение. В конце концов, как только я заработаю, я также хотел бы максимизировать годовой доход.
Сначала я создал годовую функцию стандартного отклонения, используя этот код.
pasd <- function(R, weights){
as.numeric(StdDev(R=R, weights=weights)*sqrt(12)) # hardcoded for monthly data
# as.numeric(StdDev(R=R, weights=weights)*sqrt(4)) # hardcoded for quarterly data
}
Я импортировал CSV-файл с ежемесячной доходностью, и мой объект портфеля выглядит следующим образом:
> prt
**************************************************
PortfolioAnalytics Portfolio Specification
**************************************************
Call:
portfolio.spec(assets = colnames(returns))
Number of assets: 3
Asset Names
[1] "Global REITs" "Au REITs" "Au Util and Infra"
Constraints
Enabled constraint types
- leverage
- long_only
Objectives:
Enabled objective names
- mean
- pasd
Теперь я успешно создаю эффективный пограничный объект, используя эту строку:
prt.ef <- create.EfficientFrontier(R = returns, portfolio = prt, type = "DEoptim", match.col = "pasd")
Но когда я пытаюсь построить его, я получаю следующие сообщения об ошибках.
> chart.EfficientFrontier(prt.ef, match.col="pasd")
Error in StdDev(R = R, weights = weights) :
argument "weights" is missing, with no default
In addition: There were 26 warnings (use warnings() to see them)
Error in StdDev(R = R, weights = weights) :
argument "weights" is missing, with no default
Error in StdDev(R = R, weights = weights) :
argument "weights" is missing, with no default
Error in xlim[2] * 1.15 : non-numeric argument to binary operator
Кто-нибудь знает, почему это так? Когда я использую summary(prt.ef), я вижу веса, но почему функция chart.EfficientFrontier не работает?
chart.EfficientFrontier
предполагает, что сможет вызыватьpasd
без весов для вычисления сигмы для каждого актива и с весами для вычисления сигмы портфеля. Чтобы устранить сообщение об ошибке, заставьтеpasd
работать какStdDev
, используяpasd <- function(R, weights=NULL) as.numeric(StdDev(R=R, weights=weights)*sqrt(12))
. Кроме того, чтобы провести последовательный анализ, вы должны привести доходность в годовом исчислении, но тогда оптимизация будет рассчитывать одинаковые веса для месячного и годового портфелей. - person WaltS   schedule 03.06.2015pasd
, как вы предложили, но chart.EfficientFrontier по-прежнему выдает мне ошибки.chart.EfficientFrontier(prt.ef, match.col="pasd") Error in StdDev(R = R, weights = weights) : object 'NuLL' not found Error in StdDev(R = R, weights = weights) : object 'NuLL' not found Error in StdDev(R = R, weights = weights) : object 'NuLL' not found Error in xlim[2] * 1.15 : non-numeric argument to binary operator
- person user3381431   schedule 04.06.2015