Опитвам се да използвам функцията chart.EfficientFrontier в пакета portfolioanalytics в 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
както предложихте, но графиката.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