Какой самый быстрый способ решить проблему оптимизации портфеля в R? - PullRequest
2 голосов
/ 23 января 2020

Я смотрю, как наиболее эффективно / быстро реализовать оптимизацию модифицированного отношения Шарпа в R.

Модифицированное соотношение Шарпа (MSR), как я его определяю для этой проблемы:

MSR = r/(sd^f)

(где r - доходность конкретного актива, sd - стандартное отклонение доходности конкретных активов, а f - скалярное значение - коэффициент волатильности или ослабитель волатильности).

Я вижу, что у PortfolioAnalytics есть аргумент risk_aversion в функции add.objective, которая, кажется, делает то же самое / похожее, что и я (для f = 0 алгоритм выберет композицию с наибольшей доходностью независимо от волатильности, для f = 1 он выберет композицию, которая максимизирует класс c Коэффициент Шарпа, а для f> 1 алгоритм выберет композицию с низкой волатильностью, а крайний случай - это портфель средней дисперсии.

Это именно то, что, как я вижу, параметр risk_aversion делает здесь https://github.com/R-Finance/PortfolioAnalytics/blob/master/demo/demo_max_quadratic_utility.R

Я могу решить эту проблему оптимизации, используя PortfolioAn Alytics, используя случайный портфель ios подход или DEoptim (см. код ниже), однако, возможно, есть самое быстрое (и точное) решение, возможное с использованием ROI.

if (!require("PortfolioAnalytics")) {
    install.packages("PortfolioAnalytics", dependencies=TRUE)
}

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

modifiedStdDev<-function(R, f, ...,
        clean=c("none","boudt","geltner"), portfolio_method=c("single","component"), weights=NULL, mu=NULL, sigma=NULL, use="everything", method=c("pearson", "kendall", "spearman")) {
    modStdDev <- StdDev(R, ..., clean=clean, portfolio_method=portfolio_method, weights=weights, mu=mu, sigma=sigma, use=use, method=method)^f

    return(modStdDev)
}

# Construct initial portfolio with basic constraints.
init.portf.MaxModifiedSharpe <- portfolio.spec(assets=funds)
init.portf.MaxModifiedSharpe <- add.constraint(portfolio=init.portf.MaxModifiedSharpe, type="long_only", enabled=TRUE)
init.portf.MaxModifiedSharpe <- add.constraint(portfolio=init.portf.MaxModifiedSharpe, type="weight_sum", min_sum=0.99, max_sum=1.01, enabled=TRUE)
init.portf.MaxModifiedSharpe <- add.objective(portfolio=init.portf.MaxModifiedSharpe, type="return", name="mean", enabled=TRUE, multiplier=-1)
init.portf.MaxModifiedSharpe <- add.objective(portfolio=init.portf.MaxModifiedSharpe, type="risk", name="modifiedStdDev", enabled=TRUE, multiplier=1, arguments=list(f=1.0))

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

maxModifiedSR.lo.DEoptim

chart.RiskReward(maxModifiedSR.lo.DEoptim, risk.col="modifiedStdDev", return.col="mean")

# Use random portfolios to run the optimization.
maxModifiedSR.lo.RP <- optimize.portfolio(R=R, 
        portfolio=init.portf.MaxModifiedSharpe, 
        optimize_method="random",
        search_size=2000,
        trace=TRUE)

maxModifiedSR.lo.RP

chart.RiskReward(maxModifiedSR.lo.RP, risk.col="modifiedStdDev", return.col="mean")
...