在R中使用协方差矩阵进行投资组合优化

5
我有一个关于 R 里的组合优化问题。我对 R 很陌生,虽然我已经尝试学习和寻找答案,但是我不确定是否正确。希望有人能在这里为我提供帮助。
我使用计量模型(这里我使用 DCC GARCH 模型来对我的资产收益率进行建模)获得了资产建模的协方差矩阵。在进行预测后,我将得到协方差矩阵。那么,如何使用 fPortfolio 软件包中的协方差矩阵进行投资组合优化呢?我发现大多数示例都只使用资产收益率来进行组合优化。如果我们使用预测的资产收益率的平均值和方差-协方差来创建最佳资产配置模型,该怎么办呢?
以下是我可复制的代码。
library(zoo)
library(rugarch)
library(rmgarch)
data("EuStockMarkets")
EuStockLevel <- as.zoo(EuStockMarkets)[,c("DAX","CAC","FTSE")]
EuStockRet <- diff(log(EuStockLevel))

## GARCH-DCC
    uspec = ugarchspec(mean.model = list(armaOrder = c(0,0)), variance.model = list(garchOrder = c(1,1), model = "sGARCH"), distribution.model = "norm")
    spec1 = dccspec(uspec = multispec( replicate(3, uspec) ),  dccOrder = c(1,1),  distribution = "mvnorm")
    fit1 = dccfit(spec1, data = EuStockRet, fit.control = list(eval.se=T))

#Forecasting 
    dcc.focast=dccforecast(fit1, n.ahead = 1, n.roll = 0)
    print(dcc.focast)


    covmat.focast = rcov(dcc.focast)
    covmat = covmat.focast$`1975-02-03`[,,1]  ##The Covariance matrix

          DAX          CAC         FTSE
DAX  0.0002332114 0.0001624446 0.0001321865
CAC  0.0001624446 0.0001799988 0.0001139339
FTSE 0.0001321865 0.0001139339 0.0001372812

现在我想将获得的协方差应用于投资组合优化。

##Optimization (Use the forecasted variance covariance matrix!!!)
##You must convert your dataset into "timeSeries" object for R to be able to read it in fportfolio. 

library(fPortfolio)
##To compute efficient portfolio
    All.Data <- as.timeSeries(100* EuStockRet) 

##Equal weight portfolio
    ewPortfolio <- feasiblePortfolio(data = All.Data,spec = ewSpec,constraints = "LongOnly")  
    print(ewPortfolio)

##Minimum risk efficient portfolio
    minriskSpec <- portfolioSpec()
    targetReturn <- getTargetReturn(ewPortfolio@portfolio)["mean"]
    setTargetReturn(minriskSpec) <- targetReturn

#Now, we optimize the portfolio for the specified target return :-
    minriskPortfolio <- efficientPortfolio(data = All.Data,spec = minriskSpec,constraints = "LongOnly")
    print(minriskPortfolio)

那么,我们实际上在哪里输入协方差矩阵?我所做的是否正确?如果有人能在这里协助我,将不胜感激。

谢谢!

2个回答

2
您可以使用SetEstimator在fPortfolio软件包中实现此目标。以下是示例:
covtEstimator <- function (x,data,spec) {
x.mat = as.matrix(x)
list(mu=meanreturnfromyourforecast,Sigma=covmat)
}

# Calculate Efficient Frontier
defaultSpec <- portfolioSpec()
setEstimator(defaultSpec) <- 'covtEstimator'
efficientPortfolio(yourreturndata, defaultSpec, constraints = "LongOnly")

附加参考资料:第293页在此处


2

如果你不想使用包zoo、rugarch、rmgarch中的函数来单独创建协方差矩阵,你可以将你的 EuroStockRet 对象作为 fPortfolio 函数的 timeseries 参数传递给 fPortfolio::covEstimator(参见?covEstimator),该函数接受一个 timeseries 对象并返回一个数据参数格式,该格式符合 feasiblePortfolio 的要求。类似这样:

EuStockRet_with_cov <- covEstimator(x=EuStockRet);
ewPortfolio <- feasiblePortfolio(data = EuStockRet_with_cov, spec = ewSpec, constraints = "LongOnly");

此外,fPortfiolio 还有其他多种计算协方差的方式。详见第37页:fPortfolio Package


1
谢谢!我已经通过创建一个函数将协方差矩阵输入到优化代码中进行了处理。例如: covtEstimator <- function (x, spec = NULL, ...) {x.mat = as.matrix(x) list(mu = er, Sigma = covmat) } 。另外,顺便问一下,我们如何从拟合模型中预测均值? - NSAA
我使用了函数fitted(dcc.forecast),这样做对吗? - NSAA
我不确定,但请查看fPortfolio包PDF的第19页。它讨论了targetMean作为返回的S4对象的@portfolio插槽中的变量。因此,您可以尝试将其作为ewPortfolio@portfolio$targetMean进行访问。但是,您应该验证这是否是您要查找的平均值。 - Mekki MacAulay
1
值得注意的是,fPortfolio包的开发者以及许多其他相关包的开发者都有许多免费的电子书,其中详细解释了如何通过许多示例来处理此类问题。您可以在此处找到它们:https://www.rmetrics.org/ebooks-free - Mekki MacAulay
那个解决方案并没有回答如何使用DCC协方差。虽然DCC考虑了动态相关性来预测协方差,但fPortfolio使用的是历史相关性。从理论上讲,DCC有很多优势。http://stats.stackexchange.com/a/173225/77852 - Robert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接