2015-05-29 43 views
0

我正在使用PortfolioAnalytics,並試圖比較使用MPO軟件包中的小盤數據集進行淨多頭,淨多頭和市場中性的投資組合(該數據集與我的問題無關,因爲我試過的所有數據集都存在同樣的問題)。不幸的是,增加「主動」或「美元中性」約束會導致所有資產的權重爲0,而不僅僅是權重的總和爲0.我將其與我下載的其他幾個庫存數據庫進行比較,並得到相同的特殊行爲。請參見下面的代碼:PortfolioAnalytics「dollar_neutral」約束

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") 

中運行代碼的結果: opt.neutral

*********************************** 
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 

就像我們所期望的那樣

任何想法爲什麼「主動」和「dollar_neutral」都不能像我使用它們那樣工作?我想我們需要使用max_sum = -0.0001(min_sum = 0.0001)和min_sum = -1(max_sum = 1)的「weight_sum」約束條件。但是,這樣做會導致所有資產的權重爲0。我在這裏錯過了什麼?謝謝!

回答

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())不應被包括在樣品後,因爲這可能會刪除對象,其中用戶希望保留在他們的環境中。