PortfolioAnalytics в r не примет пользовательский return_objective, даже если он идентичен тому, который работает в PerformanceAnalytics? - PullRequest
0 голосов
/ 06 мая 2019

У меня возникают проблемы с выполнением настраиваемой цели возврата в PortfolioAnalytics.

Ниже я показываю повторяемый пример, в котором работает SortinoRatio, но простое переименование функции приводит к тому, что она возвращает ошибку. Похоже на ошибку, но я мог пропустить шаг, чтобы распознать пользовательскую цель.

library(PortfolioAnalytics)
library(PerformanceAnalytics)
require(xts)
require(doParallel)
registerDoParallel()

data(indexes)
R <- indexes[,1:4]
MAR = 0.005

Переименовать Сортино

SortinoRatioRenamed <- SortinoRatio
> identical(SortinoRatio,SortinoRatioRenamed)
[1] TRUE

SortinoRatio(R,MAR=MAR,weights=(rep(1/(ncol(R)),ncol(R))))
SortinoRatioRenamed(R,MAR=MAR,weights=(rep(1/(ncol(R)),ncol(R))))

#Both version return:
> SortinoRatio(R,MAR=MAR,weights=(rep(1/(ncol(R)),ncol(R))))
                           portfolio.returns
Sortino Ratio (MAR = 0.5%)        0.06213398
> SortinoRatioRenamed(R,MAR=MAR,weights=(rep(1/(ncol(R)),ncol(R))))
                           portfolio.returns
Sortino Ratio (MAR = 0.5%)        0.06213398

Таким образом, переименованная функция работает как положено

Запустить случайную оптимизацию, используя цель возврата SortinoRatio:

SortinoConstr <- NULL
SortinoConstr <- constraint_v1(assets = colnames(indexes[,1:4]), min = 0.05, max = 1, min_sum=.99, max_sum=1.01, weight_seq = generatesequence(by=.001))
SortinoConstr <- add.objective(constraints=SortinoConstr, type="return", name="SortinoRatio",  enabled=TRUE, arguments = list(MAR=MAR))
SortinoConstr <- add.objective(constraints=SortinoConstr, type="return", name="mean",  enabled=TRUE, multiplier=0) # multiplier 0 makes it available for plotting, but not affect optimization

SortinoResult<-optimize.portfolio(R=indexes[,1:4], constraints=SortinoConstr, optimize_method='random', search_size=2000, trace=TRUE, verbose=TRUE)
SortinoResult

***********************************
PortfolioAnalytics Optimization
***********************************

Call:
optimize.portfolio(R = indexes[, 1:4], constraints = SortinoConstr, 
    optimize_method = "random", search_size = 2000, trace = TRUE, 
    verbose = TRUE)

Optimal Weights:
      US Bonds    US Equities Int'l Equities    Commodities 
         0.841          0.067          0.050          0.050 

Objective Measures:
SortinoRatio 
      0.1609 


    mean 
0.006832 

Работает как положено.

Но: Запустите случайную оптимизацию, используя цель возврата SortinoRatioRenamed: (единственное отличие - имя функции)

SortinoConstr2 <- NULL
SortinoConstr2 <- constraint_v1(assets = colnames(indexes[,1:4]), min = 0.05, max = 1, min_sum=.99, max_sum=1.01, weight_seq = generatesequence(by=.001))
SortinoConstr2 <- add.objective(constraints=SortinoConstr2, type="return", name="SortinoRatioRenamed",  enabled=TRUE, arguments = list(MAR=MAR))
SortinoConst2r <- add.objective(constraints=SortinoConstr2, type="return", name="mean",  enabled=TRUE, multiplier=0) # multiplier 0 makes it available for plotting, but not affect optimization

SortinoResult2<-optimize.portfolio(R=indexes[,1:4], constraints=SortinoConstr2, optimize_method='random', search_size=2000, trace=TRUE, verbose=TRUE)
SortinoResult2

Error in search[i] <- ifelse(try(rp_objective_results[[i]]$out), rp_objective_results[[i]]$out,  : 
  replacement has length zero

и возвращает ошибку: «Ошибка в поиске [i] <- ifelse (try (rp_objective_results [[i]] $ out), rp_objective_results [[i]] $ out,: замена имеет нулевую длину "</p>

Я видел множество примеров создания пользовательских функций, но не повезло, запустив какие-либо демонстрационные функции, какие-нибудь мысли о том, как заставить это работать?

Редактировать: включено "идентично" выше для дальнейшего подтверждения эквивалентности

...