【问题标题】:How to optimize portfolios in the PortfolioAnalytics environment with an individual objective function?如何使用单独的目标函数在 PortfolioAnalytics 环境中优化投资组合?
【发布时间】: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 算法必须有效。 此外,似乎来自PerformanceAnalyticsETL 函数需要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


    【解决方案1】:

    当并行计算核心(来自 foreach)仍然注册时,就会发生这种情况。 DEoptim 的底层 c 文件无法并行处理接收命令。 如果您取消注册这些内核,我猜您的代码将运行良好。 使用例如在调用 optimize.portfolio 之前这样的函数:

    unregister <- function() {
      env <- foreach:::.foreachGlobals
      rm(list=ls(name=env), pos=env)
    }
    unregister()
    

    【讨论】:

      猜你喜欢
      • 2018-07-09
      • 2018-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-06
      • 2020-10-15
      • 2022-11-18
      • 1970-01-01
      相关资源
      最近更新 更多