Невозможно использовать SharpeRatio в PortfolioAnalytics для оптимизации портфеля

Я пытаюсь использовать целевую функцию SharpeRatio для оптимизации моего портфеля, но получаю следующую ошибку:

objective name SharpeRatio generated an error or warning: Error in t(w) %*% M3 : requires numeric/complex matrix/vector arguments

Я искал, и кажется, что проблема связана с весами, но я не могу найти способ ее решить.

Следующий код повторяет ошибку:

library(PortfolioAnalytics)
data(edhec)
asset_names <- colnames(edhec)
port_spec <- portfolio.spec(asset_names)
port_spec <- add.constraint(portfolio = port_spec, type = "weight_sum", min_sum = 0.99, max_sum = 1.01)
port_spec <- add.constraint(portfolio = port_spec, type = "long_only")
port_spec <- add.objective(portfolio = port_spec, type = "return", name = "SharpeRatio", FUN = "StdDev")
opt_DE <- optimize.portfolio(R = edhec, portfolio = port_spec, optimize_method = "DEoptim", search_size=5000, trace = TRUE, traceDE = 0)

Запросил, sessionInfo()

R version 3.4.3 (2017-11-30)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows >= 8 x64 (build 9200)

Matrix products: default 

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] FactoMineR_1.39               nFactors_2.3.3                lattice_0.20-35              
 [4] boot_1.3-20                   psych_1.7.8                   MASS_7.3-47                  
 [7] PortfolioAnalytics_1.0.3636   PerformanceAnalytics_1.4.3541 foreach_1.4.4                
[10] xts_0.10-1                    zoo_1.8-0                    

loaded via a namespace (and not attached):
 [1] cluster_2.0.6             leaps_3.0                 mnormt_1.5-5              scatterplot3d_0.3-40     
 [5] quadprog_1.5-5            ROI_0.3-0                 TTR_0.23-2                tools_3.4.3              
 [9] quantmod_0.4-12           parallel_3.4.3            grid_3.4.3                nlme_3.1-131             
[13] registry_0.5              iterators_1.0.9           yaml_2.1.16               GenSA_1.1.7              
[17] codetools_0.2-15          curl_3.1                  slam_0.1-42               ROI.plugin.quadprog_0.2-5
[21] compiler_3.4.3            flashClust_1.01-2         DEoptim_2.2-4             foreign_0.8-69           


person Community    schedule 30.01.2018    source источник
comment
Я не смог воспроизвести эту ошибку. Не могли бы вы добавить свой sessionInfo()?   -  person cmaher    schedule 30.01.2018
comment
Сделанный! Я также добавил строку кода, которую мне не хватало .. (мой плохой ..)   -  person    schedule 30.01.2018


Ответы (1)


Я бы порекомендовал проверить демо-файлы PortfolioAnalytics. Один из них, в частности

Демонстрационный коэффициент Макса Шарпа:
https://github.com/R-Finance/PortfolioAnalytics/blob/master/demo/demo_max_Sharpe.R

будет особенно полезно для ссылки. Прочитав код и комментарии, вы увидите несколько вещей. Сначала вы указали противоречивые аргументы, например. type = "return", name = "SharpeRatio", FUN = "StdDev".

"return" — это тип ограничения, "StdDev" — это имя ограничения "risk", а "SharpeRatio" — это то, что вы пытаетесь решить.

Если вы используете метод "ROI" для оптимизации, вам нужно будет указать, что вы хотите максимизировать коэффициент Шарпа в оптимизации "maxSR=TRUE", если вы хотите использовать метод оптимизации "DEOptim", вам нужно ослабить ограничения кредитного плеча.

Примеры каждого можно найти ниже. Они взяты непосредственно из упомянутого выше демонстрационного файла.

library(PortfolioAnalytics)

# Examples of solving optimization problems to maximize mean return per unit StdDev

data(edhec)
R <- edhec[, 1:8]
funds <- colnames(R)

# Construct initial portfolio
init.portf <- portfolio.spec(assets=funds)
init.portf <- add.constraint(portfolio=init.portf, type="full_investment")
init.portf <- add.constraint(portfolio=init.portf, type="long_only")
init.portf <- add.objective(portfolio=init.portf, type="return", name="mean")
init.portf <- add.objective(portfolio=init.portf, type="risk", name="StdDev")
init.portf


# The default action if "mean" and "StdDev" are specified as objectives with
# optimize_method="ROI" is to maximize quadratic utility. If we want to maximize
# Sharpe Ratio, we need to pass in maxSR=TRUE to optimize.portfolio.

maxSR.lo.ROI <- optimize.portfolio(R=R, portfolio=init.portf, 
                                   optimize_method="ROI", 
                                   maxSR=TRUE, trace=TRUE)
maxSR.lo.ROI

# Although the maximum Sharpe Ratio objective can be solved quickly and accurately
# with optimize_method="ROI", it is also possible to solve this optimization
# problem using other solvers such as random portfolios or DEoptim. These
# solvers have the added flexibility of using different methods to calculate
# the Sharpe Ratio (e.g. we could specify annualized measures of risk and return).

# For random portfolios and DEoptim, the leverage constraints should be 
# relaxed slightly.
init.portf$constraints[[1]]$min_sum=0.99
init.portf$constraints[[1]]$max_sum=1.01


# Use DEoptim
maxSR.lo.DE <- optimize.portfolio(R=R, portfolio=init.portf, 
                                  optimize_method="DEoptim",
                                  search_size=2000,
                                  trace=TRUE) 

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

person Zac Garland    schedule 08.06.2018