在 R 中使用协方差矩阵进行投资组合优化
Using Covariance matrix for Portfolio Optimization in R
我有一个关于 R 中的投资组合优化的问题。我是 R 的新手,并尝试研究和寻找答案,但我不确定它是否正确。我希望有人能在这里帮助我。
我使用计量经济学模型从资产建模中获得了协方差矩阵(在这里,我使用 DCC GARCH 对我的资产建模 returns)。进行预测后,我将获得协方差矩阵。那么,现在,我如何使用这个协方差矩阵来使用 fPortfolio 包进行投资组合优化?我发现的大多数示例仅使用资产 returns 来进行投资组合优化。但是,如果我们使用资产的预测均值和方差-协方差 returns 来创建最佳资产配置模型呢?
我有以下可重现的代码。
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)
那么,我们实际上在哪里输入协方差矩阵呢?我做的对吗?如果有人能在这里帮助我,我将不胜感激。
谢谢!
与其使用 zoo、rugarch、rmgarch 包中的函数单独创建协方差矩阵,不如将 EuroStockRet
对象作为 timeseries
传递给 fPortfolio
函数 fPortfolio::covEstimator
(参见 ?covEstimator
),它接受一个 timeseries
对象和 returns 一个对象,该对象采用 feasiblePortfolio
期望的数据参数格式。类似于:
EuStockRet_with_cov <- covEstimator(x=EuStockRet);
ewPortfolio <- feasiblePortfolio(data = EuStockRet_with_cov, spec = ewSpec, constraints = "LongOnly");
fPortfiolio
还有其他各种方法可以计算协方差。它们在第 37 页有详细说明:fPortfolio Package
您可以使用 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
我有一个关于 R 中的投资组合优化的问题。我是 R 的新手,并尝试研究和寻找答案,但我不确定它是否正确。我希望有人能在这里帮助我。
我使用计量经济学模型从资产建模中获得了协方差矩阵(在这里,我使用 DCC GARCH 对我的资产建模 returns)。进行预测后,我将获得协方差矩阵。那么,现在,我如何使用这个协方差矩阵来使用 fPortfolio 包进行投资组合优化?我发现的大多数示例仅使用资产 returns 来进行投资组合优化。但是,如果我们使用资产的预测均值和方差-协方差 returns 来创建最佳资产配置模型呢?
我有以下可重现的代码。
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)
那么,我们实际上在哪里输入协方差矩阵呢?我做的对吗?如果有人能在这里帮助我,我将不胜感激。
谢谢!
与其使用 zoo、rugarch、rmgarch 包中的函数单独创建协方差矩阵,不如将 EuroStockRet
对象作为 timeseries
传递给 fPortfolio
函数 fPortfolio::covEstimator
(参见 ?covEstimator
),它接受一个 timeseries
对象和 returns 一个对象,该对象采用 feasiblePortfolio
期望的数据参数格式。类似于:
EuStockRet_with_cov <- covEstimator(x=EuStockRet);
ewPortfolio <- feasiblePortfolio(data = EuStockRet_with_cov, spec = ewSpec, constraints = "LongOnly");
fPortfiolio
还有其他各种方法可以计算协方差。它们在第 37 页有详细说明:fPortfolio Package
您可以使用 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