2

我正在研究如何以最高性能/最快的方式在 R 中实现修改后的夏普比率优化。

我为这个问题定义的修正夏普比率 (MSR) 是

MSR = r/(sd^f)

(其中 r 是特定资产的回报率,sd 是特定资产回报率的标准差,f 是标量,是波动率因子或波动率衰减器)。

我可以看到 PortfolioAnalytics 在 add.objective 函数中有一个参数 risk_aversion 似乎做了我想要的相同/相似的事情(对于 f=0,算法将选择具有最高回报的组合,而不管波动性如何,对于 f=1 它将选择最大化经典夏普比率的组合,对于 f > 1,算法将选择低波动性组合,极端情况是均值方差组合)。

这正是我从这里看到的参数 risk_aversion 正在做的事情https://github.com/R-Finance/PortfolioAnalytics/blob/master/demo/demo_max_quadratic_utility.R

我可以使用 PortfolioAnalytics 使用随机投资组合方法或 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")
4

0 回答 0