首页 > 解决方案 > R for 循环以获得最佳投资组合权重(使用 glasso 估计)

问题描述

library(glasso)
library("readxl")
library(tidyverse)

data1 <- read_xlsx("Dataset1")

dataframe1 <- as.data.frame(data1)
df1 <- subset(dataframe1, select = -c(1) )

df1 = as.data.frame(sapply(df1,as.numeric))

wts_matrix <- matrix(NA, nrow=330, ncol=100)

for(i in 1:330) {
returndata1 <- df1[(120 + i:239 + i),]
samplecov <- cov(returndata1)
glassoresult <- glasso(s = samplecov, rho=1.7)

ones <- replicate(100,1)

firstpartwts_gmv <- 1/(t(ones)%*%glassoresult$wi%*%ones)
firstpartwts_gmv <- as.numeric(firstpartwts_gmv)

lastpartwts_gmv <- glassoresult$wi%*%ones
lastpartwts_gmv <- as.numeric(lastpartwts_gmv)

wts_gmv <- firstpartwts_gmv*lastpartwts_gmv

wts_gmv <- as.vector(wts_gmv)

wts_matrix[i,] <- wts_gmv

}

亲爱的用户,

对于一个研究项目,我需要获得全局最小方差 (gmv) 投资组合的最佳权重,其中逆协方差矩阵是使用 glasso 包估计的。要估计逆 cov 矩阵的 glasso 估计量,我首先需要使用 T = 120 月收​​益来获得样本协方差矩阵。然后将此样本协方差矩阵用作 glasso 函数中的参数,如我的代码 (s=samplecov) 中所示。rho 是一个正则化参数。整个想法是使用 120 个月的回报,直到 T = t,获得一个 glasso 估计量,并在 gmv 公式​​中使用这个估计量来获得 T = t+1 的权重。测试期总共包括 330 个期。df1 包含所有返回值,所需的第一个返回值是从第 121 行到第 240 行。所以我尝试创建一个 for 循环,其中 i 从 1 到 330,

第一个错误是我的 wts_matrix 只填充到第 220 行(应该到 330)。我也有一个错误:glasso 中的错误(s = samplecov,rho = 1.7):外部函数调用中的 NA/NaN/Inf(参数 2)。

第二个错误是权重本身。如果我不使用 for 循环并且只计算第一个时期 t+1 的权重,就像在底层代码中一样,那么权重似乎是准确的。但是如果我使用for循环和权重矩阵,第一行权重已经不一样了。

firstdata <- df1[(121:240),]
covar <- cov(firstdata)
glasso1 <- glasso(s=covar, rho=1.7)

onevector <- replicate(100,1)
firstwts_gmv <- 1/(t(onevector)%*%glasso1$wi%*%onevector)
firstwts_gmv <- as.numeric(firstwts_gmv)

lastwts_gmv <- glasso1$wi%*%onevector
lastwts_gmv <- as.numeric(lastwts_gmv)

weights_gmv <- firstwts_gmv*lastwts_gmv

我真的不知道我在这里做错了什么,而且我对 R 没有太多经验。错误似乎存在于 for 循环或矩阵中。希望有人可以帮助我,我将不胜感激!

祝你今天过得愉快。

忠实于你的

标签: rfinancequantitative-financeportfolio

解决方案


推荐阅读