【发布时间】:2019-04-12 07:31:45
【问题描述】:
我想在 R 中的PortfolioAnalytics 包中优化包含 7 个资产和 209 个数字返回的数据集。我想设置一个单独的目标函数,如下所示:
f(u)= max! (rp-rb)-ETL(p,95%)
其中rp 表示投资组合回报,rb 表示基准回报(209x1 矩阵),ETL(p,95%) 表示在 95% 置信水平上的预期尾部损失。
以下代码的错误如下:
objective name OF generated an error or warning: Error in checkData(weights, method = "xts") : The data cannot be converted into a time series. If you are trying to pass in names from a data object with one column, you should use the form 'data[rows, columns, drop = FALSE]'. Rownames should have standard date formats, such as '1985-03-15'. Error in apply(i, 1, fn, ...) : task 1 failed - "non-numeric argument to binary operator" Optimizer was unable to find a solution for target.
对于最底部的代码,R 是回报矩阵(209x7),BM_r 是基准回报(209x1 矩阵)。
我已经尝试过使用不同的求解器,但是对于这个目标函数,DEoptim 算法必须有效。
此外,似乎来自PerformanceAnalytics 的ETL 函数需要timeSeries 对象,而DEoptim 求解器需要as.numeric 格式。
使用的包如下:
library("PerformanceAnalytics")
library("PortfolioAnalytics")
library("timeSeries")
library("fPortfolio")
library("ggplot2")
library("xts")
library("Quandl")
library("fImport")
library("fBasics")
library("zoo")
library("quadprog")
library("foreach")
library("iterators")
library("DEoptim")
library("pso")
library("GenSA")
library("quantmod")
library("ROI")
library("fGarch")
library("Rglpk")
library("ROI.plugin.glpk")
library("ROI.plugin.quadprog")
library("ROI.plugin.symphony")
library("corpcor")
library("testthat")
library("nloptr")
library("MASS")
library("robustbase")
library("vars")
library("tsDyn")
library("cluster")
library("mvoutlier")
library("pastecs")
library("plyr")
library("itsmr")
这里是代码:
OF <- function(R, weights){
weights <- matrix(weights, ncol=1)
BM_r1<-BM_r
PFretu<-Return.portfolio(R=R,weights = weights)
Excess<-as.numeric(PFretu-BM_r1)
CV<-ETL(R,p=0.95,method = "gaussian", weights=weights)
Outp<-as.numeric(Excess-CV)
Outp
}
R <- Data
fund <- colnames(R)
PMFpf<-portfolio.spec(assets=fund)
PMFpf<-add.constraint (portfolio=PMFpf,type="weight_sum",
min_sum=0.99,max_sum=1.01)
PMFpf<-add.constraint(PMFpf, type="box",min=c(0, 0, 0, 0, 0, 0, 0),
max=c(0.25, 0.25, 0.99,0.99,0.2,0.1,0.1))
sample_moments <- set.portfolio.moments(R, portfolio = PMFpf)
PMFpf <- add.objective(portfolio=PMFpf, type="return", name="OF")
.storage <<- new.env()
opt.PMFpf<-optimize.portfolio(R, portfolio=PMFpf,
optimize_method="DEoptim",momentargs=sample_moments,
momentargs=sample_moments,trace=TRUE)
【问题讨论】:
标签: r optimization