【问题标题】:PortfolioAnalytics "dollar_neutral" constraintPortfolioAnalytics“dollar_neutral”约束
【发布时间】:2015-06-02 01:10:21
【问题描述】:

我正在使用 PortfolioAnalytics,并尝试使用 MPO 包中的小型股数据集来比较净多头、净空头和市场中性的投资组合(该数据集与我的问题无关,因为同样的问题我尝试过的所有数据集都存在)。不幸的是,添加“active”或“dollar_neutral”约束会导致所有资产的权重为 0,而不仅仅是权重的总和为 0。我针对我下载的其他几个股票数据篮子运行了这个,并得到了相同的特殊行为。见以下代码:

rm(list=ls())
cat("\014") 
library(mpo)
library(PortfolioAnalytics)
library(ROI)
library(ROI.plugin.quadprog)
library(ROI.plugin.glpk)
data(smallcap.ts)
smlcp <- smallcap.ts[,1:20]

stocks <- colnames(smlcp)

#initialize portfolio
pspec.base <- portfolio.spec(stocks)

#min variance objective fn
pspec.uc <- add.objective(portfolio=pspec.base,type="risk",name="var")

#dollar_neutral constraint, min var portfolio
pspec.neutral <- add.constraint(portfolio=pspec.uc,type="active")

opt.neutral <- optimize.portfolio(smlcp,pspec.neutral,optimize_method="ROI")

运行代码会导致: 选择中性

***********************************
PortfolioAnalytics Optimization
***********************************

Call:
optimize.portfolio(R = smlcp, portfolio = pspec.neutral, optimize_method = "ROI")

Optimal Weights:
MODI  MGF  MEE FCEL  OII  SEB  RML AEOS  BRC  CTC  TNL  IBC  KWD TOPP RARE  HAR  BKE   GG GYMB KRON 
   0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0 

Objective Measure:
StdDev 
     0 

但是,将“活动”约束更改为“long_only”会导致:

Optimal Weights:
  MODI    MGF    MEE   FCEL    OII    SEB    RML   AEOS    BRC    CTC    TNL    IBC    KWD   TOPP   RARE 
0.0000 0.8901 0.0000 0.0001 0.0007 0.0000 0.0437 0.0144 0.0000 0.0000 0.0000 0.0000 0.0035 0.0290 0.0000 
   HAR    BKE     GG   GYMB   KRON 
0.0000 0.0010 0.0083 0.0000 0.0093 

如我们所料。

知道为什么“active”和“dollar_neutral”都不像我使用它们的方式工作吗?

另外,为了获得净空头(净多头),我假设我们需要使用 max_sum=-0.0001(min_sum=0.0001) 和 min_sum=-1(max_sum=1) 的“weight_sum”约束。但是,这样做会导致所有资产的权重为 0。我在这里想念什么?谢谢!

【问题讨论】:

    标签: r


    【解决方案1】:

    我找不到 MPO 包,但由于您认为此结果并非特定于该组资产,因此我使用一组备用股票复制了您的结果。看来optimize.portfolio 的结果,所有权重 = 0.,是正确的。当没有阻止所有权重变为零的约束时(如您的问题中的情况),最小方差为 0。要获得权重的非零结果,您必须包括额外的约束或目标。例如,您可以添加投资组合回报等于目标值的约束。另一种可能性是将最大化回报作为第二个目标。这方面的一个例子如下所示:

      library(quantmod)
      library(PortfolioAnalytics)
    # specify asset tickers  
      stocks <- c("MSFT","AAPL", "AMZN", "YHOO", "XOM", "CVX", "UNH", "NKE")
      prices <- do.call(cbind, 
                        lapply(stocks, function(x) getSymbols(x, from="2010-01-01", auto.assign=FALSE, warnings=FALSE)[,6]))
      colnames(prices) <- stocks
      returns <- diff(prices, arithmetic=FALSE, na.pad=FALSE) - 1
      rm(portf1, portf1_opt)
    # create portfolio object
      portf1 <- portfolio.spec(assets=stocks)
    #    set portfolio objectives as minimizing variance and maximizing return
      portf1 <- add.objective(portfolio=portf1, type="risk", name="var")
      portf1 <- add.objective(portfolio=portf1, type="return", name="mean")
    #    set dollar-neutral or active constraint
      portf1 <- add.constraint(portfolio=portf1, type="active")
      portf1_opt <- optimize.portfolio(R=returns, portfolio=portf1, optimize_method="ROI", trace=TRUE)
      print(portf1_opt)  
    

    给出结果:

    Optimal Weights:
       MSFT    AAPL    AMZN    YHOO     XOM     CVX     UNH     NKE 
    -0.7822  1.1316  0.3834  0.1024 -2.9652 -0.3480  1.6232  0.8548 
    Objective Measure:
        mean 
    0.003131 
       StdDev 
    0.03957 
    

    另外,请注意,rm(list=ls()) 不应包含在示例帖子中,因为这可能会删除用户希望在其环境中保留的对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-12
      • 1970-01-01
      相关资源
      最近更新 更多