R 循环从回归构造协方差矩阵

R 循环从回归构造协方差矩阵,r,loops,regression,covariance,finance,R,Loops,Regression,Covariance,Finance,我正在尝试构造一个协方差矩阵,我认为这必须使用循环来完成 我有一套针对单个指数(DowJones)的30个回归,该指数创建了一个包含截距(alpha)、斜率(beta_I)和残差标准偏差(epsilon)的表。我特别需要构造矩阵σij=βI*βj*σ^2m,其中βI、βj等是本表的斜率,σ^2m是称为dji_var的方差变量。因此,first slope*first slope*dji_var填充协方差矩阵的第一个元素 有没有人能帮我轻松完成这个任务?我的协方差矩阵的维数应该是30x30 多谢各

我正在尝试构造一个协方差矩阵,我认为这必须使用循环来完成

我有一套针对单个指数(DowJones)的30个回归,该指数创建了一个包含截距(alpha)、斜率(beta_I)和残差标准偏差(epsilon)的表。我特别需要构造矩阵
σij=βI*βj*σ^2m
,其中
βI、βj等
是本表的斜率,
σ^2m
是称为
dji_var
的方差变量。因此,
first slope*first slope*dji_var
填充协方差矩阵的第一个元素

有没有人能帮我轻松完成这个任务?我的协方差矩阵的维数应该是30x30

多谢各位

这就是我到目前为止所做的:

############# Regressing each company’s returns onto the index return #########
#lm(AAPL~DJI), lm(AXP~DJI), lm(BA~DJI), lm(CAT~DJI), lm(CSCO~DJI), lm(CVX~DJI), lm(DD~DJI), lm(DIS~DJI),
#lm(GE~DJI),lm(GS~DJI),lm(HD~DJI),lm(IBM~DJI),lm(INTC~DJI), lm(JNJ~DJI), lm(JPM~DJI), lm(KO~DJI),   
#lm(MCD~DJI), lm(MMM~DJI), lm(MRK~DJI), lm(MSFT~DJI), lm(NKE~DJI), lm(PFE~DJI), lm(PG~DJI), lm(TRV~DJI),
#lm(UNH~DJI),lm(UTX~DJI),lm(V~DJI),lm(VZ~DJI),lm(WMT~DJI), lm(XOM~DJI)

resultdf <- data.frame(matrix(NA,0,4), stringsAsFactors = FALSE)
names(resultdf) <- c("Asset", "Intercept", "Slope", "Std_of_Residuals")
i <-1
for (i in 1:30){
  regression_company_dji <- lm(timeseriesreturns[,i] ~ dji[,1])
  resultdf <- rbind(resultdf, data.frame(Asset= i,
                                         Intercept = regression_company_dji$coefficients[[1]],
                                         Slope= regression_company_dji$coefficients[[2]],
                                         Std_of_Residuals = sd(resid(regression_company_dji)) 
  ))
  #i <- i +1    #DO WE REALLY NEED THIS LINE
}
#prints a table of intercepts, slopes (βi), and idiosyncratic standard deviations σRi (standard deviation of the residuals) 
head(resultdf)
# Asset   Intercept     Slope Std_of_Residuals
#1     1  0.02676350 1.1387824        1.2474725
#2     2 -0.07187497 0.8535259        1.1008612
#3     3  0.06966935 1.0196946        0.9490182
#4     4 -0.12898852 1.0635297        1.2044883
#5     5  0.07498498 1.0600683        0.9935900
#6     6 -0.10309059 1.1483061        1.2779884

#ASSET 1 STARTS WITH AAPL, THEN GOES AXP, BA, CAT, ETC.
#WE HAVE A TABLE OF INTERCEPTS, SLOPES AND STANDARD DEVIATIONS OF RESIDUALS FOR EACH REGRESSION BETWEEN COMPANY RETURNS AND INDEX RETURN

############## Variance of DowJones Index return ######################
dji_var <- var(dji[,1])
#0.8873133
  
######### SINGLE INDEX APPROXIMATION #################################
# In Single-Index Model:
# Intercept = alpha_i
# Slope = beta_i
# Std_of_Residuals = sigma_Ri

# This equation is referred to as the single-index model,
#                   rit = αi + βirmt + εit                                            (8.1)
# αi and βi are the intercept and slope coefficients that result from:
# regressing the rate of return from asset i in period t, denoted rit, onto 
# the simultaneous rate of return on some market index in period t, denoted rmt; and 
# εit is the unexplained residual error term for asset i in period t. 
#########################################################################################
#the Covariance Matrix between two different securities i and j can be expressed as:
# σij = βi* βj* σ^2m.

sigma_squared_market <- dji_var
# [1] 0.8873133

dput(resultdf)

structure(list(Asset = 1:30, Intercept = c(0.0267635033349584, 
-0.0718749662550324, 0.069669346056576, -0.128988516445594, 0.0749849799579864, 
-0.103090590571032, -0.0181204083787094, 0.0940216340701365, 
0.0601045129621876, -0.00712297315161099, 0.100323562649478, 
-0.0517406457596374, 0.012599051698687, -0.0218711039493553, 
0.0263255529821284, 0.0197321609378249, 0.08018398886968, 0.0115659025410572, 
-0.0207922446090187, 0.0629952677099163, 0.137484116508374, 0.0620066345319251, 
-0.0416494718503931, 0.0482722555478251, 0.0886134357472885, 
-0.0240313203975499, 0.142979385201501, -0.0193601624887868, 
-0.107001092634366, -0.0592959645858059), Slope = c(1.13878236093664, 
0.853525869839225, 1.01969460976746, 1.06352969847768, 1.06006825519905, 
1.14830613937928, 1.02057992982579, 0.917124514708528, 1.06521921561495, 
1.16527602124266, 1.01554236848894, 1.05028610720528, 0.99954945490449, 
0.854040163442602, 1.20416480868948, 0.662824098888303, 0.930011492883117, 
0.963949283094558, 0.953009111832057, 1.24362084628936, 0.982034757703831, 
0.885675351438922, 0.766292851924153, 0.873619973887616, 1.03103698221555, 
0.977088962832525, 1.11842324882864, 0.748745167476966, 0.77506736508709, 
1.05126852549869), Std_of_Residuals = c(1.24747249150145, 1.10086122769927, 
0.949018244224872, 1.20448829818015, 0.99358998832754, 1.2779884149182, 
1.13129109038816, 1.03393869712944, 0.999480572360969, 0.690970159142872, 
0.783262244296981, 0.868512560468288, 1.28324642163822, 0.656011164082018, 
0.717972392581603, 0.6617871220526, 0.901244987788103, 0.60700558064988, 
1.02292450298541, 1.34320098732505, 0.961307330185487, 0.815493628199713, 
0.650600876764784, 0.655802004867679, 1.1807969036117, 0.835687577257354, 
1.02888260605468, 0.721618425329537, 1.08066991592903, 0.955080491660557
)), row.names = c(NA, -30L), class = "data.frame")

将每家公司的收益回归到指数收益######### #lm(AAPL~DJI)、lm(AXP~DJI)、lm(BA~DJI)、lm(CAT~DJI)、lm(CSCO~DJI)、lm(CVX~DJI)、lm(DD~DJI)、lm(DIS~DJI), #lm(GE~DJI)、lm(GS~DJI)、lm(HD~DJI)、lm(IBM~DJI)、lm(INTC~DJI)、lm(JNJ~DJI)、lm(JPM~DJI)、lm(KO~DJI), #lm(MCD~DJI)、lm(MMM~DJI)、lm(MRK~DJI)、lm(MSFT~DJI)、lm(NKE~DJI)、lm(PFE~DJI)、lm(PG~DJI)、lm(TRV~DJI), #lm(UNH~DJI)、lm(UTX~DJI)、lm(V~DJI)、lm(VZ~DJI)、lm(WMT~DJI)、lm(XOM~DJI)
resultdf我们可以得到向量的外积
resultdf$Slope
,其中

数组X和Y的外积是维数为c(dim(X),dim(Y))的数组A,其中元素A[c(arrayindex.X,arrayindex.Y)]=FUN(X[arrayindex.X],Y[arrayindex.Y],…)

(从
帮助(“外部”)
)。在这里,我们特别感兴趣的是
FUN
的乘法函数,但您可能会注意到,R命令
outer()
也可以处理其他函数,以供将来参考。然后我们只需要将每个元素乘以
dji\u var
。完整的解决方案是


covmat Help-us帮助您:请将您的问题粘贴到R命令的输出
dput(resultdf)
。然后,我们可以在自己的R会话中轻松处理您的数据。我有一个解决方案,但为了完整性,我想测试它first@duckmayr您好,谢谢您的回复!我添加了您所说的命令和输出。如果您愿意,我还可以包括
resultdf
的完整表格!这真是一个令人惊奇的方法。我没想到在一条线上就能做到。我试图写一个for循环来遍历每个斜率,并以此方式构造协方差矩阵。这太棒了。非常感谢你!不用担心@eruiz,很高兴它起了作用!在BaseR中有很多类似的函数,它们非常有用,但也很容易被忽略,在
tidyverse
时代,它们没有被教得那么多。我的协方差的对角线需要修改,以包括一个噪声项,它是
+(std_of_Residuals)^2
。因此,当beta_i*beta_i是协方差矩阵中的第一个元素时,我还需要将第一行的残差的方差相加。但是既然我已经有了我的std,我怎么能只在对角线上加一个平方项呢?@eruiz请看我答案的更新:你可以只加一个通过
diag()创建的对角线矩阵。
谢谢你的澄清,我不确定对角线的加法是限于一个标量值还是一个常量。你太好了