【问题标题】:Using Covariance matrix for Portfolio Optimization in R在 R 中使用协方差矩阵进行投资组合优化
【发布时间】:2016-04-10 17:40:58
【问题描述】:

我有一个关于 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)

那么,我们实际上在哪里输入协方差矩阵?我所做的正确吗?感谢是否有人可以在这里帮助我。

谢谢!

【问题讨论】:

    标签: r optimization finance portfolio


    【解决方案1】:

    您可以将EuroStockRet 对象作为timeseries 传递给fPortfolio 函数fPortfolio::covEstimator,而不是使用zoo、rugarch、rmgarch 包中的函数来分别创建协方差矩阵(参见?covEstimator)它接受一个timeseries 对象并以feasiblePortfolio 所期望的数据参数格式返回一个对象。比如:

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

    fPortfiolio 还可以通过多种其他方式计算协方差。它们在第 37 页上有详细说明:fPortfolio Package

    【讨论】:

    • 谢谢!我设法通过创建一个函数将协方差矩阵输入到优化代码中。即 covtEstimator
    • 我使用了函数fitted(dcc.focast)。对吗?
    • 我不确定,但请查看fPortfolio 软件包 PDF 的第 19 页。它将targetMean 作为返回的S4 对象的@portfolio 槽中的变量进行讨论。因此,您可以以ewPortfolio@portfolio$targetMean 的身份访问它。但是,您应该确认这就是您要寻找的平均值。
    • 另外值得注意的是,fPortfolio 包和许多其他相关包的制造商有一堆免费的电子书,其中详细解释了如何通过许多示例来完成这类事情。你可以在这里找到它们:rmetrics.org/ebooks-free
    • 该解决方案没有回答 DCC 协方差的使用。 DCC 考虑动态相关性来预测协方差,而 fPortfolio 使用历史相关性。理论上DCC有很多优点。 stats.stackexchange.com/a/173225/77852
    【解决方案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 页 here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-28
      • 1970-01-01
      • 2021-01-11
      • 2018-03-06
      • 2020-10-15
      • 2016-03-12
      • 2021-01-03
      • 1970-01-01
      相关资源
      最近更新 更多