У меня возникают проблемы с выполнением настраиваемой цели возврата в 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>
Я видел множество примеров создания пользовательских функций, но не повезло, запустив какие-либо демонстрационные функции, какие-нибудь мысли о том, как заставить это работать?
Редактировать: включено "идентично" выше для дальнейшего подтверждения эквивалентности