Добавление результатов ограничения кредитного плеча в оптимизацию пустого портфеля R - PullRequest
0 голосов
/ 28 сентября 2019

Я использую пакет PortfolioAnalytics для оптимизации портфеля.Это отличный пакет, но у меня сейчас проблема.Приведенный ниже портфель представляет собой длинный-короткий портфель, в котором весовые коэффициенты должны составлять около 0. Что происходит, портфель будет длинным, 100% собственного капитала и затем коротким 100% собственного капитала.В реальном мире это заставило бы меня увеличить свой первоначальный капитал в 2 раза.В этом случае я хотел бы, чтобы портфель имел длинную 50% чистой ликвидности и короткую 50% чистой ликвидности.В результате мое кредитное плечо останется равным 0. Я попытался добавить ограничение кредитного плеча, что приведет к 0 транзакциям.Как только вы закомментируете ограничение левереджа, код работает нормально.

Ниже приведен 100% воспроизводимый код.Что я здесь не так делаю?Спасибо.

library(PortfolioAnalytics)
library(corpcor)
library(quantmod)
library(PerformanceAnalytics)
library(ROI)
require(ROI.plugin.quadprog)
require(ROI.plugin.glpk)

hub = new.env()
getSymbols(c("SPY", "GLD", "TLT", "EEM", "USO", "MNA", "QQQ", "XLF", "IBB"), env = hub)
df.Price = lapply(hub, function(x){a = ROC(Ad(x));return(a)})
df = do.call(cbind, df.Price)
df = na.omit(df)

getSymbols("SPY")
rets = ROC(SPY$SPY.Adjusted)
rets = na.omit(rets)

portf.dn = NULL
portf.dn = portfolio.spec(colnames(df))

portf.dn= add.constraint(portf.dn, type = "weight_sum", min_sum = -.01,max_sum = .01)

#This is leverage constraint. Comment it out for actuall transactions
portf.dn = add.constraint(portf.dn, type = "leverage_exposure", leverage = 1)

portf.dn = add.constraint(portf.dn,type = 'box', min = -.3, max = .3)

portf.dn = add.constraint(portf.dn, type = "position_limit", max_pos = 8)

betas = t(CAPM.beta(df, rets, .00))

portf.dn = add.constraint(portf.dn, type = "factor_exposure", B = betas, lower = -.25, upper = .25)

portf.dn.StdDev = add.objective(portf.dn, type = "return", name = "mean")

portf.dn.StdDev = add.objective(portf.dn.StdDev, type = "risk", name = "StdDev")

opt.dn = optimize.portfolio(df, portf.dn.StdDev, optimize_method = "ROI", trace = TRUE)

opt.dn
#the output currently looks like this.
PortfolioAnalytics Optimization
***********************************

Call:
optimize.portfolio(R = df, portfolio = portf.dn.StdDev, optimize_method = "ROI", 
    trace = TRUE)

Optimal Weights:
MNA.Adjusted GLD.Adjusted IBB.Adjusted XLF.Adjusted TLT.Adjusted QQQ.Adjusted EEM.Adjusted 
           0            0            0            0            0            0            0 
USO.Adjusted SPY.Adjusted 
           0            0 

Objective Measure:
mean 
   0 


StdDev 
     0 
...